[RESOLU] Trier les membres par critère de colonne

Eléphanteau du PHP | 29 Messages

17 déc. 2015, 22:45

Bonjour à tous!
Débutant en PHP et SQL, je créé un site en local pour apprendre à me familiriser avec ces fabuleux outils.
Ce site n'a aucun interêt si ce n'est que pour apprendre :D
Donc, je voudrais simplement afficher sur la "page de membre" les autres membres ayant en commun la même ville.
J'ai donc dans ma BDD une colonne "Ville" contenant en texte la ville du membre, mais je n'ai aucune idée de comment m'y prendre :/ .
Bonne journée à tous!

Mammouth du PHP | 881 Messages

17 déc. 2015, 23:13

Ceci devrait t'aider:

La commande de tri en MySQL est ORDER BY .... ASC

La documentation est ici : http://dev.mysql.com/doc/refman/5.7/en/ ... ation.html
Soyez artisans de paix

Mammouth du PHP | 2703 Messages

17 déc. 2015, 23:14

sais-tu déjà afficher les données d'un membre, dont sa ville, donc sans la liste des autres membres de la même ville ?
si oui, quel est le code ?

Eléphanteau du PHP | 29 Messages

18 déc. 2015, 08:55

sais-tu déjà afficher les données d'un membre, dont sa ville, donc sans la liste des autres membres de la même ville ?
si oui, quel est le code ?
Bonjour, oui j'y arrive sans soucis avec un simple écho de données stockées dans la session de l'utilisateur :)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

18 déc. 2015, 13:02

Bonjour,

A priori ce n'est pas un tri qu'il te faut (ORDER BY), mais une clause (WHERE) dans ta requête SQL permettant de ne retourner et donc n'afficher que les utilisateurs ayant dans le champ ville la valeur stockée dans la session de l'utilisateur. C'est bien ça ?
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 29 Messages

18 déc. 2015, 16:07

Bonjour,

A priori ce n'est pas un tri qu'il te faut (ORDER BY), mais une clause (WHERE) dans ta requête SQL permettant de ne retourner et donc n'afficher que les utilisateurs ayant dans le champ ville la valeur stockée dans la session de l'utilisateur. C'est bien ça ?
Exactement!

Mammouth du PHP | 881 Messages

18 déc. 2015, 16:31

Alors la requête ressemblera à
"SELECT * FROM maTable WHERE Nom LIKE '".$_POST["NomRecuDuFormulaireHTML"]."%' AND Prenom LIKE '".$_POST["PrenomRecuDuFormulaireHTML"]."%' ORDER BY Nom ASC, Prenom ASC "

Rappelons que le joker MySQL est %
L'étoile après "SELECT" demande de retourner tous les champs de la table.
S'il n'est pas nécessaire d'avoir tous les champs, alors on peut énumérer ceux dont on aura besoin comme ceci:
SELECT Prenom,Nom,Adrese FROM ....
Soyez artisans de paix

Eléphanteau du PHP | 29 Messages

18 déc. 2015, 18:29

Alors la requête ressemblera à
"SELECT * FROM maTable WHERE Nom LIKE '".$_POST["NomRecuDuFormulaireHTML"]."%' AND Prenom LIKE '".$_POST["PrenomRecuDuFormulaireHTML"]."%' ORDER BY Nom ASC, Prenom ASC "
Merci! Donc maintenant pour l'integrer en php je dois utiliser la fonction mysqli_fetch_row() ?

Mammouth du PHP | 881 Messages

18 déc. 2015, 19:33

Il y a quelques fonctions "mysqli_fetch_" (.. row, array) offertes en PHP, tu peux choisir celle qui convient le mieux à ton besoin, consulte http://php.net/manual/en/mysqlinfo.api.choosing.php Pour ma part, j'utilise habituellement mysqli_fetch_array
Soyez artisans de paix

Eléphanteau du PHP | 29 Messages

18 déc. 2015, 20:01

Il y a quelques fonctions "mysqli_fetch_" (.. row, array) offertes en PHP, tu peux choisir celle qui convient le mieux à ton besoin, consulte http://php.net/manual/en/mysqlinfo.api.choosing.php Pour ma part, j'utilise habituellement mysqli_fetch_array
Donc je résume pour le code PHP:
mysqli_fetch_row("SELECT * FROM maTable WHERE Nom LIKE '".$_POST["NomRecuDuFormulaireHTML"]."%' AND Prenom LIKE '".$_POST["PrenomRecuDuFormulaireHTML"]."%' ORDER BY Nom ASC, Prenom ASC", $LienDeMaBase);
Et ensuite pour echo je met tout ça dans une simple variable? :)

Mammouth du PHP | 881 Messages

18 déc. 2015, 20:30

Pour ma part, je préfère le faire en deux étapes, insérant entre les deux une vérification du nombre de résultats

Code : Tout sélectionner

$requete = "SELECT * FROM maTable WHERE Nom LIKE '".$_POST["NomRecuDuFormulaireHTML"]."%' AND Prenom LIKE '".$_POST["PrenomRecuDuFormulaireHTML"]."%' ORDER BY Nom ASC, Prenom ASC". $LienDeMaBase; $resultat = mysqli_query($requete); $Combien = mysqli_num_rows($resultat); $Contenu = mysqli_fetch_row($resultat); //Cette ligne sert à contrôler le nombre de //résultats obtenus. Dans certains cas, tu peux // décider d'orienter ailleurs l'usager qui ne // trouverait aucun résultat à sa requête. echo $Contenu["Nom"];
Attention, dans ton code tu avais écrit une virgule ( , ) après le guillemet suivant ASC et $LienDeMaBase; le caractère de concaténation de PHP est le point ( . )
Soyez artisans de paix

Eléphanteau du PHP | 29 Messages

18 déc. 2015, 21:06

Merci pour la réponse rapide!
J'ai essayé d'intégrer le code dans ma page, en modifiant les valeurs:

Code : Tout sélectionner

$dbCon = mysqli_connect("localhost", "root", "mon pass", "ma base"); $requete = "SELECT * FROM members WHERE jour LIKE '".$_POST["jour"]."%' AND mois LIKE '".$_POST["mois"]."%' ORDER BY jour ASC, mois ASC". $dbCon; $resultat = mysqli_query($requete); $Combien = mysqli_num_rows($resultat); $Contenu = mysqli_fetch_row($resultat); echo $Contenu;
Et là BAM! Error 500! Je regarde les logs et tombe sur ce message:
"PHP Catchable fatal error: Object of class mysqli could not be converted to string in /var/www/html/user_page.php on line 19"
Je regarde la fameuse ligne 19 et m'apercois que c'est la ligne de $requete, contenant le lien à ma base.
Attention, dans ton code tu avais écrit une virgule ( , ) après le guillemet suivant ASC et $LienDeMaBase; le caractère de concaténation de PHP est le point ( . )
Oui j'ai vu, j'ai corrigé ça en le remplacant par un point, sans succès...
J'ai donc adopté ma technique initiale:

Code : Tout sélectionner

$dbCon = mysqli_connect("localhost", "root", "mo pass", "ma base"); $requete = "SELECT * FROM members WHERE jour LIKE '".$_SESSION["jour"]."%' AND mois LIKE '".$_SESSOIN["mois"]."%' ORDER BY jour ASC, mois ASC"; $resultat = mysqli_query($dbCon, $requete); $Combien = mysqli_num_rows($resultat); $Contenu = mysqli_fetch_row($resultat); echo $Contenu;
Mais rien ne s'affiche...
J'echo donc mon $Combien et le serveur me retoure un "0" alors que j'ai bien 2 utilisateurs identiques dans ma base...

Eléphanteau du PHP | 29 Messages

18 déc. 2015, 21:16

J'ai fouillé un peu dans ma base et dans les colonnes concernées et y ai trouve=é quelques chose.
En survolant les colonnes "mois" et "jour" Phpmyadmin m'indique qu'en faisant shift+click sur la colonne je l'ajouterai à la close ORDER BY ou pour basculer ASC/DESC...
Des gens pour m'expliquer? :')

Mammouth du PHP | 881 Messages

18 déc. 2015, 21:20

Ta version semble a priori bonne.
Pour déboguer des commandes MyQSL, tu fais afficher ta requête avec un

Code : Tout sélectionner

echo $requete;
,
Tu copies-colles alors cette requête qui inclura la valeur des variables traitées dans dans ton interface PhpMyAdmin. Les erreurs te seront indiquées.
Par exemple, je suis surpris de lire

Code : Tout sélectionner

jour LIKE '".$_SESSION["jour"]."%'
Si jour est numérique, tu ne prendras pas LIKE ...%, mais =
Même chose pour le mois.
Retourne-nous la copie de la requête obtenue par echo $requete et tu verras, si besoin, nous verrons.
Soyez artisans de paix

Eléphanteau du PHP | 29 Messages

18 déc. 2015, 22:28

"MySQL a retourné un résultat vide (aucune ligne). (Traitement en 0.0002 secondes.)
SELECT * FROM members WHERE jour = '".$_SESSION["jour"]."%' AND mois = '".$_SESSION["mois"]."%' ORDER BY jour ASC, mois ASC"