Transmission de données à l'aide d'un tableau

Manu2 -  
 Manu2 -
Bonjour,

J'ai un problème sur lequel je bute et que je n'arrive décidément pas à résoudre :

J'ai un script pour interroger ma base de données (discographies). La recherche est multi-critères, et fonctionne pour tous les élèments, sauf ceux multiples tels que les formats de disques.

Voici la ligne concernée :

Code:
echo "<td>".$row["type"]."<input type=\"checkbox\" name=\"form_formats[]\" value='".$row["id_type"]."'></td>"; 


Lorsque je lance une recherche pour 2 cases cochées, le nombre de résultats est correct. Comme les résultats s'affichent 10 par 10, j'ai un nombre de pages qui s'affiche en bas. Jusque-là tout marche. Seulement si je clique sur l'une des pages, pour voir la suite des résultats, là, il perd les données et affiche la totalité de la bdd.

Voici le script de recherches :
Code:

   case "form_formats" : 
      $i=0; 
      while (list($num, $gr) = each ($valeur)) 
      { 
      $i++; 
      if ($i==1) $texte2 .=" AND ("; 
   //(formats.id_type LIKE '$gr'"; 
      if ($i>1) $texte2 .=" OR "; 
   $texte2 .="disco_formats.id_type LIKE '$gr'"; 
    if ($gr == '') $texte2=''; 
    } 
    if ($texte2!='') $texte2 .=")";//si un texte existe, ferme la parenthèse 
    $i=0; 
      break; 


Voici le script d'affichage des pages :
Code:
    if(!empty($_GET['form_formats']))$url .= "&form_formats[]=".$_GET['form_formats'];  


S'il vous en faut plus, pas de pb, je vous mettrai les pavés complets !

Donc, ma question est la suivante : comment transmettre le tableau des variables correspondant aux cases cochées pour naviguer de page en page ?

Merci par avance pour vos réponses.
A voir également:

3 réponses

Manu2
 
up
0
BreTzeL Messages postés 59 Statut Membre 24
 
Bonjour,

alors tu as plusieurs choix :

- Si ta base de données est MySQL, tu peux utiliser LIMIT x,y qui va te renvoyer uniquement y lignes à partir de l'offset x. ton probleme est réglé : tu n'as qu'a transmettre entre tes pages tes critères et les 2 valeurs de x et y.

- la première solution ne te plait pas, t'as pas envie, tu voulais autre chose :D
Tu peux créer un formulaire ne contenant qu'un seul champ caché : ton tableau sérialisé (fonction serialize() ). et chacun de tes liens envoie le formulaire (avec onclick et submit. dis moi si tu veux plus de détails) et les informations permettant de te repérer pour l'affichage.

Le point commun entre l'informatique et l'alcool ?
- ça fait mal à la tête. :P
0
Manu2
 
Merci Bretzel pour ta réponse.

La 1ère ne me satisfait pas, puisque mon problème n'est pas de limiter la réponse (elle l'est puisque les résultats s'affichent bien page par page), mais de renvoyer le tableau de données via l'url de la page au script. Là, je ne sais pas du tout comment faire, d'où ma question.

La 2ème ne va pas... Je ne touche pas au formulaire. Peut-être me suis-je mal exprimé. Dans ta réponse, tu ne me dis pas quoi saisir dans le script pour que celui-ci reconnaisse des données issues d'un tableau et les utilise, suite au clic sur une url.

Le script en action sur cette page :

[url]http://www.the-mirror-of-dreams.com/disco/index.php[/url]

Pour le tester, tu cliques sur "search" puis par exemple tu coches 12". Les résultats s'affichent. Essaie de te balader dans les différentes pages : ça marche plus...

PS : si tu ne vois pas les pages en bas, passe en plein écran. (corrigé dans la nouvelle version).
0
kilian Messages postés 8854 Statut Modérateur 1 526
 
Salut,

Pour envoyer les données de page en page tu as les variables session...
=> http://www.lephpfacile.com/cours/index.php?p=19

var a=unescape("%3A-%29");
document.write(a);
0
BreTzeL Messages postés 59 Statut Membre 24
 
Salut,

Ton site a l'air sympa, il ne lui reste plus qu'à fonctionner correctement ;)

Moi non plus je ne me suis pas bien exprimé :
Je vais réexpliquer la première solution, car je pense qu'elle est la plus simple à implémenter. La clause LIMIT permet de limiter le nombre de lignes sélectionner, à priopi ce n'est pas ce que tu souhaites. Mais elle va permettre de faire la sélection des lignes à afficher sans avoir à traiter la liste une fois récupérée.
Par exemple pour la premiere page tu auras comme requète SQL 'SELECT ... FROM ... WHERE ... LIMIT 0, 10' : elle te renverra les 10 premières lignes correspondant à ta requète = ta première page.
pour la deuxième page, la requète deviens 'SELECT ... FROM ... WHERE ... LIMIT 10, 10' et ta page affichera les 10 suivantes. Tu peux utiliser ta variable page pour faire le décalage.
L'avantage est que tu n'as plus à transferer un tableau de données d'une page à l'autre. L'inconvénient est que tu refais une requète à chaque changement de page.

Maintenant developpons la deuxième solution.
tu crée un nouveau formulaire contenant un élément, caché, que tu remplieras avec le tableau de résultats préalablement applati.
<form name="results" method="POST" action="...">
<input type="hidden" name="tableau" value="
<? echo serialize($tableau); ?>
">
</form>

Ensuite pour tes liens, il faut les transformer en bouton de soumission du formulaire en les faisant ressembler à ça :
<a href="#" onCLick="results.action = 'queries.php?page=20';result.submit() ">3</a>


Dans la page appelée queries.php tu récupères le tableau avec la ligne suivante :
$tableau = unserialize($_POST['tableau']);

et l'indice du premier résultat :
$page = $_GET['page'];


je pense avoir été plus clair cette fois-ci.

Pour ce qui est des variables de sessions, il y a quelques fonctions à connaitre et le site donné par kilian en fait le tour. Il reste toujours https://www.php.net/ pour plus d'infos sur ces fonctions.


Le point commun entre l'informatique et l'alcool ?
- ça fait mal à la tête. :P
0
Manu2 > BreTzeL Messages postés 59 Statut Membre
 
Bretzel a écrit : "Je vais réexpliquer la première solution, car je pense qu'elle est la plus simple à implémenter. La clause LIMIT permet de limiter le nombre de lignes sélectionner, à priopi ce n'est pas ce que tu souhaites. Mais elle va permettre de faire la sélection des lignes à afficher sans avoir à traiter la liste une fois récupérée.
Par exemple pour la premiere page tu auras comme requète SQL 'SELECT ... FROM ... WHERE ... LIMIT 0, 10' : elle te renverra les 10 premières lignes correspondant à ta requète = ta première page.
pour la deuxième page, la requète deviens 'SELECT ... FROM ... WHERE ... LIMIT 10, 10' et ta page affichera les 10 suivantes. Tu peux utiliser ta variable page pour faire le décalage.
L'avantage est que tu n'as plus à transferer un tableau de données d'une page à l'autre. L'inconvénient est que tu refais une requète à chaque changement de page. "

Pour ta 1ère réponse, et je te remercie encore d'avoir pris autant de temps pour rédiger ton post, ce n'est pas ça.

Ce n'est pas le tableau des résultats que je transmets de page en page, mais le tableau des données à rechercher !

Par exemple, l'utilisateur coche k7 et cd, qui ont les valeurs id 5 et 8. J'envoie ces valeurs à mon script queries.php qui se charge d'interroger la bdd via une requête sql, et qui affiche tous les enregistrements comportant pour le champ format les valeurs 5 ou 8. S'il y a plus de 10 valeurs à afficher, alors, il les affiche en plusieurs pages. Et c'est là que le script s'arrête de fonctionner. Car lorsque je clique sur la page 2, je renvoie au script queries.php via l'url de la page la valeur limit du query (10), mais pas les valeurs 5 et 8 contenues dans le tableau form_formats[]. Et ceci pour la bonne raison que je ne sais pas comment les renvoyer au script ! Je sais les envoyer depuis un formulaire, mais pas via une url.

Je ne sais pas si mon exemple t'aide davantage, ou si je suis vraiment borné.... :)

J'étudie les 2 autres soluces plus tard... (sessions et formulaire).

A+
0
Manu2
 
Merci pour vos réponses Killian et Bretzel.

Ca reste flou pour moi, tout ça...

Je regarderai demain ou ce week-end plus en détail, car j'aurais plus de temps...
0