Page 1 sur 2

Tri colonne tableau ne fonctionne pas

Posté : 22 janv. 2010, 19:53
par almoha
Bonjour,

Le code ci-dessous est censé trier mon tableau provenant d'une base MYSQL en cliquant sur la colonne AUTEUR ou la colonne TITRE. Mais lorsque je clique sur un des liens de tri, je n'ai pas d'erreur mais ma page biblio.php se recharge à l'identique, c'est à dire dans l'ordre des enregistrements par défaut, sans tri effectué. Avez-vous une idée de ce qui cloche ? (je suis débutant en PHP) Merci.


<?php
require_once("connexionMysql.inc.php");

$requete = "SELECT * FROM liste";
$resultat=mysql_query($requete);

if($_GET){
  $tri = $_GET['tri'];
  $order = $_GET['ordre'];
  $requete .= " ORDER BY" . $tri . $order;
}
?>

<?php
echo '<table>';
echo '<tr><td>TITRE 
    <a href="biblio.php?tri=TITRE&ordre=asc">+</a>
    <a href="biblio.php?tri=TITRE&ordre=desc">-</a>
  </td><td>AUTEUR
    <a href="biblio.php?tri=AUTEUR&ordre=asc">+</a>
    <a href="biblio.php?tri=AUTEUR&ordre=desc">-</a>
  </td></tr>';
while($donnees=mysql_fetch_array($resultat)){

  echo '<tr><td>' . $donnees['TITRE'] . '</td>
    <td>' . $donnees['AUTEUR'] . '</td></tr>';
}
echo '</table>';
?>



Re: Tri colonne tableau ne fonctionne pas

Posté : 22 janv. 2010, 20:23
par dunbar
Salut,

Et comme ceci ?
<?php
require_once("connexionMysql.inc.php");
$order = (iSset($_GET['ordre']) ? $_GET['ordre'] : null);
$tri = (iSset($_GET['tri']) ? " ORDER BY" . $_GET['tri']. $order : null);


$requete  = "SELECT * FROM liste";
$requete .=  $tri;
$resultat = mysql_query($requete) or die('Erreur SQL !'.$requete.'<br>'.mysql_error());


echo '<table>';
echo '<tr>
      <td>TITRE
       <a href="biblio.php?tri=TITRE&ordre=asc">+</a>
       <a href="biblio.php?tri=TITRE&ordre=desc">-</a>
     </td>
     <td>AUTEUR
       <a href="biblio.php?tri=AUTEUR&ordre=asc">+</a>
        <a href="biblio.php?tri=AUTEUR&ordre=desc">-</a>
    </td>
    </tr>';
while($donnees=mysql_fetch_array($resultat)){

  echo '<tr><td>' . $donnees['TITRE'] . '</td>
    <td>' . $donnees['AUTEUR'] . '</td></tr>';
}
echo '</table>';
?>

Re: Tri colonne tableau ne fonctionne pas

Posté : 22 janv. 2010, 22:44
par almoha
Merci pour votre proposition de code. Mais en l'essayant j'ai l'erreur suivante :

"Erreur SQL !SELECT * FROM liste ORDER BYAUTEURasc
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'BYAUTEURasc' at line 1"

Voyez-vous comment résoudre cette erreur ? Merci d'avance.

Re: Tri colonne tableau ne fonctionne pas

Posté : 22 janv. 2010, 23:50
par dunbar
Il y a pas d'espace entre les clauses essaye comme ceci :?:
<?php
require_once("connexionMysql.inc.php");
$order = (iSset($_GET['ordre']) ? $_GET['ordre'] : null);
$tri = (iSset($_GET['tri']) ? " ORDER BY " . $_GET['tri'].' '. $order : null);


$requete  = "SELECT * FROM liste";
$requete .=  $tri;
$resultat = mysql_query($requete) or die('Erreur SQL !'.$requete.'<br>'.mysql_error());


echo '<table>';
echo '<tr>
      <td>TITRE
       <a href="biblio.php?tri=TITRE&ordre=asc">+</a>
       <a href="biblio.php?tri=TITRE&ordre=desc">-</a>
     </td>
     <td>AUTEUR
       <a href="biblio.php?tri=AUTEUR&ordre=asc">+</a>
        <a href="biblio.php?tri=AUTEUR&ordre=desc">-</a>
    </td>
    </tr>';
while($donnees=mysql_fetch_array($resultat)){

  echo '<tr><td>' . $donnees['TITRE'] . '</td>
    <td>' . $donnees['AUTEUR'] . '</td></tr>';
}
echo '</table>';
?>


Re: Tri colonne tableau ne fonctionne pas

Posté : 23 janv. 2010, 12:24
par almoha
Bonjour,

Merci pour la correction du code : il fonctionne dorénavant conformément à mes attentes. Je rebondis néanmoins sur le sujet. Le code me permet de trier la liste de TOUS les enregistrements de ma base de données (liste de livres avec auteur, titre, genre etc.), ce qui convient lorsque ma page d'accueil est ouverte. Mais mon site comprendra des liens sur chaque auteur me permettant en cliquant dessus de n'afficher que les livres d'un auteur. Jusque là pas de problème. Sauf que je me demande comment trier- par exemple par genre- seulement ces enregistrements partiels (d'un seul auteur) et non pas la totalité des enregistrements de la base avec tous les auteurs.

Merci d'avance pour tout éclaircissement sur le sujet.

Re: Tri colonne tableau ne fonctionne pas

Posté : 23 janv. 2010, 12:32
par Ryle
La question du tri a été réglé plus haut. Celle-ci sera la même que tu listes les oeuvres d'un seul, de plusieurs ou de tous les auteurs :)

Ce qui te faut maintenant c'est ajouter un critère de filtre à ta requête pour sépcifier que tu ne souhaites récupérer que les résultat d'un auteur spécifique. Pour cela il te faut utiliser la clause sql WHERE et spécifier la condition à utiliser. Par exemple :
"SELECT ... FROM liste WHERE id_auteur = " . $valeurChoisie . " ORDER BY ... "

Re: Tri colonne tableau ne fonctionne pas

Posté : 23 janv. 2010, 13:19
par almoha
Merci pour votre réponse. Mais je suis vraiment néophyte. A quoi correspond
$valeurChoisie
? Pardonnez-moi, mais pouvez-vous expliciter votre réponse ? Par avance merci.

Re: Tri colonne tableau ne fonctionne pas

Posté : 23 janv. 2010, 15:03
par Ryle
Dans cet exemple, cela correspondrait à l'identifiant de l'auteur que l'utilisateur souhaite afficher... mais ton critère peut porter sur son nom, sur un thème, ou même sur plusieurs critères :)

Par exemple (en supposant que ces champs existent dans ta table) la requête :
SELECT ...
  FROM liste 
  WHERE nom_auteur = 'Stephen King'
  ORDER BY theme
Va te retourner les enregistrements de la table "liste" pour lesquels le nom de l'auteur est "Stephen King", triés par "theme"

A toi d'adapter ensuite si tu veux changer ou ajouter des critères sur le prénom de l'auteur, le titre du livre, l'année de publication, le nombre de tome ... ou tout ce que tu peux avoir dans ta table et que l'auteur pourrait souhaiter trier ou filtrer :)

Re: Tri colonne tableau ne fonctionne pas

Posté : 23 janv. 2010, 15:51
par almoha
Je comprends la logique que tu exposes ou du moins je crois. Mais ce que je voudrais obtenir c'est la chose suivante : on considère que sur ma page accueil il y a ma liste complète d'ouvrages avec disons 500 auteurs différents. Je clique sur un des auteurs et cela m'affiche tous ses livres sans tri particulier. Pour l'instant c'est ce je veux. Ce n'est qu'ensuite que je souhaite - en cliquant sur une flèche haut ou bas selon les cas- trier par thème (par exemple) la liste des livres de l'auteur précédemment sélectionné. Dans la requête SQL que tu donnes, cela suppose que l'on indique le nom de l'auteur...mais moi l'identité de l'auteur est fonction de celle sélectionnée sur la page d'accueil en cliquant sur le lien de l'auteur (elle est donc "variable").Je ne sais pas si j'exprime bien la problématique...

Pouvez-vous m'aider ? Merci.

Re: Tri colonne tableau ne fonctionne pas

Posté : 23 janv. 2010, 16:13
par Ryle
Le principe est le même lorsque ton utilisateur choisis le critère de tri que lorsqu'il choisis un auteur :)

Quand tu cliques sur l'un des auteurs de ta page d'accueil, il te faut récupérer le nom de l'auteur, ou son identifiant, ou tout autre information à ta disposition. Grace à elle, tu vas pouvoir filtrer ta liste, tout comme tu fais pour la trier :

Code : Tout sélectionner

Tu construit ta requête SI un auteur est sélectionné Tu ajoutes le critère de recherche avec WHERE FIN SI Si un ordre de tri est spécifié Tu ajoutes le critère de tri avec ORDER BY FIN SI
Est-ce que c'est plus clair ? A partir de là, y a plus qu'à coder ;)

Re: Tri colonne tableau ne fonctionne pas

Posté : 23 janv. 2010, 18:35
par almoha
Encore une fois merci. J'abuse certainement mais vous serait-il possible de m'aider pour élaborer le code dont vous me parlez ? (mais je comprendrai si vous estimez avoir passé trop de temps sur mon sujet).

PS : dans mon précédent message, j'ai oublié d'indiquer que ce que je recherche peut être illustré par le site de la FNAC, qui permet, après avoir cliqué sur le nom d'un auteur ou suite à une recherche, de trier les titres de l'auteur par éditeurs, prix...

Re: Tri colonne tableau ne fonctionne pas

Posté : 23 janv. 2010, 23:11
par Ryle
Y pas de soucis, c'est l'objet de ce forum que de pouvoir apprendre et s'entraider ;)

Normalement tu as tout ce qu'il te faut pour choisir un auteur, récupérer la valeur choisie et l'utiliser dans ta requête afin de filtrer les résultats. Le principe est le même que pour ton tri, la seule différence, c'est qu'au lieu de choisir la colonne de tri et le sens (et pour toi d'ajouter ORDER BY la_valeur à ta requête), l'utilisateur choisit le filtre (et pour toi d'ajouter WHERE le_champ = la_valeur).

Je te laisse essayer (parce que c'est quand même comme ça qu'on apprend le mieux :)) par contre n'hésites pas à nous montrer ton code et on t'aidera à comprendre et à corriger si nécessaire :)

Re: Tri colonne tableau ne fonctionne pas

Posté : 24 janv. 2010, 11:32
par almoha
Merci pour tes conseils. J'ai fait le code suivant, mais je rame vraiment :
<?php
require_once("connexionMysql.inc.php");
$order = (iSset($_GET['ordre']) ? $_GET['ordre'] : null);
$tri = (iSset($_GET['tri']) ? " ORDER BY " . $_GET['tri'].' '. $order : null);
$ID_AUTEUR = (iSset($_GET['ID_AUTEUR']) ? $_GET['ID_AUTEUR'] : null);


$requete  = "SELECT * FROM liste WHERE ID_AUTEUR='".$_GET['ID_AUTEUR']."'"; // Requête SQL;
$requete .=  $tri;
$resultat = mysql_query($requete) or die('Erreur SQL !'.$requete.'<br>'.mysql_error());


echo '<table>';
echo '<tr>
      <td>TITRE
       <a href="forum php_biblio.php?tri=TITRE&ordre=asc">+</a>
       <a href="forum php_biblio.php?tri=TITRE&ordre=desc">-</a>
     </td>
     <td>AUTEUR
       <a href="forum php_biblio.php?tri=AUTEUR&ordre=asc">+</a>
etc
?>
Mais j'ai l'erreur suivante : "Notice: Undefined index: ID_AUTEUR in C:\wampserveur\www\elephormphpsql\BROUILLONS\forum php_biblio.php on line 10" (correspontd à la ligne $requete = "SELECT * FROM liste WHERE ID_AUTEUR='".$_GET['ID_AUTEUR']."'";)

Par ailleurs, si je comprends bien, il faudra que je modifie les liens suivants pour ne de trier que les livres de l'auteur sélectionné :
<a href="biblio.php?tri=TITRE&ordre=asc">+</a>
<a href="biblio.php?tri=TITRE&ordre=desc">-</a>
Mais comment faire ?

Je rappelle que ce n'est pas en cliquant sur le lien d'un auteur, du style :
<a href="fiche_details_auteur.php?ID_AUTEUR=<?php echo $donnees['ID_AUTEUR']; ?>"><?php echo $donnees['AUTEUR']; ?></a>
que je veux trier les résultats par thème par exemple.C'est en cliquant dans un 2nd temps sur un lien de type
<a href="biblio.php?tri=TITRE&ordre=asc">+</a>
que je veux le faire.

Merci d'avance.

Re: Tri colonne tableau ne fonctionne pas

Posté : 24 janv. 2010, 12:24
par Ryle
Concernant ton erreur, c'est parce que tu fais un test au début de ton code pour savoir si la variable $_GET['ID_AUTEUR'] existe, et que dans ton select, tu ignores ce test et fait appel à ta variable comme si elle existait toujours :)
$order = (iSset($_GET['ordre']) ? $_GET['ordre'] : null);
$tri = (iSset($_GET['tri']) ? " ORDER BY " . $_GET['tri'].' '. $order : null);
$ID_AUTEUR = (iSset($_GET['ID_AUTEUR']) ? $_GET['ID_AUTEUR'] : null);

$requete  = "SELECT * FROM liste WHERE ID_AUTEUR=". $ID_AUTEUR; // Nota: si iD_AUTEUR est numérique, il ne faut pas le délimiter avec des apostrophes en SQL
$requete .=  $tri;
$resultat = mysql_query($requete) or die('Erreur SQL !'.$requete.'<br>'.mysql_error());
Mais cela veut dire qu'il va à chaque fois chercher les résultats pour lesquels ID_AUTEUR= $ID_AUTEUR, alors que ce que tu veux c'est ne limiter à un seul auteur que si l'utilisateur en a besoin :
$order = (iSset($_GET['ordre']) ? $_GET['ordre'] : null);
$tri = (iSset($_GET['tri']) ? " ORDER BY " . $_GET['tri'].' '. $order : null);
$ID_AUTEUR = (iSset($_GET['ID_AUTEUR']) ? $_GET['ID_AUTEUR'] : null);

$requete  = "SELECT * FROM liste";
if ( $ID_AUTEUR != null) { // on ajoute le critère que s'il est demandé
  $requete  = " WHERE ID_AUTEUR=". $ID_AUTEUR; // Nota: si iD_AUTEUR est numérique, il ne faut pas le délimiter avec des apostrophes en SQL
}
$requete .=  $tri;
$resultat = mysql_query($requete) or die('Erreur SQL !'.$requete.'<br>'.mysql_error());
A partir de là, il te suffit de passer dans l'url les valeurs de ordre, tri et/ou ID_AUTEUR pour que ta requête s'exécute. Par exemple :
- biblio.php?tri=TITRE&ordre=asc : va trier tous les livres par titre croissant
- biblio.php?tri=TITRE&ordre=asc&ID_AUTEUR=5 : va trier uniquement les livres de l'auteur n°5 par titre croissant
- biblio.php?ID_AUTEUR=5 : va afficher uniquement les livres de l'auteur n°5 (trié n'importe comment :))

Re: Tri colonne tableau ne fonctionne pas

Posté : 24 janv. 2010, 13:12
par almoha
Je commence à tester la 1ere partie de ton code :
$order = (iSset($_GET['ordre']) ? $_GET['ordre'] : null);
$tri = (iSset($_GET['tri']) ? " ORDER BY " . $_GET['tri'].' '. $order : null);
$ID_AUTEUR = (iSset($_GET['ID_AUTEUR']) ? $_GET['ID_AUTEUR'] : null);

$requete  = "SELECT * FROM liste WHERE ID_AUTEUR=". $ID_AUTEUR; // Nota: si iD_AUTEUR est numérique, il ne faut pas le délimiter avec des apostrophes en SQL
$requete .=  $tri;
$resultat = mysql_query($requete) or die('Erreur SQL !'.$requete.'<br>'.mysql_error());
Mais j'ai l'erreur suivante : "Erreur SQL !SELECT * FROM liste WHERE ID_AUTEUR=
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1"
Or je ne trouve pas cette erreur. Peut-tu me dire ce qu'il en est ?. Merci encore pour ton aide.