Requete entre deux tables

Pauloscorps
Invité n'ayant pas de compte PHPfrance

12 avr. 2011, 14:09

Bonjour à tous,

Voilà quelques jours déjà que je suis confrontée à un problème, d'apparence simple, mais qui s'est vite avéré compliqué.
Je dispose en fait de deux tables :

articles categories
idArticle idCat
idCat nomCat
titreArticle idParent
contenuArticle
photoArticle
descPhoto

J'aimerais en fait récupèrer le nom de la catégorie à partir de l'idCat que j'ai dans la table "articles", et... IMPOSSIBLE.
J'ai d'ores-et-déjà essayé la requete suivante :
' SELECT c.idCat, a.nomCat FROM articles a, categories c WHERE a.idCat=c.idCat and ' .$monArticle->idCat. ' = c.idCat;'; 
La synthaxe est certinament mauvaise (j'ai été obligée de la recopier sur le forum, mais je l'ai faites avec une synthaxe correcte et à chaque fois, j'ai eu le message "Trying to get property of non-object" etc.

Je vous prie donc de bien vouloir m'éclairer, parce que se prendre la tête pour des futilités pareilles, c'est dérangeant.

Merci d'avance,
Pauline.

Mammouth du PHP | 672 Messages

12 avr. 2011, 16:46

Trying to get property of non-object" => Essaye d'obtenir une propriété de quelque-chose qui n'est pas un objet.
Neuf chances sur dix que le problème vient de ton $monArticle->idCat...

Pauloscorps
Invité n'ayant pas de compte PHPfrance

13 avr. 2011, 10:09

Salut et merci de ta réponse,

En fait le problème survient lorsque j'essaie de faire $monArticle->nomCat, rectification.

Mammouth du PHP | 672 Messages

14 avr. 2011, 14:19

En fait le problème survient lorsque j'essaie de faire $monArticle->nomCat, rectification.
Trying to get property of non-object" => Essaye d'obtenir une propriété de quelque-chose qui n'est pas un objet.
Neuf chances sur dix que le problème vient de ton $monArticle->nomCat...
Tu peux déjà faire un echo $monArticle->nomCat histoire de voir ce que ça te retourne...

Pense aussi - juste pour les tests - à l'affichage des erreurs :
Sachant que la plupart des fonctions appelant une BDD retourne FALSE en cas d'erreur, et qu'on peut récupérer le message d'erreur (avec mysql_error() pour MySQL) tu peux l'afficher si problème.

Exemple avec les fonctions mysql_ :
$result = mysql_query ( $marequete) OR DIE ("Erreur sur $marequete : ".mysql_error() );

ViPHP
ViPHP | 3607 Messages

14 avr. 2011, 22:42

Bonsoir,
C'est normal que ça ne fonctionne pas, tu notes a.nomCat hors nomCat ne fait partit de la table articles...

Essaye cette requête:
SELECT
    a.*, 
    c.nomCat 
FROM 
    articles AS a, 
    categories AS c 
WHERE 
    a.idCat=c.idCat AND
    a.date_posted = NOW();
Normalement tu devrais avoir tes articles avec le nom de la catégorie associée.
Si tu veux tu peux aussi le faire avec une jointure explicite:
SELECT
    a.*, 
    c.nomCat 
FROM 
    articles AS a
JOIN
    categories AS c
ON
    c.idCat = a.idCat
WHERE
    a.date_posted = NOW() 
J'ai rajouté une condition bidon sur la selection des articles pour que tu comprennes où ça doit être placé...
Si tu as des questions...

devlop78
Invité n'ayant pas de compte PHPfrance

15 avr. 2011, 00:59

"Juste pour test". Je vais en profiter pour suggérer le passage à une extension plus appropriée telle que mysqli ou PDO. Le "OR DIE()" ne sera même plus nécessaire car en une seule ligne, l'extension renverra une exception en cas d'erreur. Et comme tu n'auras pas attrapée les exceptions, tu auras une erreur fatale (catchable error) avec un magnifique descriptif de ce qui ne va pas. Au pire, en production, tu pourras utiliser un ééééénorme try catch si tu n'as pas le courage de gérer les erreurs proprement.

Au fait Jojo La Pine (lol :) ), c'est 150 euros le prix pour participer au concourt Zend ?

ViPHP
ViPHP | 3607 Messages

15 avr. 2011, 08:50

Je ne sais pas exactement, c'était compris dans une formation anaska...
Mais à priori tout est indiqué ici : http://shop.zend.com/fr/php-certificati ... ucher.html

Ouala fin du HS

Eléphant du PHP | 57 Messages

18 avr. 2011, 15:42

Bonjour,

Merci des vos réponses.
J'ai testé ta requête Jojolapine, et a priori, je n'arrive pas à récupérer quelque chose :x

Voici mon code :
	
$req = 'SELECT a.*, c.nomCat FROM articles AS a, categories AS c WHERE a.idCat=c.idCat AND c.idCat = "'.$idCat.'";';
$result = mysql_query ($request, $connexion);
if (!empty($result) or die(mysql_error()))
{
        while ($categorie = mysql_fetch_object($result))
	{
		$nomCat = $categorie->nomCat;
		echo $nomCat;
	}
}
J'obtiens un magnifique "Undefined index" en ligne 26, c'est-à-dire : "$nomCat = $categorie->nomCat;".
Une suggestion ?

Mammouth du PHP | 672 Messages

18 avr. 2011, 15:53

J'obtiens un magnifique "Undefined index" en ligne 26, c'est-à-dire : "$nomCat = $categorie->nomCat;".
Une suggestion ?
print_r ( get_object_vars( $categorie) );

Eléphant du PHP | 57 Messages

18 avr. 2011, 16:17

Ah merci, je ne connaissais pas cette fonction et elle est bien utile :D
Pour ce qui est de ma requete, je n'arrive pas à trouver. J'ai tout le raisonnement logique, mais un niveau de la synthaxe, je n'y arrive pas. Je n'ai pas idée de comment rédiger cela :

On sait que a.idCat = c.idCat
Donc c.idCat prend la valeur de a.idCat
A partir de c.idCat, on récupère nomCat qui se trouve dans la même table.

Quelqu'un peut-il m'expliquer comment rédiger cela en PHP/MySQL ?

EDIT : Le texte affiché par print_r (get_objects_vars($categorie));

Array ( [idArticle] => 2 [idCat] => 5 [titreArticle] => Un titre ! [photoArticle] => http://localhost/smtk/photos/image.jpg [descPhoto] => alt de la photo [dateArticle] => 2011-04-07 14:12:49 [contenuArticle] => contenu de larticle) 

Eléphant du PHP | 57 Messages

26 avr. 2011, 09:53

Bonjour,

Je me permets de remonter cet article car je n'ai toujours pas trouvé la solution à mon problème, après plus d'une semaine de recherche.
Si une âme charitable voulait bien me donner cette solution et m'expliquer, ce serait super.

Merci d'avance, je désespère.

ViPHP
ViPHP | 2577 Messages

26 avr. 2011, 10:54

Bonjour,

Si on regarde le print_r que tu affiches, il n'y a pas de nomCat. Donc pas étonnant que tu aies une erreur.

Vérifie ton select, il fonctionne, mais de modif en modif tu as du supprimer nomCat de la liste des colonnes.

Mammouth du PHP | 881 Messages

26 avr. 2011, 17:57

As-tu appliqué le code de jojolapine
SELECT
    a.*, 
    c.nomCat 
FROM 
    articles AS a
JOIN
    categories AS c
ON
    c.idCat = a.idCat
WHERE
    a.date_posted = NOW()
Si oui, quels sont les résultats?
("Ça ne marche" n'est pas une réponse , on veut des détails).
Soyez artisans de paix

Eléphant du PHP | 57 Messages

03 mai 2011, 10:12

Bonjour,

Voici mon code, qui me renvoie :

Code : Tout sélectionner

Catchable fatal error: Object of class stdClass could not be converted to string in C:\wamp\www\SMTK\index.php on line 55
	/**************************************************************/
				/********* Trouver le nom de la catégorie parente *************/
				/**************************************************************/
				$req_nom_parent = 'SELECT c.nomCat FROM articles AS a JOIN categories AS c ON c.idCat = a.idCat WHERE c.idParent = '.$monArticle->idParent.';';
				$res_nom_parent = mysql_query($req_nom_parent, $connexion);
				if (!empty($res_nom_parent))
				{
					while ($nomParent = mysql_fetch_object ($res_nom_parent))
					{
						echo $nomParent;
					}
				}
				/**************************************************************/
				echo '<h4>' .$monArticle->titreArticle. '</h4>';
				echo '</div>';
				echo '<p class="chemin">' .$nomParent. '  >>  ' .$monArticle->nomCat. '</p>';
				echo '<div class="photo"><img src="' .$monArticle->photoArticle. '" title="' .$monArticle->descPhoto. '" alt="' .$monArticle->descPhoto. '"/></img></div>';
				echo '<p class="corpsBlog">' .$monArticle->contenuArticle. '</p>';
				echo '<div class="clear"></div>';
				echo '<div class="basbloc"></div>';
				echo '</div>';
La ligne 55 est le echo $nomparent.

Eléphant du PHP | 57 Messages

03 mai 2011, 11:15

Alors là je suis dégoutée. J'étais convaincue que cette requête allait fonctionner, et bah non. Comment ca se fait ? J'obtiens le même message d'erreur que précédemment. Je pensais vraiment y être arrivée...
				
$idParent = $monArticle->idParent;
				$req_nom_parent = 'SELECT nomCat FROM categories WHERE idCat = '.$idParent.';';
				$res_nom_parent = mysql_query($req_nom_parent, $connexion);
				if (!empty($res_nom_parent)) {
					while ($nomParent = mysql_fetch_object ($res_nom_parent)){
						echo $nomParent;
					}
				}
	
Là je pense que la requête est bonne, mais que le problème vient de l'exploitation de son résultat.

EDIT : Youpi ca marche, c'était effectivement bien un problème de PHP ! :mrgreen:
Voici la solution :
				$idParent = $monArticle->idParent;
				$req_nom_parent = 'SELECT * FROM categories WHERE idCat = '.$idParent.';';
				$res_nom_parent = mysql_query($req_nom_parent, $connexion);
				while($parent = mysql_fetch_object($res_nom_parent))
				{
		
				echo '<h4>' .$monArticle->titreArticle. '</h4>';
				echo '</div>';
				echo '<p class="chemin">' .$parent->nomCat. '  >>  ' .$monArticle->nomCat. '</p>';
				echo '<div class="photo"><img src="' .$monArticle->photoArticle. '" title="' .$monArticle->descPhoto.'" alt="' .$monArticle->descPhoto. '"/></img></div>';
				echo '<p class="corpsBlog">' .$monArticle->contenuArticle. '</p>';
				echo '<div class="clear"></div>';
				echo '<div class="basbloc"></div>';
				echo '</div>';
Merci à tous ceux qui ont participé à cette discussion.