Je suis en train de faire un système de news avec plusieurs tables :
table "news" : la table principale du système où j'enregistre les informations principales de la news : le nombre de commentaires, le titre, le sous-titre, l'image de la news, etc...
table "news_version" : table où j'enregistre le texte de la news et l'id du membre qu'il l'a écrit. Plusieurs membres peuvent écrire une même news et j'enregistre chaque modification dans cette table.
table "commentaires" : ici je stock les commentaires des news. Je ne m'attarde pas plus dessus, ce n'est pas là que ce situe mon problème.
J'essaie sur ma page d'accueil de récupérer la dernière news publiée (avec le titre, la date et tous les contributeurs non mineurs) sur le site avec cette requête :
$requete = $bdd->prepare('SELECT n.id, n.titre, n.date, n.image, n.nombre_commentaires, n.id_dernier_commentaire,
nv.texte,
(SELECT NV.id_membre, M.pseudo
FROM news_version NV
INNER JOIN membres M ON M.id = NV.id_membre
WHERE NV.id_news = n.id AND NV.contribution_mineure = :contribution_mineure)
FROM news n
INNER JOIN news_version nv ON nv.id = n.id_derniere_version
WHERE n.etat = :etat ORDER BY n.id DESC LIMIT 0, 1') or die(print_r($bdd->errorInfo()));
$requete->execute(array('etat' => 3, 'contribution_mineure' => 0));
$donnees = $requete->fetchAll();
Ma requête ne s'effectue pas (elle ne retourne pas de résultat) mais elle n'affiche pas d'erreurs malgré le ordie(print_r($bdd->errorInfo()));
Si quelqu'un pouvait m'aider à résoudre mon problème en m'indiquant ce qui ne va pas (pour apprendre de mes erreurs) ce serait vraiment sympa !
Il pourrait être intéressant de nous donner le schéma de tes tables ainsi qu'un jeu d'essai et le résultat attendu en fonction dudit jeu d'essai pour qu'on puisse t'aider.
CREATE TABLE `news` (
`id` int(11) NOT NULL auto_increment,
`id_createur` int(11) NOT NULL,
`ip_createur` int(10) NOT NULL,
`id_derniere_version` int(11) NOT NULL,
`mode_redaction` int(11) NOT NULL,
`etat` int(11) NOT NULL,
`titre` varchar(255) NOT NULL,
`sous_titre` varchar(255) NOT NULL,
`date` datetime NOT NULL,
`image` varchar(255) NOT NULL,
`commentaires` enum('0','1') NOT NULL,
`nombre_commentaires` int(11) NOT NULL,
`id_dernier_commentaire` int(11) NOT NULL,
`id_admin` int(11) NOT NULL,
`ip_admin` int(10) NOT NULL,
`date_validation` datetime NOT NULL,
`motif_refus` text NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;
- id (clé primaire)
- id_news
- id_membre
- ip_membre
- texte
- date
- raison
- contribution_mineure
--
-- Structure de la table `news_version`
--
CREATE TABLE `news_version` (
`id` int(11) NOT NULL auto_increment,
`id_news` int(11) NOT NULL,
`id_membre` int(11) NOT NULL,
`ip_membre` int(10) NOT NULL,
`texte` text NOT NULL,
`date` datetime NOT NULL,
`raison` text NOT NULL,
`contribution_mineure` enum('0','1') NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;
Voici mes tables et le jeu d'essai (désolé je ne sais pas faire les schémas de tables alors j'ai fait comme ça).
Pour le résultat attendu de ma requête, le voici :
n.id = 2 (id de la dernière news)
n.titre = Communiquez avec les autres membres ! (titre de la derniere news)
n.date = 2010-05-25 18:26:32 (date de création de la dernière news)
n.image = uploads/news/3.png (image de la dernière news )
n.nombre_commentaires = 4
n.id_dernier_commentaire = 4
nv.texte = Voici la news
NV.id_membre = array(1 => 2, 2 => 1)
M.pseudo = array(1 => 'Belion', 2 => 'Membre 1')
Est-ce que tu t'es connecté à ta base de donnée via php?
Si tu ne la pas fait, alors fais-le car c'est sans doute le problème.
Oui, je suis bien connecté à ma base de données puisque quand j'effectue le code suivant, ma requête marche.
$requete = $bdd->prepare('SELECT n.id, n.titre, n.date, n.image, n.nombre_commentaires, n.id_dernier_commentaire,
nv.texte
FROM news n
INNER JOIN news_version nv ON nv.id = n.id_derniere_version
WHERE n.etat = :etat ORDER BY n.id DESC LIMIT 0, 1') or die(print_r($bdd->errorInfo()));
$requete->execute(array('etat' => 3));
$derniere_news = $requete->fetchAll();
J'en ai donc déduit que c'était le code suivant qui ne marchait pas.
(SELECT NV.id_membre, M.pseudo
FROM news_version NV
INNER JOIN membres M ON M.id = NV.id_membre
WHERE NV.id_news = n.id AND NV.contribution_mineure = :contribution_mineure)
Belion
Problème de jointure
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Superloup