Page 1 sur 1

Syntaxe de ma requête php qui ne fonctionne pas

Posté : 08 sept. 2007, 12:53
par dread
Bonjour à tous!

J'ai un soucis dans la syntaxe de ma requête php:
$query_rs_resultat = "SELECT * FROM tbl_bien, tbl_ville WHERE tbl_bien.ville_bien=tbl_ville.id_ville".$type.$piece.$budget.$ville." ORDER BY ".$_GET['tri']." ASC ";
Il me retourne :
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 'ASC' at line 1

Je me doute que le problème vient de l'utilisation des guillemets mais après plusieurs tentatives infructueuses, je n'ai pas réussi à régler mon problème qui est survenu lors de l'ajout du ORDER BY

Si quelqu'un pouvait me dire d'où le problème semble venir, je lui en serais reconnaissant.

Merci

Posté : 08 sept. 2007, 13:05
par jojolapine
Bonjour,
que donne un echo de ta requête?
(copie/colle le résultat içi stp ;) )

Posté : 08 sept. 2007, 13:44
par Ryle
Il faut TOUJOURS afficher la requête qui a été générée pour voir ce qui est envoyé à la base de données en cas d'erreur. C'est comme pour le html, on part de ce qu'on veut obtenir et on construit le code pour le générer :)

En l'occurence tbl_bien.ville_bien=tbl_ville.id_ville on imagine bien que c'es pour lier les deux tables, mais j'imagine que dans tes variables ".$type.$piece.$budget.$ville." (qui contiennent sans doute des "AND ...") tu n'as pas laissé d'espace et que tu te retrouves avec des instructions collées.. ou bien tu retrouver un WHERE ... bref, toujours afficher ;)

Posté : 08 sept. 2007, 13:50
par Calimero
Bonjour,

Essaye de rajouter un espace après la clause de jointure (juste après id_ville et avant le guillemet):
$query_rs_resultat = "SELECT * FROM tbl_bien, tbl_ville WHERE tbl_bien.ville_bien=tbl_ville.id_ville ".$type.$piece.$budget.$ville." ORDER BY ".$_GET['tri']." ASC "; 
Ça ne résoudra peut-être pas ton problème mais ça ne peut pas faire de mal :-) Et comme te le suggère jojolapine, il faut que tu voies à quoi ressemble cette requête avec les variables évaluées, c'est à dire telle que la reçoit mysql, tout simplement en faisant un echo juste après :
echo $query_rs_resultat;
EDIT : :arrow: oops, grilled by Ryle

Posté : 08 sept. 2007, 14:40
par dread
Merci pour vos réponses nombreuses et rapides.

J'affichais la syntaxe de ma requete avant que cela ne fonctionne plus et tout était ok.
Le problème c'est que je ne peux plus la voir depuis que j'ai l'erreur. Y a t-il un moyen de contourner?

En effet Ryle, mais variables contiennent bien des " AND ..." mais j'ai bien pensé à mettre des espaces.

Qui plus est, comme je le disais, tout fonctionnait avant que je ne rajoute le ORDER BY.

Voici un exemple de l'echo de ma requete sans le ORDER BY:
SELECT * FROM tbl_bien, tbl_ville WHERE tbl_bien.ville_bien=tbl_ville.id_ville AND type_bien <= 2 AND (nb_piece = 2 OR nb_piece = 3 OR nb_piece = 4) AND prix_bien >=150000 AND prix_bien <=1000000 AND (ville_bien = 32 OR ville_bien = 85 OR ville_bien = 175 OR ville_bien = 197 OR ville_bien = 263 OR ville_bien = 1)

Posté : 08 sept. 2007, 14:48
par ouckileou
ça ne résoudra pas ton problème mais voici la même requête sous une autre forme :

Code : Tout sélectionner

SELECT * FROM tbl_bien, tbl_ville WHERE tbl_bien.ville_bien=tbl_ville.id_ville AND type_bien <= 2 AND nb_piece IN (2, 3, 4) AND prix_bien BETWEEN 150000 AND 1000000 AND ville_bien IN (1, 32, 85, 175, 197, 263)
Est-ce que c'est pas plus lisible et donc, peut-être, plus facile à débugger ? :)

Posté : 08 sept. 2007, 14:53
par Ryle
Si ton problème vient depuis l'ajout du ORDER BY, la logique ne voudrait elle pas commencer par regarder par là et nous montrer la requête qui ne fonctionne pas AVEC le ordre by plutôt qu'une qui fonctionne bien sans ? ;)

Code : Tout sélectionner

ORDER BY ".$_GET['tri']." ASC
Es-tu sur que $_GET['tri'] est toujours renseigné ? contient-il bien le nom d'une des colonnes des tables ? n'y a-t-il pas d'ambiguité possible quant à l'appartenance de la colonne dans une table ou l'autre (autrement dit, est-elle préfixé du nom de la table ?) ...

Posté : 08 sept. 2007, 14:57
par dread
Je viens de trouver d'où venait mon problème mais j'étais loin de me douter que ça pouvait être ça.
je vous donne comment était déterminer ma variable $ville:
if (isset($_POST['ville_proche'])) {

	if ($_POST['ville'] != 'toutes') {
	
	// sélection des villes proches de la ville choisie
	$query_rs_ville_proche = "SELECT ville_bien, ville_proche1, ville_proche2, ville_proche3, ville_proche4, ville_proche5 FROM tbl_bien WHERE ville_bien='".$_POST['ville']."'";
	$rs_ville_proche = mysql_query($query_rs_ville_proche, $conn_rocher) or die(mysql_error());
	$row_rs_ville_proche = mysql_fetch_assoc($rs_ville_proche);

		$ville = " AND (ville_bien = ".$_POST['ville']." OR ville_bien = ".$row_rs_ville_proche['ville_proche1']." OR ville_bien = ".$row_rs_ville_proche['ville_proche2']." OR ville_bien = ".$row_rs_ville_proche['ville_proche3']." OR ville_bien = ".$row_rs_ville_proche['ville_proche4']." OR ville_bien = ".$row_rs_ville_proche['ville_proche5'].") ";
	}
} else {
	if ($_POST['ville'] != 'toutes') {
		$ville = " AND ville_bien = ".$_POST['ville'];
	}
}
Et à priori, sur la dernière ligne si je met à la place:
$ville = " AND ville_bien = '".$_POST['ville']."'";
tout semble fonctionner.

Merci à vous pour vous être penché sur mon problème, c'est sympa d'aider surtout un samedi.

Bon week-end à tout le monde!!

Posté : 08 sept. 2007, 16:16
par Shrell
Un petite précision :
En principe on ne devrait JAMAIS utiliser la clause WHERE pour les jointures, la clause ON est faire pour
donc au lieu de

Code : Tout sélectionner

"SELECT * FROM tbl_bien, tbl_ville WHERE tbl_bien.ville_bien=tbl_ville.id_ville ..."
il faudrait

Code : Tout sélectionner

"SELECT * FROM tbl_bien, tbl_ville ON tbl_bien.ville_bien=tbl_ville.id_ville WHERE ..."
Je sais ca n'a rien à voir avec le probleme, mais quand même ^^