Problème de LEFT JOIN dans une requête

Invité
Invité n'ayant pas de compte PHPfrance

25 nov. 2008, 01:21

Bonjour à tous, j'ai un soucis avec un requête SQL, quand je l'éxécute dans phpmyadmin elle fonctionne mais quand elle est dans mon script elle ne fonctionne pas.
Voici la requête :
$req="SELECT a.* FROM article a, createur c1, marque m1 LEFT JOIN createur c ON (a.id_vendeur = c.id) LEFT JOIN marque m ON (a.id_vendeur=m.id) WHERE a.nom LIKE '%".$_SESSION['mot_recherche']."%' AND a.stock!='0' AND a.publie='1' AND c1.publie='1' AND m1.publie='1' AND a.id_parent=0 GROUP BY a.id";
la requête est pourtant bonne mais j'ai cette erreur à l'éxécution :
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in

Voila voila si quelqu'un a une idée.

Merci d'avance à tous.

Mammouth du PHP | 881 Messages

25 nov. 2008, 06:11

Pour aider à corriger une requête, rien ne vaut le test des fonctions SQL dans la fenêtre PHPmyAdmin.

Pour le reste, il nous est un peu difficile d'aider sans les structures de table. Bien lire les règlements, ton message aurait dû être dans MySQL, à mon avis.

Si tu veux un truc pour vérifier des requêtes longues: sépare-les en autant de lignes que tu as de commandes ou de fonctions structurantes, ains:
$req="SELECT a.* ";
$req.="FROM article a, createur c1, marque m1 ";
$req.="LEFT JOIN createur c ON (a.id_vendeur = c.id) ";
$req.="LEFT JOIN marque m ON (a.id_vendeur=m.id) ";
$req.="WHERE a.nom LIKE '%";
Voici les différences entre ta commande et celle que je te propose:
- Je ne comprends pas ce que font "createur c1" et "marque m1" entre FROM et JOIN.
- Les parenthèses sont inutiles.
- C'est toujours plus facile pour l'humain d'avoir tous les mots clefs (j'aime bien les AS)
- Inverse les comparaison me semble souvent utile.
- Un WHERE sans critère de sélection ou avec critère % n'est pas utile.
- Ça prend un point-virgule (;) à la fin d'une commande PHP, pas un point (.)
Essaye ceci:
$req="SELECT a.* ";
$req.="FROM article AS a ";
$req.="LEFT JOIN createur AS c ON c.id = a.id_vendeur  ";
$req.="LEFT JOIN marque AS m ON m.id = a.id_vendeur ";

Soyez artisans de paix

Invité
Invité n'ayant pas de compte PHPfrance

25 nov. 2008, 16:48

Merci pour ta réponse, j'ai essayé mais sans succès.
En fait je vais détailler un peu mieux la structure de ma table et ce à quoi je veux arriver parce que c'est vrai que sans connaître la structure des tables c'est difficile à imaginer.

J'ai une table "article", une table "marque" et une table "mes_creations".
Un article appartient soit a une marque soit a une de mes creations.
Un article peut etre publie sur le site ou non tout comme une marque ou une catégorie de "mes créations".

Je désire afficher tous les articles qui sont publie et qui appartiennent à une marque ou à mes créations eux même publié (si la marque ou la catégorie de mes créations n'est pas publié sur le site, l'article ne doit pas apparaitre).
Et j'aimerai que la requête affiche uniquement les article qui contiennent le mot recherché.

D'où ma requête :
$req="SELECT a.* "; 
$req.="FROM article AS a "; 
$req.="LEFT JOIN mes_creations AS c ON c.id = a.id_vendeur "; 
$req.="LEFT JOIN marque AS m ON m.id = a.id_vendeur ";
$req.="WHERE a.nom LIKE '%".$_SESSION['mot_recherche']."%' "; 
$req.="AND a.publie=1 ";
$req.="AND a.stock!=0 ";
$req.="AND c.publie!=0 ";
$req.="AND m.publie!=0 ";
Mais cette requête ne me donne rien, en fait c'est un problème de requêtage.
Je ne vois pas très bien comment obtenir le résultat que je cherche.

Je sais simplement que ça doit être une requête multitable avec les trois tables :"article", "marque" et "mes_creations" ...
L'attribut "publie" est à 0 si l'article, la marque ou la catégorie de "mes_creations" n'est pas publié et l'attribut est à 1 s'ils sont publiés.

Voila voila, je suis vraiment bloqué.

Donc si quelqu'un a une petite idée.

Merci d'avance

Mammouth du PHP | 881 Messages

25 nov. 2008, 21:34

Voici ce que je te propose ... nous allons construire une requête étape par étape, sans perdre de vue l'objectif final. Il y a, dans de telles requêtes, de nombreux pièges à orthographe, Nous les éliminerons ainsi un à un. À chaque étape, tu valides la chose dans PhpMyAdmin via le taquet "SQL". Tu notes les messages d'erreur en chemin et corriges jusqu'à ce que l'étape donne des résultats valides.

pour faire le test dans PhpMyAdmin, tu ajoutes à ton programme PHP une ligne qui te retournera la requête précise qui sera traitée par MySQL
Dans le cas présent:
echo $req.'</br>';
Pour commencer:
$req="SELECT a.* ";  
$req.="FROM article AS a ";  
echo $req.'</br>';
Ensuite ...
$req="SELECT a.* ";  
$req.="FROM article AS a ";  
$req.="WHERE a.nom LIKE '%".$_SESSION['mot_recherche']."%' ";  
echo $req.'</br>';
$req="SELECT a.* ";  
$req.="FROM article AS a ";  
$req.="LEFT JOIN mes_creations AS c ON c.id = a.id_vendeur ";  
$req.="WHERE a.nom LIKE '%".$_SESSION['mot_recherche']."%' ";  
echo $req.'</br>';
...
$req="SELECT a.* ";  
$req.="FROM article AS a ";  
$req.="LEFT JOIN mes_creations AS c ON c.id = a.id_vendeur ";  
$req.="WHERE a.nom LIKE '%".$_SESSION['mot_recherche']."%' ";  
$req.="AND a.publie = 1 "; 
$req.="AND a.stock > 0 "; 
echo $req.'</br>';
...
$req="SELECT a.* ";  
$req.="FROM article AS a ";  
$req.="LEFT JOIN mes_creations AS c ON c.id = a.id_vendeur ";  
$req.="WHERE a.nom LIKE '%".$_SESSION['mot_recherche']."%' ";  
$req.="AND a.publie = 1 "; 
$req.="AND a.stock > 0 "; 
$req.="AND c.publie > 0 "; 
echo $req.'</br>';
...
$req="SELECT a.* ";  
$req.="FROM article AS a ";  
$req.="LEFT JOIN mes_creations AS c ON c.id = a.id_vendeur ";  
$req.="LEFT JOIN marque AS m ON m.id = a.id_vendeur "; 
$req.="WHERE a.nom LIKE '%".$_SESSION['mot_recherche']."%' ";  
$req.="AND a.publie = 1 "; 
$req.="AND a.stock > 0 "; 
$req.="AND c.publie > 0 "; 
$req.="AND m.publie > 0 ";
echo $req.'</br>';

Malgré tout cela, je garde soupçon de la valeur que tu obtiens de la variable $_SESSION['mot_recherche']
Si tu obtiens sa valeur d'un formulaire POST ou GET, ce n'est pas $_SESSION, mais bien POST ou GET, ainsi: $_POST['mot_recherche'] ou $_GET['mot_recherche']


Tiens nous au courant des modifications apportées à ta requête et des résultats obtenus à chaque étape.
Soyez artisans de paix

Invité
Invité n'ayant pas de compte PHPfrance

26 nov. 2008, 15:08

Merci pour ta réponse très constructive, donc j'ai bien testé tout ce que tu m'as dit et étape par étape, la requête ne donne pas le résultat que je veux obtenir à partir de cette étape :
$req="SELECT a.* ";   
$req.="FROM article AS a ";   
$req.="LEFT JOIN mes_creations AS c ON c.id = a.id_vendeur ";   
$req.="WHERE a.nom LIKE '%".$_SESSION['mot_recherche']."%' ";   
$req.="AND a.publie = 1 ";  
$req.="AND a.stock > 0 ";  
$req.="AND c.publie > 0 ";  
echo $req.'</br>'; 
Quand le rajoute le $req.="AND c.publie > 0 "; ça fait du nimporte quoi ...
C'est le problème que je ne pige pas depuis le début.

Concernant la $_SESSION['mot_recherche'], elle est bonne, quand j'affiche la requête je vois bien le mot recherché.

Donc le problème vient uniquement de cette ligne : $req.="AND c.publie > 0 ";
Mais pourquoi ? ça c'est la question que je me pose depuis 2 jours déjà.

Invité
Invité n'ayant pas de compte PHPfrance

26 nov. 2008, 15:38

En fait soit je continue dans ce sens à faire une requête multitables soit il y a une possibilité en sql que je ne connais pas et qui dit qu'on peut faire quelque chose du genre :

$req="SELECT *
FROM article AS a
WHERE a.nom LIKE '%".$_SESSION['nom']."%'
AND a.publie=1
AND a.publie=(SELECT publie FROM mes_creations c WHERE id=a.id_vendeur) //je ne sais
// pas comment le traduire en sql
AND a.stock>0

Voila y a t il un moyen en sql de faire la même chose ?
Je pose le problème différemment parce qu'il est fort probable que certains ne comprennent pas exactement ce à quoi je veux aboutir.

Invité
Invité n'ayant pas de compte PHPfrance

26 nov. 2008, 16:53

Bon ça y est j'ai trouvé en fait il fallait faire une union sql des deux requêtes, et voila le résultat :
$req="SELECT a.*
FROM article a
LEFT JOIN marque m ON a.id_vendeur = m.id
WHERE a.publie = 1
AND m. publie = 1
AND a. stock > 0
AND a.id_parent = 0
AND a.nom LIKE '%".$_SESSION['mot_recherche']."%'
UNION
SELECT a.*
FROM article a
LEFT JOIN mes_creations c ON a.id_vendeur = c.id
WHERE a.publie = 1
AND c. publie = 1
AND a. stock > 0
AND a.id_parent = 0
AND a.nom LIKE '%".$_SESSION['mot_recherche']."%'
";

Mammouth du PHP | 881 Messages

26 nov. 2008, 20:33

Félicitations!!!

Si je comprends, c'est résolu.

Peut-être ceci aurait fonctionné aussi:
$req="SELECT a.* ";    
$req.="FROM article AS a ";    
$req.="LEFT JOIN mes_creations AS c ON c.id = a.id_vendeur ";    
$req.="WHERE a.nom LIKE '%".$_SESSION['mot_recherche']."%' ";    
$req.="( AND a.publie = 1 ";   
$req.="AND a.stock > 0 ) ";   
$req.="OR c.publie > 0 ";   
echo $req.'</br>';
Soyez artisans de paix