[MySQL] [PHP] Requête avec jointure qui ne marche pas

Bonjour,

J’obtiens toujours des erreurs parce qu’il ne connaît pas les variables, mais je viens de me rendre compte ma requête ne donne aucun résultat.

Voici le code avec la requête et les résultats de celle-ci :

$id = $_GET["id"];

$infosArticleRequest = $db->prepare("SELECT a.title, a.author, a.date, a.time, a.main-category, c.name, c.color
FROM articles a
INNER JOIN categories c
ON a.main-category = c.name
WHERE a.id = :id");
$infosArticleRequest->execute(array(
	"id" => $id
));

while ($infosArticle = $infosArticleRequest->fetch()) {
	$title = $infosArticle["title"];
	$author = $infosArticle["author"];
	$publicationDate = $infosArticle["date"];
	$publicationTime = $infosArticle["time"];
	$mainCategoryId = $infosArticle["main-category"];
	$mainCategoryName = $infosArticle["name"];
}

$infosArticleRequest->closeCursor();

J’ai mal fait la jointure ? J’ai toujours eu du mal avec les jointures.

Merci

Salut,

Je suppose que tu utilises la variante PDO pour l’accès à ta base de données.

Essaie ceci :

$infosArticleRequest = $db->prepare("SELECT a.title, a.author, a.date, a.time, a.main-category, c.name, c.color
FROM articles a
INNER JOIN categories c
ON a.main-category = c.name
WHERE a.id = :id");
$infosArticleRequest->bindParam(':id', $id);
$infosArticleRequest->execute();

Salut,

Effectivement j’utilise PDO, par contre la requête de marche pas. Je n’ai toujours aucun résultat.

Et la table a l’air d’être correct sur phpMyAdmin.

La seule raison que je verrais, alors, c’est que tu n’as aucun éléments de la table « categories » dont le champ « main-category » a une correspondance de clé avec le champ « name » de la table « articles ». Le « INNER JOIN » fait qu’aucun enregistrement n’est retourné dans ce cas là. Pour obtenir les articles malgré le fait que la catégorie n’est pas reconnue/retrouvée, il faut utiliser un « LEFT OUTER JOIN »

Hey !

Tous les champs existent. Le but est qu’on indique dans main-category l’id correspondant dans la table categories. Ensuite, on récupère et les infos de articles et les infos de categories.

EDIT : Même avec le LEFT OUTER JOIN ça ne marche pas.

Bonjour,
Tu fais une jointure sur a.main-category = c.name
Dans ton message du 2 janvier, on voit que le main-category est un entier
Tu dois donc avoir dans ta table categories une colonne id probablement
C’est cette colonne que tu dois utiliser pour la jointure
a.main-category = c.id
Bon courage

C’est étrange, car un LEFT OUTER JOIN devrait à minima te lister les enregistrements de la table articles.

La connexion à la DB est OK ? C’est-à-dire que la commande suivante retourne bien un objet : $db = new PDO('mysql:host=localhost;dbname=xxxx', $user, $pass);

La création de cette connexion est dans un try ... catch ? N’arrives-tu pas dans le catch ?

Est-ce que tu n’aurais pas une seconde base de données avec la même table mais vide et sur laquelle tu te connectes mais qui n’est pas la bonne ?

Alors oui j’ai vu Sandrine j’ai corrigé avec un c.id (mais comme ça ça ne marche pas). Palo, la connexion se fait dans un fichier includes/init.php qui marche puisqu’il récupère les catégories dans le menu et dans le footer.

Peux-tu tester ta requête dans un SQL Browser avec une valeur pour :id valide ?
Si ta requête renvoie le résultat attendu, c’est soit ta variable :id qui ne contient pas la bonne valeur, soit ton connecteur.
Si ta requête ne renvoie rien, peux-tu nous donner la description des 2 tables et une partie de leur contenu ?

Hey !

Alors euh…

Dans la table articles. On a l’id, le titre, l’auteur (jointure vers une table users), la date, l’heure, et la catégorie principale (pour la couleur).

Avec l’id on va récupérer la version la plus récente dans articles-contents.

Ensuite dans categories on a l’id, le titre, la couleur, et un bool menu pour savoir si ça s’affiche ou pas dans… le menu :slight_smile:

Après c’est le même système que dans d’autres sites que j’ai fait pourtant là ça marche pas.

Par contre je ne sais pas ce que c’est un SQL Browser. Tu veux dire une ligne de commande ?

Merci :slight_smile:

:slightly_smiling_face:
Dans ton phpMyAdmin, tu dois pouvoir exécuter une requête (query). C’est là que j’aimerais que tu testes ta requête.

Ah ok merci.

Je crois j’ai compris

#1054 - Unknown column 'a.main' in 'field list'

Je récupère ça. Du coup, à cause du tiret, main-category deviens main. Du coup je vais l’appeler mainCategory.

Effectivement maintenant ça marche. Merci !

Ah mais oui, tellement évident que ça nous a échappé. a.main-category revient à dire a.main - category. Ce qui veut dire le champ a.main moins le champs category. Et comme a.main n’existe pas l’analyse de la requête s’arrête là.

Normalement, le nom d’un champ MySQL peut être composé de lettres, chiffres, des caractèrs $ et _ (Plus d’autres règles). Autrement, il faut mettre le nom entre backticks (par exemple `a.main-category`)