Page 1 sur 1
Requete entre deux tables
Posté : 12 avr. 2011, 14:09
par Pauloscorps
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.
Re: Requete entre deux tables
Posté : 12 avr. 2011, 16:46
par macgawel
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...
Re: Requete entre deux tables
Posté : 13 avr. 2011, 10:09
par Pauloscorps
Salut et merci de ta réponse,
En fait le problème survient lorsque j'essaie de faire $monArticle->nomCat, rectification.
Re: Requete entre deux tables
Posté : 14 avr. 2011, 14:19
par macgawel
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() );
Re: Requete entre deux tables
Posté : 14 avr. 2011, 22:42
par jojolapine
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...
Re: Requete entre deux tables
Posté : 15 avr. 2011, 00:59
par devlop78
"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 ?
Re: Requete entre deux tables
Posté : 15 avr. 2011, 08:50
par jojolapine
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
Re: Requete entre deux tables
Posté : 18 avr. 2011, 15:42
par Pauloscorps
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
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 ?
Re: Requete entre deux tables
Posté : 18 avr. 2011, 15:53
par macgawel
J'obtiens un magnifique "Undefined index" en ligne 26, c'est-à-dire : "$nomCat = $categorie->nomCat;".
Une suggestion ?
print_r ( get_object_vars( $categorie) );
Re: Requete entre deux tables
Posté : 18 avr. 2011, 16:17
par Pauloscorps
Ah merci, je ne connaissais pas cette fonction et elle est bien utile
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)
Re: Requete entre deux tables
Posté : 26 avr. 2011, 09:53
par Pauloscorps
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.
Re: Requete entre deux tables
Posté : 26 avr. 2011, 10:54
par Mazarini
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.
Re: Requete entre deux tables
Posté : 26 avr. 2011, 17:57
par Patriboom
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).
Re: Requete entre deux tables
Posté : 03 mai 2011, 10:12
par Pauloscorps
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.
Re: Requete entre deux tables
Posté : 03 mai 2011, 11:15
par Pauloscorps
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 !
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.