Tableau dans url (select multiple), vs Pagination

Résolu/Fermé
Sunseeker - Modifié par Sunseeker le 3/07/2014 à 14:46
 Sunseeker - 4 juil. 2014 à 14:42
Bonjour,

Me voila depuis plusieurs jours avec le même problème et des centaines de tests réalisés sur la récupération des valeurs d'un tableau lors de la pagination des résultats.

Voila comment ça se présente :


   include('mysql_connect.php');
   $set  =mysql_query("SET NAMES 'utf8'");
   $ville_query= "SELECT DISTINCT v.ville_id, vi.ville_nom FROM marimmo_ventes v 
                   JOIN marimmo_villes vi ON vi.ville_id = v.ville_id
      ORDER BY vi.ville_nom ASC" ;
   $ville_req = mysql_query($ville_query) or die(mysql_error());
  
  $town = isset($_GET['ville']) ? $_GET['ville'] : array() ;
  $selected = 'selected="selected"';

 while ($city = mysql_fetch_assoc($ville_req))
          { $ville_id = $city['ville_id'];
      $ville_nom = $city['ville_nom'];
  ?> 
 <option value=" <?php echo $ville_id; ?>" <?php if(in_array($ville_id,$town)) echo $selected; ?> ><?php echo $ville_nom; ?></option>
   
     <?php  }?>
    </select>



<?php // traitement

if (empty($_GET['ville']))
   {  
       $e_ville = 'Le champ "Ville" est requis' ;
   }
   else 
   {     
   $town=array_map('mysql_real_escape_string',$town);       
   $town= implode(',',$town);

       // puis requêtes SQL :
          1. qui compte  le nombre de résultats correspondant à ma recherche, pour pagination
          2. qui affiche la liste des résultats correspondant.

      // puis 
      
        $suivant = $current_page+1;
        $precedent = $current_page-1; 
     
        if ($nb_pages > 1  ) 
   { 
                if ($suivant <= $nb_pages)
     { ?> <a class='numero_page' 
 href='Untitled-1.php?<?php foreach($_GET['ville'] as $k =>$ville_id) {echo $string="ville='$ville_id'&";  } ?>nb_results=$nb_results_a_afficher&page=$suivant'>Suivante </
      <?php  } 
   else {?> <a class='no_link'>Suivante</a>
     <?php  } 

        }


Mon foreach dans le lien vers page suivante, n'affiche rien dans l'url une fois le lien "Suivante" cliqué, mis à part "test.php?ville= ",
alors que si je mets ce foreach hors de mon link pour vérification, print_r($string); me renvoit comme convenu : "ville=' 5'&ville=' 27'&ville='70'&"

et j'ai l'erreur suivante, toujours après avoir cliqué sur le lien, vis-à-vis de mon select $_GET['ville'] : Warning: in_array expects param 2 to be array, à la ligne correspondant à :
<option value=" <?php echo $ville_id; ?>" <?php if (in_array($ville_id,$town)) echo $selected; ?> ><?php echo $ville_nom; ?></option>

Je ne sais pas comment procéder, merci 1000 fois si vous pouvez m'éclairer.
A voir également:

16 réponses

Utilisateur anonyme
3 juil. 2014 à 15:10
Bonjour

Je ne sais pas d'où tu sors la variable $string dont tu fais un print_r, mais elle ne correspond clairement pas à ce qu'il faut dans une url pour avoir un tableau de ville
Pour avoir un tableau, il faudrait avoir
"ville[]=5&ville[]=27&ville[]=70" 

Des crochets après le mot ville, et pas d'apostrophes autour des valeurs, sinon ces apostrophes feront partie de la valeur.

Si tu avais vérifié la valeur de $town, tu aurais certainement trouvé '70' dedans, et non pas un tableau de valeurs.
0
Bonjour,


Merci pour ta réponse.

$string => foreach($_GET['ville'] as $k =>$ville_id) { $string="ville='$ville_id'&"; echo $string; // ok j'enlève ce $string qui ne sert pas à grand chose, j'en conviens.

print_r($town) : Array ( [0] => 8 [1] => 17 [2] => 19 [3] => 22 [4] => 26 [5] => 32 )


Merci beaucoup pour ton précieux conseil.

Untitled-1.php?<?php foreach($_GET['ville'] as $k =>$ville_id) { echo "ville[]=$ville_id&"; } ?>

A présent, tout passe dans l'url. C'est déjà une grande avancée.
Mais ma page suivante est blanche, malgré le passage du tableau dans l'url...

Ok, je cherche du côté de la concat dans l'url. Et je reviens.
Merci beaucoup beaucoup pour ta réponse.
0
Voici ce qui est transmis dans l'url avec le code ci-dessous :
EDITE à 17:05

Untitled-1.php?ville[]=%208&ville[]=%2017&ville[]=%2019&ville[]=%2022&ville[]=%2026&ville[]=%2032&pieces[]=1&pieces[]=2&pieces[]=3&pieces[]=4&pieces[]=5&pieces[]=6&pieces[]=7&page=2


<code>
if ($suivant <= $nb_pages)
     {?> <a class='numero_page' href="Untitled-1.php?<?php foreach($_GET['ville'] as $k =>$ville) { echo "ville[]=$ville&"; } ?><?php foreach($_GET['pieces'] as $r =>$pieces) {echo "pieces[]=$pieces&";} ?>page=<?php echo $suivant; ?>">Suivante </a>
     <?php  } 
      else {?> <a class='no_link'>Suivante</a>
    <?php  }      



Mes "Page suivante" sont vides. Saurais-tu pourquoi ?
Soit dans ma page de test raccourcie aux points qui me posent problème) : 1 form qui contient 2 select multiples : $_GET['pieces'] et $_GET['ville'], + un bouton submit.

Merci ++ d'avance, (je me donne beaucoup de mal pour terminer cette page, c'est rien de le dire!)
0
Utilisateur anonyme
3 juil. 2014 à 17:17
Tous ces %20 qui se promènent sont des espaces. Comme il n'y en a pas entre le = et $ville dans ton code, c'est que ces espaces étaient déjà présentes dans la donnée d'entrée, c'est à dire $_GET['ville'], c'est à dire encore une url. Mais au départ, qui a mis ces identifiants dans ton url ?
On verra plus tard pour les autres points
0
D'accord pour les espaces. Le fait que tu me le dises, me fait penser à trim. Je vais chercher de ce côté là. Ah mais ne sont-ils pas dus à $rooms=array_map('mysql_real_escape_string',$rooms); ? Oh je ne sais pas, je ne sais plus, je n'ai jamais su ! ye suis perdue!

Qui a mis ces identifiants dans mon url ? Je les passe en param dans mon lien sur page suivante. C'est moi qui fait ça. Pas bon ?

Merci :)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Je reposte mon code, en l'état actuel des choses :



<form action="#espace_perso" method="get" name='form_acheter' id='form_acheter'>   

   <div id="rooms">   
 <?php 
$rooms = isset($_GET['pieces']) ? $_GET['pieces'] : array() ;
$selected='selected="selected"';
  ?>
    <label for="pieces"  class="tag">Pièces *</label>
    <select multiple="multiple"  name="pieces[]"  class="select" >
    <option value="1"  <?php if(in_array('1',$rooms)) echo $selected; ?> >Studio</option>
    <option value="2"  <?php if(in_array('2',$rooms)) echo $selected; ?> >2 pièces</option>
    <option value="3"  <?php if(in_array('3',$rooms)) echo $selected; ?> >3 pièces</option>
    <option value="4"  <?php if(in_array('4',$rooms)) echo $selected; ?> >4 pièces</option>
    <option value="5"  <?php if(in_array('5',$rooms)) echo $selected; ?> >5 pièces</option>
    <option value="6"  <?php if(in_array('6',$rooms)) echo $selected; ?> >6 pièces</option>
    <option value="7"  <?php if(in_array('7',$rooms)) echo $selected; ?> >7 pièces et +</option>
    </select> 
    <br /><br />

 

    </div>
    
 <label for="city"  class="tag">Ville *</label>
    <select multiple="multiple" name="ville[]" id="ville" size="5" class="select">
   
    <?php 
  
 include('mysql_connect.php');
 $set  =mysql_query("SET NAMES 'utf8'");
        $ville_query= "SELECT DISTINCT v.ville_id, vi.ville_nom FROM marimmo_ventes v 
                JOIN marimmo_villes vi ON vi.ville_id = v.ville_id
       ORDER BY vi.ville_nom ASC" ;
 $ville_req = mysql_query($ville_query) or die(mysql_error());

    $town = isset($_GET['ville']) ? $_GET['ville'] : array() ;
    $selected = 'selected="selected"';

 while ($city = mysql_fetch_assoc($ville_req))
       { $ville_id = $city['ville_id'];
         $ville_nom = $city['ville_nom'];
  ?> <option value=" <?php echo $ville_id; ?>" <?php if(in_array($ville_id,$town)) echo $selected; ?> ><?php echo $ville_nom; ?></option>
   
    <?php  }?>
    </select>
    
    <span class="error"><?php if(isset($e_ville)) echo $e_ville; ?> </span>
    <br /><br />
    
   

    <br /><br />
 <input type="submit" name="submit_rechercher" id="submit_rechercher" value="Rechercher" /> 
 </form>




<?php
 if(!empty($_GET['submit_rechercher'])) {

if (empty($_GET['ville'])  || empty($_GET['pieces']))
   {  $e_rooms = 'Le champ "Pièces" est requis' ;
     $e_ville = 'Le champ "Ville" est requis' ;
   }
  else {     $rooms=array_map('mysql_real_escape_string',$rooms);
   $roomsi=implode(',',$rooms);
       
   $town=array_map('mysql_real_escape_string',$town);       
   $towni= implode(',',$town);


              // puis requêtes SQL :
                1. qui compte  le nombre de résultats correspondant à ma recherche,   pour pagination
                 2. qui affiche la liste des résultats correspondant.

             // puis 
      
              $suivant = $current_page+1;
              $precedent = $current_page-1; 
     
               if ($nb_pages > 1  ) 
                 { 
                      if ($suivant <= $nb_pages)
                         { ?> <a class='numero_page' 
 href="Untitled-1.php?<?php foreach($_GET['ville'] as $k =>$ville) { echo "ville[]=$ville&"; } ?><?php foreach($_GET['pieces'] as $r =>$pieces) {echo "pieces[]=$pieces&";} ?>page=<?php echo $suivant; ?>">Suivante </a>
      <?php  } 
         else {?> <a class='no_link'>Suivante</a>
    <?php  }      
 
              }
}


Merci beaucoup
0
Donc ta variable $GET ne provient pas initialement d'une url, mais d'un formulaire en méthode GET. Ça n'est pas interdit, mais pas conventionnel, on préfère toujours la méthode $_POST.
Tes %20 proviennent d'une espaces que tu insères en trop dans ton formulaire :
<option value=" <?php echo $ville_id; ?>"

Il y a une espace en trop après value=" entre " et <

Pour ta page vide, je n'ai pas vérifié tous les détails, mais il me semble bien que :
<?php if(in_array($ville_id,$town))
est toujours faux car à cause de cette espace en trop qu'on retrouve dans chaque membre de $town, il n'y a jamais correspondance.
0
Okay, Merci. Espaces supprimés, et url correcte à présent.
Ok, je supprime if (in_array...) pour voir ce que ça donne.

Merci beaucoup, vraiment
0
Récap : En ayant enlevé les espaces sur <option value= ">

mon url, au click sur Page suivante, donne ceci :

Untitled-1.php?ville[]=8&ville[]=17&ville[]=19&ville[]=22&ville[]=26&ville[]=32&pieces[]=1&pieces[]=2&pieces[]=3&pieces[]=4&pieces[]=5&pieces[]=6&pieces[]=7&page=2

Nickel, plus d'espaces.

Ceci-dit la Page Suivante ne retourne rien, bien que les éléments sélectionnés de mes select multiples le restent sur page 2.

La page 1 renvoit les premiers résultats (LIMIT $nb_a_aficher, $per_page) et ce, comme au premier jour, mais Page Suivante est vide.

****************************************************
Si j'enlève tout ce qui est
<?php if(in_array())
en laissant les
$rooms = isset($_GET['pieces']) ? $_GET['pieces'] : array() ;
et que je click sur Page suivante : Page suivante reste vide, bien que l'url soit correcte, enfin identique à celle marquée ci-dessus.


Dois-je supprimer les ternaires :
$rooms = isset($_GET['pieces']) ? $_GET['pieces'] : array() ;
?

Ye suis perdue ! 7 jours que je suis dessus !
Merci pour ton aide :)
0
Utilisateur anonyme
3 juil. 2014 à 21:12
Quand tu parles de cliquer sur Page suivante, je suppose qu tu veux dire Suivante car je ne vois pas le mot page dans ton script.
Cette page suivante, c'est bien le même script c'est à dire Untitled-1.php ?
Si tout ceci est vrai et que tu obtiens une page blanche, je pense que le problème se situe dans le code qui précède, car dans ce que tu donnes, le formulaire s'affiche obligatoirement, puisque ton script commence par là.
Pourquoi n'insères-tu pas des echo 'coucou1', echo 'coucou2'... depuis le début de ton script pour voir s'il passe bien par les endroits prévus, et en déduire où il y a un problème ?
0
Effectivement, quand je dis "Page suivante", je veux dire <a href='....'>"Suivante"</a>.

echo 'coucou'.
Oui mais, s'il ya bien une erreur quelque part, je m'imagine que déjà rien que sur la première page, il devrait y en avoir une : exemple => affichage incomplet des résultats de la requête principale, ou autre chose. NON ? ou pas forcément?

Mais tout s'affiche parfaitement sur la première page, donc je ne vois pas où faire echo 'Success !!!'.
Et vu que là c'est la fin du 7e jour passé sur le même problème, à force, même si je ne lâche pas le morceau, j'y vois plus rien.

Pensant que tu ne donnerais peut-être pas suite à cette discussion, j'ai posté ici :
http://www.developpez.net/forums/d1455150/php/langage/probleme-pagination/#post7882840
lol et je reste pour l'instant tout aussi désespérée... SI tu y vois plus clair avec cette méthode..? Un eureka peut-être ???

Je veux dire Eureka demain please; là c'est exagéré le temps que je passe sur ça..

Merci pour le suivi :) ça fait du bien.
0
Utilisateur anonyme
4 juil. 2014 à 07:55
Oui mais, s'il ya bien une erreur quelque part, je m'imagine que déjà rien que sur la première page, il devrait y en avoir une
Pas forcément du tout. Ta page "suivante" n'est pas censée afficher la même chose que la première, n'est-ce pas ? Même si c'est le même script, elles ne manipulent pas les mêmes données, ne assent sans doute pas par les mêmes 'if', etc...

Tu n'as pas répondu à un point crucial : c'est vraiment vide quand tu cliques sur suivant ? Alors c'est qu'il y a du code avant celui que tu nous a donné ici, et qui fait la différence.

Une autre différence qui apparaîtra plus tard et qui t'a été signalée sur développez.com. Tu testes à un moment donné
if(!empty($_GET['submit_rechercher']))
et cette variable est définie quand tu viens de cliquer sur le bouton du formulaire, mais ne l'est pas quand tu cliques sur le lien "suivante" car elle ne figure pas dans l'url. Mais c'est un autre problème dont on s'occupera plus tard, tu devais quand même afficher le formulaire.
0
Bonjour,

J'ai fait ce que m'a dit Sabotage, c'est à dire passer mon submit en param dans l'url, et même mieux : un peu de jquery pour qu'au click sur un des liens vers pages x, le bouton submit_rechercher soit clické automatiquement) et idem pour le bouton go2page.

J'ai répondu au point crucial dans mon dernier post hier soir, qui était :
Ma page Suivante ne contient que le formulaire et la déco, mais pas la suite des résultats.

Et comme j'en faisais mention, lorsque je vais sur Page suivante, je crois avoir trouvé sans certitude !! d'où vient le problème principal :

dans ma requête j'ai ça : LIMIT $nb_results_limit, $per_page

J'ai aussi, juste avant ma requête, ce code :
$per_page = 3;
$nb_pages = ceil($nb_correspondances/$per_page);  
$current_page = isset($_REQUEST['page']) && ($_REQUEST['page'] > 0) &&   ($_REQUEST['page'] <= $nb_pages) ? $_REQUEST['page'] : 1;
$nb_results_limit = ($current_page-1)*$per_page;


Mon URL indique (on click sur Suivante) nb_results_limit=0

là où dans mon link je mets :
nb_results_limit=<?php echo $nb_results_limit; ?>&page=<?php echo $suivant; ?>">Suivante

Le problème se situe, si je ne dis pas de bêtise, au niveau de nb_results_limit qui renvoit 0.


Merci -
0
Utilisateur anonyme
4 juil. 2014 à 11:05
c'est à dire passer mon submit en param dans l'url
C'est une façon de voir. À mon avis, il valait mieux retirer ce test sur submit_rechercher qui ne t'apporte absolument rien, plutôt que de l'ajouter artificiellement dans une url où il vient comme un cheveu dans la soupe.
D'ailleurs, à quoi sert de recopier des paquets de "piece" et de "ville" dans une url ? Si tu en as besoin pour la suite, utilise les sessions, c'est fait pour ça.

même mieux : un peu de jquery...
Il y a des choses simples qui ne marchent pas encore, et tu compliques déjà ? Ça m'échappe, là.

J'ai répondu au point crucial dans mon dernier post hier soir
J'ai beau relire, je ne vois pas où. Ah, si, sur l'autre forum. Mais je n'y vais pas.

Si le résultat $nb_results_limit est incorrect, affiche les variables qui servent à le calculer, tu verras bien d'où vient le problème.
0
Ben mettre mes select multiples en session, c'est la toute première chose que j'ai fait, mais sans succès. Puis on m'a dit de ne pas utiliser les sessions pour ça, donc j'ai testé d'autres méthodes.
Sur Developpez.net, on me dit de finalement jouer avec les sessions, puis rebelotte, de ne pas les utiliser et de revenir au passage de mes vars dans l'url.
==============

À mon avis, il valait mieux retirer ce test sur submit_rechercher qui ne t'apporte absolument rien


J'écoute ce que tu me dis et je fais bien de te demander, car c'est enfin l'heure de dire Success !!! En enlevant if(isset($_REQUEST['submit_rechercher'])) ma pagination se fait normalement. Je me sens ridicule, débile. Au moins de ses erreurs on apprend.

Maintenant, il me reste une petite question :
Dans mes links vers les autres pages, il serait conseillé d'utiliser htmlspecialchars pour me protéger des injections par l'url, n'est-ce pas? ou ce n'est pas tout à fait ça? Car si c'est le cas, comment l'apposer sur

&<?php foreach($_REQUEST['ville'] as $k =>$ville_id) { echo "ville[]=$ville_id&"; } ?>

ou est-ce que mes mysql_real_escape_string sont auto-suffisants ?

Merci pour ta gentillesse, ta patience, et d'être là
0
Utilisateur anonyme
4 juil. 2014 à 13:47
Heureux que tu aies pu avancer.
En ce qui concerne l'utilisation de mysql_real_escape_string, cette fonction est nécessaire et suffisante pour te protéger des injections dans la base de données.
C'est à dire qu'il faut l'utiliser pour fabriquer ta requête mysql. Et il ne faut l'utiliser que pour ça.

On voit souvent des gens utiliser htmlspecialchars pour ça, et le conseiller dans les forums : c'est une grossière erreur. J'insiste sur le grossière. Cette fonction ne devrait servir qu'à l'affichage des données, quand on désire que les caractères qui ont une fonction particulière en HTML soient affichés comme de simples caractères au lieu de remplir leur fonction particulière. Ceci n'a aucun rapport avec les bases de données. Pire, si tu t'en sers pour enregistrer dans une base, les données enregistrées sont modifiées par rapport aux données initiales, et des fonctions comme le tri par ordre alphabétique te donneront des résultats inattendus.

Bonne chance pour la suite.
0
D'accord. J'utilise systématiquement mysql_real_escape_string sur chaque donnée avant de les utiliser dans une query. et htmlspecialchars sur les user inputs réaffichés.
J'ai vu qu'il était possible pour un méchant de modifier les données passées en url et de faire des vilaines queries avec, mais tout ce que j'ai pu trouver sur le net sur comment s'en prévenir m'a laissée sur un ?
Ok, donc mysql_real_escape_string est suffisant contre ça. D'accord.

Oui, merci beaucoup pour ton aide, je peux enfin passer à la suite.
Jusqu'à hier soir donc et depuis 7jours (à raison de 10 à 16h / jour) , personne ne m'avait parlé de mon submit, donc c'est que le problème ne devait pas venir de là pensais-je, et on m'orientait sur de l'ajax, du serialize, du http_query, des sessions, sur ne pas passer ses vars en param dans l'url, etc, et ça ne marchait jamais.. évidemment. J'en ai testé des solutions, des fonctions, j'en ai passé des heures là dessus et à parcourir tout le web dans toutes les langues pour trouver, et finalement faire comme bon me semblait avec le passage des tableaux dans l'url, que tu m'as aidé à mener à bien.
J'ai bien noté les erreurs à ne plus commettre, les points à vérifier et la bonne syntaxe.

Merci de m'avoir aidée.
0