Jump to content
Sign in to follow this  
Hyogapag

ORDER BY

Recommended Posts

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é.^^

Edited by Hyogapag

Share this post


Link to post
Share on other sites

Deux questions avant d'émettre une hypothèse.

Pourriez-vous remplacer chaque variable par un exemple ?

Pourquoi un LIKE ?

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

*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*

Edited by Julien L.

Share this post


Link to post
Share on other sites

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...

Edited by Hyogapag

Share this post


Link to post
Share on other sites

:fou: 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.^^

Edited by Hyogapag

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...