J'ai un petit souci avec fetch() en POO. Je croyais que fetch retournait false quand il ne trouvait aucun résultat. Hors, en faisant var_dump, il me retourne un array avec des valeurs null.
Oui c'est normal que la requête ne retourne rien, c'est fait exprès. J'ai besoin de tester si une requête retourne quelque chose ou rien. Par exemple si quelqu'un change l'id dans l'url.
C'est une requête un peu longue et compliquée avec des group_concat, left join et inner join.
Si je la remplace par une requête simple du genre SELECT id FROM table WHERE id = :id, effectivement fetch fonctionne et me renvoie bien false si aucun résultat
fetch renvoie bien FALSE s'il n y as pas de résultat. Maintenant si tu as des NULL, sachant qu'il existe des fonctions MYSQL qui renvoie NULL dans certains cas, ceci peut expliquer cela.
On a pas la requête, ni un jeu de résultat pour tester donc on ne va que spéculer.
- Edité par WillyKouassi 15 décembre 2018 à 21:55:46
public function getById($id)
{
$sql = parent::$db->prepare("SELECT movies.id, origine, year, title, vo,
DATE_FORMAT(sortie_fr,'%d %c %Y') AS sortie_fr,
DATE_FORMAT(sortie_us,'%d %c %Y') AS sortie_us, synopsis, slug, src, alt, sites.site,
GROUP_CONCAT(DISTINCT CASE WHEN jobs.id=1 THEN name END ORDER BY personsjobs.id ASC SEPARATOR ', ') AS directors,
GROUP_CONCAT(DISTINCT CASE WHEN jobs.id=2 THEN name END ORDER BY personsjobs.id ASC SEPARATOR ', ') AS actors,
GROUP_CONCAT(CASE WHEN jobs.id=1 THEN persons.id END SEPARATOR ';') AS idsDirectors,
GROUP_CONCAT(CASE WHEN jobs.id=2 THEN persons.id END SEPARATOR ';') AS idsActors
FROM movies LEFT JOIN posters ON posters.id_movie=movies.id
INNER JOIN personsjobs ON personsjobs.id_movie = movies.id
INNER JOIN persons ON persons.id=personsjobs.id_person
INNER JOIN jobs ON jobs.id=personsjobs.id_job
INNER JOIN sites ON sites.id=movies.site WHERE movies.id = :id");
$sql->bindValue(':id', $id, PDO::PARAM_INT);
$sql->execute();
$fetch = $sql->fetch();
$sql->closeCursor();
return $fetch;
}
Que ce soit avec fetch ou fetchAll, quand l'id est bidon, cette requête génère un array de ce type.
J'ai trouvé, fallait mettre GROUP BY movies.id à la fin de la requête
La requête est quand même assez tordue. J'ai un controller MOVIES, un controller PERSON, un controller POSTER. Il me semblait logique de partir du controller principal MOVIES pour ensuite demander le poster associé à ce film, puis le casting associé à ce film avec des INNER JOIN et LEFT JOIN.
Edit: En l'état actuel pas besoin de créer les tables acteur et realisateur. C'est l'id de la fonction qui doit migrer dans la table personne si une personne est soit réalisateur ou acteur..
Sinon créer une table personne_fonction par exemple si une personne peut être réalisateur et acteur.
PS: Si tu as des difficultés en modélisation basique alors je sens que dans ton système ça ne doit pas être la fête, parce que bon ta requête actuelle semble "compliqué"
- Edité par WillyKouassi 28 décembre 2018 à 20:53:56
J'ai choisi PERSONNE et FONCTIONS. J'ai aussi fait cette table PERSONNE_FONCTION avec l'id du film. L'inconvénient c'est que PERSONNE va vite devenir énorme avec beaucoup d'enregistrements. Surtout si je rajoute Producteur, Scénariste, etc...
L'autre option ACTEUR, REALISATEUR est plus souple mais redondante au niveau de la structure (id, nom, prénom à chaque fois).
Ouais mais si tu n'enregistres que les nom et prénoms des producteurs, scénaristes, acteurs etc... pas besoin de créer autant de tables , une seule table personne suffit.
PS: Demande à un modo de diviser et déplacer une partie des messages dans la section BDD
- Edité par WillyKouassi 28 décembre 2018 à 21:04:41
Ouais mais du coup ma requête sql va être encore plus compliquée si je veux afficher une fiche de film avec son réalisateur, ses acteurs, ses producteurs, etc..
Blague à part, tu peux signaler ton message et ainsi ça affichera une alerte visible par toute l'équipe de modération.
Sauf que, dans ce cas précis, le forum ne permet pas de "diviser et déplacer une partie des messages". Si le sujet dérive, je peux en revanche suggérer de créer un nouveau sujet (en mettant un lien vers et depuis ce nouveau sujet pour les curieux qui voudraient avoir l'historique). Désolée de ne pas pouvoir faire plus.
Pas d'aide concernant le code par MP, le forum est là pour ça :)
Dans ton système actuel si les fonctions sont déterminées en fonction du film, je garderais une table personne et dans la table personne_film (id_film, id_personne, id_fonction), Exemple de requête qui retourne le réalisateur, les acteurs d'un film, le titre du film
SELECT GROUP_CONCAT(nom SEPARATOR ';') AS liste_personne, lib_fonction, titre
FROM personne p
JOIN personne_film pf ON p.id_personne = pf.id_personne
JOIN fonction f ON f.id_fonction = pf.id_fonction
JOIN film f2 ON f2.id_film = pf.id_film
WHERE pf.id_film = :id_film
GROUP BY fonction, titre
Tu auras dans ce cas 3 colonnes (liste_personne, fonction, titre), pas besoin de CASE WHEN.
- Edité par WillyKouassi 29 décembre 2018 à 19:18:47
Cela se déduit des cardinalités, que tu n'as visiblement pas prises en comptes ...
Une personne peut intervenir sur plusieurs films et un film peut avoir plusieurs personnes intervenantes. Mais une personne peut également intervenir plusieurs fois pour le même film avec des fonctions différentes (réalisateur et acteur, ou réalisateur et scénariste, etc.).
La table film_personne proposée ici permet de remplir ces conditions ...
Et peu importe si la table personne grossit, tant que tu ne stockes pas deux fois la même personne ...
× 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.
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
Pas d'aide concernant le code par MP, le forum est là pour ça :)