[RESOLU] mysql: ORDER BY modifié ne se fait pas

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] mysql: ORDER BY modifié ne se fait pas

Re: [RESOLU] mysql: ORDER BY modifié ne se fait pas

par Boro64 » 15 août 2013, 12:10

=D> Merci moogli, j'ai (enfin!) compris!
Et merci pour les noms de client sql, je regarde ça dans la foulée.
Encore merci§
Tchô

Re: [RESOLU] mysql: ORDER BY modifié ne se fait pas

par moogli » 15 août 2013, 12:06

type_famille c'est dans le prédicat (le where) et il s'agit d'une chaîne de caractère donc délimitation par des ' obligatoire (c'est une chaîne de caractères ;) )

Par contre le order by demande un nom ou un numéro de colonne et cela n'entre pas dans le cadre d'une chaîne de caractère donc pas de ' autour.

Si tu regarde la doc de mysql sur la syntaxe de select, tu verra que le order by peux prendre un entier (le numéro de colonne qui est déprécié et supprimé de la norme sql), le nom de la colonne ou une formule. Sur ce dernier point ne ne suis pas trop au fait, mais c'est ce qui doit faire que que la requête est syntaxiquement correct.

Pour le client sql j'utilise heidi sql que je trouve pas mal et suffisant pour ce que j'en fait.
Pma est bien mais parfois un peu lourd je trouve.
Avec mysql tu peux aussi utiliser mysql workbench qui est pas trop mal non plus

@+

Re: [RESOLU] mysql: ORDER BY modifié ne se fait pas

par Boro64 » 15 août 2013, 11:46

Bonjour moogli,
et merci pour l'explication; j'avais bien testé/affiché la requête et elle me retournait pourtant bien
SELECT * FROM TABLE WHERE 'machin' ORDER BY 'truc'
.
Ce que je ne comprends pas, c'est pourquoi la 1ere variable ($type_famille) n'a pas besoin de ' ' et la 2de oui. :shock:
Pour l'utilisation d'un client sql, j'adopte (si toi ou un -e- autre avez un nom autre que phpmyadmin à me proposer, là aussi je suis preneur...sinon je demanderai à m'sieur google): c'est en voyant ce que phpmyadmin faisait que j'en suis venu à tester cette "écriture" de commande qui continue à m'interroger...
Ceci étant dit, merci encore à toi et xTG (et le reste de la communauté) comme d'hab' !

Re: [RESOLU] mysql: ORDER BY modifié ne se fait pas

par moogli » 15 août 2013, 11:20

La différence entre le deux dernière requête c'est que tu as mis des ' autour de la donnée du order by.

Du coup tu as quelque chose chose sa :
select * from table order by 'truc' 
Ce n'est pas syntaxique ment incorrect mais pas conforme à ce que tu attend.

Il faut toujours tester les requêtes, pour çela tu l'affiche une fois la chaîne formée et tu utilise une client sql.

Derniers chose, la concaténation améliore la lisibilité du code et évite les problèmes dû a une incompréhension du parseur.

@+

Re: mysql: ORDER BY modifié ne se fait pas

par Boro64 » 15 août 2013, 10:51

Alors là..........c'est la 1ere fois que je rencontre ça !
Je viens de trouver la solution en testant plusieurs ré-écritures et finalement en écrivant:
			$sql1 = "SELECT * FROM produits WHERE sous_famille = '$type_famille' ORDER BY ".$ordre." LIMIT ".$_GET['debut'].','.$nb_affichage_par_page;
ça marche!!! :shock:
" " plus la concaténation sur la variable $ordre mais pas sur la 1ere $type_famille....c'est bon?
Ok, je suis content, mais si quelqu'un peut m'expliquer, je suis preneur!

[Edit]: je passe le sujet en résolu, mais si vous avez une explication, je suis preneur. Merci.

Re: mysql: ORDER BY modifié ne se fait pas

par Boro64 » 15 août 2013, 10:23

Bonjour xTG,
La requête d’exécution me renvoie bien les produits demandés, c'est la partie "classement" qui, elle, ne s'effectue pas.
J'ai testé avec phpmyadmin, et j'obtiens les résultats attendus...???? :shock: :-k
Et la commande
$req1 = mysql_query($sql1) or die ('Erreur lors de la requête '.$sql1.'<br />'. mysql_error());
ne me renvoie aucune erreur... :cry:
Une idée?

Re: mysql: ORDER BY modifié ne se fait pas

par xTG » 15 août 2013, 09:44

As-tu regardé le retour de la commande d'exécution de la requête ?
As-tu essayé de copier/coller la requête générée dans un exécuteur (par ligne de commande ou via un logiciel tel que phpmyadmin) ?

mysql: ORDER BY modifié ne se fait pas

par Boro64 » 15 août 2013, 09:18

Bonjour,
Pour un affichage de produits j'utilisais un classement alphabétique classique en appelant:
SELECT * FROM produits WHERE sous_famille = '$type_famille' ORDER BY nom_pdt LIMIT ".$_GET['debut'].','.$nb_affichage_par_page;
(où $_GET['debut'].','.$nb_affichage_par_page est une barre de pagination)
Utilisé ainsi, l'affichage par ordre alphabétique se fait bien donc...MAIS pour pouvoir modifier cet ordre (alpha. inversé, du - cher au + cher et inversement), j'ai mis en place une liste déroulante
			<select name="tri">
				<option value=""></option>
				<option value="abc">de A à Z (par défaut)</option>
				<option value="cba">de Z à A</option>
				<option value="prix-">du - cher au + cher</option>
				<option value="prix+">du + cher au - cher</option>
			</select>
Je récupère $_POST issu de cette liste et je la passe à la moulinette d'un switch:
	switch ($tri){
	case "abc":
	$ordre = "nom_pdt ASC";
		break;
			case "cba":
			$ordre = "nom_pdt DESC";
			break;
				case "prix-":
				$ordre = "prix_pdt ASC";
				break;
					case "prix+":
					$ordre = "prix_pdt DESC";
					break;
		default:
		$ordre = "nom_pdt ASC";
		break;
}
Jusque là pas de problème.
Ma commande sql devient alors:
"SELECT * FROM produits WHERE sous_famille = '$type_famille' ORDER BY '$ordre' LIMIT ".$_GET['debut'].','.$nb_affichage_par_page;
Et là est le problème:
Pas d'affichage en fonction de la demande, et par défaut: pas d'affichage alphanumérique, mais par id croissant. :shock:
NB: Si je fais un echo de ma commande sql, l'ordre de tri est bien conforme à la demande

Auriez vous une idée du pourquoi l'interprétation de la commande ne se fait pas et une piste pour arriver à mes fins ?
D'avance merci.