Hyogapag Posté 11 Mars 2006 Posté 11 Mars 2006 (modifié) Bonjour. Je me suis lancé dans la programmation il y a quelque temps et jusque là tout allait bien. J'ai fait pas mal de trucs que je trouvais assez compliqués, et je ne pensais pas que ce détail allait me poser problème : je l'avais donc gardé pour la fin, puisque c'est un peu du fignolage. Mais voilà : je peux mettre ORDER BY suivi de n'importe quel nom de champ : ça ne change rien au classement. En effet, les résultats sont toujours classés par ordre croissant d'id (id est le premier champ de ma table). Avez-vous une idée de l'origine du problème? Si ça peut vous aider, voici ma requète : $requete = "SELECT * FROM $bd_personnages.$table_cartes_identite WHERE $champ_classement LIKE '$valeur_classement' AND id BETWEEN $limite_min AND $limite_max ORDER BY nom"; Merci d'avance. PS : si vous pensez que ça peut venir du reste du code, je peux le poster, mais comme il est assez long et que je vois pas en quoi il pourrait jouer, je ne l'ai pas posté. Modifié 11 Mars 2006 par Hyogapag
Julien L. Posté 11 Mars 2006 Posté 11 Mars 2006 Deux questions avant d'émettre une hypothèse. Pourriez-vous remplacer chaque variable par un exemple ? Pourquoi un LIKE ?
Hyogapag Posté 11 Mars 2006 Auteur Posté 11 Mars 2006 Pour Gilbert : Merci, mais ce que tu proposes ne semble pas fonctionner. Si je prends la syntaxe que tu proposes, j'obtiens le message : Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in C:\Program Files\WAMP5\www\index.php on line 89 Si je mets plutôt : $requete = "SELECT * FROM $bd_personnages.$table_cartes_identite WHERE ($champ_classement LIKE '$valeur_classement' AND id BETWEEN $limite_min AND $limite_max ) ORDER BY nom"; ça ne change rien à mon problème (classement non affecté). Pour Julien L. : Tout d'abord, un petit exemple : $requete = "SELECT * FROM personnages.cartes_identite WHERE pays_origine LIKE 'URSS' AND id BETWEEN 1 AND 12 ORDER BY nom"; Quant au LIKE, je dois dire que je me suis appuyé sur ce cours pour apprendre les rudiments des requêtes SQL. On y trouve ce paragraphe : Il faut ajouter à ces opérateurs arithmétiques classiques les opérateurs suivants : expr1 BETWEEN expr2 AND expr3 vrai si expr1 est compris entre expr2 et expr3, bornes incluses expr1 IN (expr2, expr3, ...) vrai si expr1 est égale à l'une des expressions de la liste entre parenthèses expr LIKE chaine où chaine est une chaîne de caractères pouvant contenir l'un des caractères jokers : _ remplace exactement 1 caractère Sachant que la variable que je souhaitais intégrer au prédicat était de type string (une chaîne donc), il m'a semblé logique d'utiliser l'opérateur LIKE. Sinon, je suis toujours en train de chercher une solution. Je cherche une solution dans le sens de ce qu'a proposé Gilbert, à savoir de jouer avec les parenthèses. Mais pour l'instant je vais me coucher. Bonne nuit à tous.
Julien L. Posté 12 Mars 2006 Posté 12 Mars 2006 (modifié) *plop* Le LIKE n'est pas nécessaire lorsque vous savez précisement ce que vous recherchez. DESC précise le sens du tri. Voici une fonction utile : function sql($v){ if (get_magic_quotes_gpc()) { $v = stripslashes($v); } if (!is_numeric($v)) { $v = "'" . mysql_real_escape_string($v) . "'"; } return $v;} Elle permet d'éviter les injections SQL. *plop* Modifié 12 Mars 2006 par Julien L.
Hyogapag Posté 12 Mars 2006 Auteur Posté 12 Mars 2006 (modifié) Désolé Julien, mais aucune de tes méthodes ne résout mon problème. La première me renvoie l'erreur : Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in F:\Pierre-Amiel\travaux\www\index.php on line 88 tandis que la deuxième ne change strictement rien. Je ne sais pas si cela a une importance, mais le champ id est ma clé d'index primaire. PS : qu'est-ce qu'une injection SQL au fait? PS bis : En fait ta deuxième méthode ne marche plus non plus maintenant (je ne l'avais pas testéé sur le même serveur hier soir, faut que je regarde ça de plus près...) PS ter : j'ai tenté de faire une requête avec l'exemple que j'avais fourni à JUlien, c'est-à-dire en remplaçant les variables par des valeurs entrées "manuellement" dans la requête. Là, le ORDER BY fonctionne... Modifié 12 Mars 2006 par Hyogapag
Julien L. Posté 12 Mars 2006 Posté 12 Mars 2006 (modifié) Les injections : http://php.belnet.be/manual/fr/security.da...l-injection.php *plop* Modifié 12 Mars 2006 par Julien L.
Hyogapag Posté 12 Mars 2006 Auteur Posté 12 Mars 2006 (modifié) Bon j'ai trouvé la solution. Le problème venait d'ailleurs, de bien au-delà de ce que j'imaginais... Julien, aucun des derniers codes que tu a écrit ne fonctionne : tous retournent le même erreur que celle que j'ai déjà montré. En fait, sur ma page, il y a deux requêtes SQL : une pour compter le nombre total de résultats (la même que celle ci-dessus mais sans les limites), et celle que je vous ai montré, qui régulait l'affichage de la page proprement dite. Il me semblait donc logique de jouer sur cette dernière requête pour le classement. Visiblement je me trompais lourdement. J'ai mis le ORDER BY dans la première requête et tout fonctionne à présent. Je suis assez confus. En semaine, je n'ai pas le net (j'ai seulement mon manuel php en PDF et une copie d'un site sur les requêtes SQL), et je suis bien obligé de me débrouiller seul. A force de suer, je finis par arriver à mes fins. J'aurais pu trouver la solution tout seul (en fait je l'ai trouvé tout seul ), ou plutôt sans vous déranger. Je suis vraiment confus. C'est vraiment une erreur de débutant (enfin c'est ce que je suis d'un autre côté...). Je suis désolé. J'aimerais toutefois, comprendre pourquoi le classement d'une deuxième requête n'annule pas celui de la précédente. Si quelqu'un pouvait m'expliquer... Merci pour tout. J'espère pouvoir un jour aider d'autres débutants, mais avant d'arriver à ce stade, j'ai beaucoup de progrès à faire. Modifié 12 Mars 2006 par Hyogapag
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant