Qu'est ce que je peux mettre à la place alors ? Lorsque je mets un ? pour récupérer mon id cela me retourne que ma syntaxe SQL n'est pas bonne.
Code : Sélectionner tout - Visualiser dans une fenêtre à part 'SELECT actifsaero.id, actifsaero.titre, actifsaero.description, images.lien FROM actifsaero RIGHT JOIN images images.idimages = actifsaero.idaero AND actifsaero.id = ?'
Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '.idimages = actifsaero.idaero AND actifsaero.id = '4'' at line 1 in C:\xampp\monsite\ficheBatimentAeroTest.php:11 Stack trace: #0 C:\xampp\monsite\ficheBatimentAeroTest.php(11): PDOStatement->execute(Array) #1 {main} thrown in C:\xampp\monsite\ficheBatimentAeroTest.php on line 11
Louisrimb,
pourrais-tu mettre dans un fichier zip ton projet complet afin que je puisse l'exécuter en local, STP ? J'ai déjà ta bdd ; si je peux exécuter ton projet, je serai bien plus efficace...
monsite.zip
Maintenant c'est bon désolé
J'ai bien récupéré ton appli et elle s'exécute chez moi. J'ai vu que le code du post #12 correspond au fichier ficheBatimentAeroTest.php. Je vais investiguer mais ça risque de prendre quelques heures...
C'est bien ça, merci pour ton temps, de mon coté je vais continuer de chercher
J'ai déjà corrigé la requête SQL de ficheBatimentAeroTest.php :mais y a plein d'autres erreurs. Déjà, m'avoir donné le .zip me rend comme prévu plus efficace . Je continue...
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 $recupActifsAero = $bdd->prepare('SELECT AC.id, AC.titre, AC.`description`, IM.lien FROM actifsaero as AC RIGHT JOIN images as IM ON IM.idimages = AC.idaero AND AC.id = ?');
En corrigeant la requête, tu avais viré le ON de la jointure et l'une des colonnes (description) a le nom d'un mot-clé SQL, donc il faut l'entourer de quotes inversées (ALT+7+ENTER)(truc purement MySQL) dans la requête...
J'ai fait une autre correction dans ficheBatimentAeroTest.php :
C'est du PHP 7 ; les ?? font que si la variable n'existe pas, on la remplace par null.
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 <h2><?= $titre ?? null ?></h2> <p><?= $description ?? null ?></p>
Avant, on aurait écrit :
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 <h2><?= (isset($titre)) ? $titre : null ?></h2> <p><?= (isset($description)) ? $description : null ?></p>
Avec cette correction, il n'y a plus d'erreur (à part plein de not found, vu qu'il y a plein de liens qui pointent vers des fichiers inexistants). Notamment, ma correction de la requête SQL du post #28 fait que les images sont affichées.
Cela dit, j'ignore le but de l'application, mais le comportement me paraît anormal ; quelque soit le lien sélectionné, on va sur la même page (la page qui affiche avion1.jpg)(c'est le même avion qui est affiché quelque soit la valeur de id). Pour que je puisse aller plus loin, il faudra me préciser le but de ton application...
Je ne comprends pas d'où viens la redirection vers avion 1. Mais l'objectif de l'appli est de pointer vers les différents actifs comme un site d'agence immobilière en gros
Ça ne veut pas dire que le placeholder en est la cause!
Lorsque tu as une erreur de syntaxe, MySQL/MariaDB renvoie la partie de la requête à partir de laquelle la syntaxe a été violée, autrement dit, tout ce qui est avant est syntactiquement correcte, ou encore qu'à partir de ce point l'interpréteur ne comprend pas ce que tu as écris, ni plus, ni moins.
Code : Sélectionner tout - Visualiser dans une fenêtre à part 'SELECT actifsaero.id, actifsaero.titre, actifsaero.description, images.lien FROM actifsaero RIGHT JOIN images images.idimages = actifsaero.idaero AND actifsaero.id = ?'
Code : Sélectionner tout - Visualiser dans une fenêtre à part Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '.idimages = actifsaero.idaero AND actifsaero.id = '4'' at line 1 in C:\xampp\monsite\ficheBatimentAeroTest.php:11 Stack trace: #0 C:\xampp\monsite\ficheBatimentAeroTest.php(11): PDOStatement->execute(Array) #1 {main} thrown in C:\xampp\monsite\ficheBatimentAeroTest.php on line 11
Ça ne veut donc pas dire que l'ânerie que tu as commise se trouve forcément à ce point précis, elle peut aussi être en amont.
Ici par exemple, tu as oublié le mot-clef ON qui définie les colonnes utilisées pour la jointure. D'ailleurs à ce propos, je ne suis pas persuadé que actifsaero.id = ? doit y figurer, sa place est plutôt dans une clause WHERE.
Mon petit doigt me dit que ce que tu cherches à obtenir c'est plutôt ça:
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 SELECT aca.titre, aca.description, GROUP_CONCAT(img.lien) AS liens FROM actifsaero AS aca LEFT JOIN images AS img ON img.idimages = aca.idaero WHERE aca.id = ? GROUP BY aca.id, aca.titre, aca.description;
La colonne liens ainsi obtenue contiendra les liens vers les éventuelles images, séparés par des virgules.
une fois de plus, cosmo, tu dépasses de loin mes connaissances. Ici, par exemple, je connaissais pas GROUP_CONCAT. Cela dit, ton petit doigt n'évite pas une erreur...
Avec ton petit doigt, le code de louisrimb devient :
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 $recupActifsAero = $bdd->prepare(' SELECT aca.titre, aca.description, GROUP_CONCAT(img.lien) AS liens FROM actifsaero AS aca LEFT JOIN images AS img ON img.idimages = aca.idaero WHERE aca.id = ? GROUP BY aca.id, aca.titre, aca.description; '); $recupActifsAero->execute(array($getid)); if($recupActifsAero->rowCount()>0){ $actifsAeroInfos = $recupActifsAero->fetch(); $titre = $actifsAeroInfos['titre']; $description = $actifsAeroInfos['description']; $images = $actifsAeroInfos['lien']; }
Cela dit, ton petit doigt ne suffit pas à éviter une erreur car la variable $recupActifsAero après le fetch ligne 16 est un tableau avec un seul élément :Ca a l'air de nécessiter plutôt de trouver la bonne requête SQL plutôt que de revoir la structure de la table, donc on va shunter cette étape mais personnellement, j'y verrais plus clair si j'avais sous les yeux le MCD de la bdd...https://www.developpez.net/forums/d2...r-ddl-looping/queryString=
"SELECT
aca.titre,
aca.description,
GROUP_CONCAT(img.lien) AS liens
FROM actifsaero AS aca
LEFT JOIN images AS img
ON img.idimages = aca.idaero
WHERE aca.id = ?
GROUP BY aca.id, aca.titre, aca.description; "
Ça fait partie du lot des fonctions d'aggrégations, comme SUM ou COUNT, rien de sorcier si ce n'est qu'il faut adjoindre la clause GROUP BY qui va avec.
C'est normal et c'est ce qui est attendu. La requête contient une clause WHERE pour obtenir une seule ligne de la table actifsaero, mais cette ligne est ici agrémentée d'une colonne avec tous ses liens vers les images.Cela dit, ton petit doigt n'évite pas une erreur ... car la variable $recupActifsAero après le fetch ligne 16 est un tableau avec un seul élément
Pour obtenir tous les articles et boucler dessus avec un while comme dans le code original, il suffit d'enlever la clause WHERE et c'est tout.
(J'ai retiré la colonne id du SELECT; il suffit de la remettre puisque le code PHP l'utilise).
La seule modification à faire au niveau PHP; c'est un explode et un foreach pour afficher les images:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 <?php while($actifsAero = $recupactifsAero->fetch()): ?> <div class="actifsAero"> <h2><?= $actifsAero['titre'] ?></h2> <p><?= $actifsAero['description'] ?></p> <?php foreach(explode(',', $actifsAero['liens']) as $src): ?> <img src="<?= $src ?>"> <br> <?php endforeach; ?> <a href="ficheBatimentAeroTest.php?id=<?= $actifsAero['id'] ?>"><button style="background-color:blue; color:white">Accéder au batiment</button></a> <hr> </div> <?php endwhile; ?>
Il y a surement des choses à faire de ce coté là, mais ce n'est pas tout, avant de foncer sur looping, il faut déjà être familier des jointures, des clefs étrangères, des formes normales, donc la case tutoriel me semble plus pertinente pour le moment.Ca a l'air de nécessiter plutôt de trouver la bonne requête SQL plutôt que de revoir la structure de la table, donc on va shunter cette étape mais personnellement, j'y verrais plus clair si j'avais sous les yeux le MCD de la bdd...https://www.developpez.net/forums/d2...r-ddl-looping/
Bonsoir,
même si je n'ai rien dit depuis un moment, j'ai pas lâché l'affaire !
J'ai essayé d'insérer le code de Cosmo dans le code de louisrimb. C'est pas au point, mais comme le soir, je suis nettement moins bon que le matin, pas la peine de vous parler de mes problèmes ; au mieux, je les résoudrai demain matin (avant 9h45 car je m'en vais à cette heure-là) et au pire, je reviens vers vous dans l'après-midi...
Je voulais juste dire que si pour moi, l'expérience en modélisation a à peu près un an, celle du SQL a 10 ou 15 ans, donc les notions dont tu parles, Cosmo, je les connais. Par contre, c'est vrai que je suis pas très à l'aise avec certaines clauses : GROUP_CONCAT, GROUP BY...
A demain
Du coup merci beaucoup,
J'arrive maintenant à afficher mes différentes images en fonction de leurs id dans mes pages fiche bâtiment.
Je vais maintenant essayé d'améliorer mon code et surtout de revoir l'affichage de ces dernières dans ma page actifsaero
Toi oui, mais pas notre ami louisrimb.les notions dont tu parles, Cosmo, je les connais
Bonjour,
tous comptes faits, ce matin, j'ai rien eu le temps de faire. Cela dit, louisrimb, je lis que tu as avancé. As-tu encore besoin d'aide ? Si oui, merci de donner ton code actuel de ficheBatimentAeroTest.php.
Bon week-end
Au fait, pour mieux gérer la connexion à la bdd, on peut remplacer (en s'inspirant de https://www.developpez.net/forums/bl...pdo-soupe-lit/) la ligne $bdd = new PDO('mysql:host=localhost;dbname=air', 'root', ''); par la ligne $bdd = include 'db_mysql.php'; et en créant le fichier db_mysql.php :un des avantages est que si la bdd change, y a un seul fichier à modifier, ce qui minimise le risque d'erreur (alors que là, on retrouve ta ligne 3 ou 4 fois)
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 <?php // @author : rawsrc - 2018 - Pour DVP // on vérifie si la fonction de connexion a déjà été définie afin d'éviter de la redéfinir if (!function_exists('db_connexion')) { function db_connexion() { // une fois ouverte, on renvoie toujours la même connexion static $pdo; // on vérifie si la connexion n'a pas déjà été initialisée if (!($pdo instanceof PDO)) { // tentative d'ouverture de la connexion MySQL try { $pdo = new PDO('mysql:host=localhost;port=3306;dbname=air;charset=utf8', 'root', '', [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_EMULATE_PREPARES => false ]); } catch (PDOException $e) { throw new InvalidArgumentException('Erreur connexion à la base de données : ' . $e->getMessage()); exit; } } // renvoi de la ressource : connexion à la base de données return $pdo; } } return db_connexion();
Bonjour,
j'ai essayé d'intégrer le code de Cosmo ce qui donne ça :
Mais ça n'affiche que les images avion1.jpg et de l'une des 2 bases, à cause de ma ligne 3. A la première exécution, il faudrait, je pense, donner le choix entre les différents avions. On est d'accord ?
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59 <?php $db = include 'db_mysql.php'; $getid = $_GET['id'] ?? 1;//une valeur de id qui existe pour passer ds le if ci-dessous if(isset($getid) AND !empty($getid)){ $recupActifsAero = $db->prepare('SELECT aca.id, aca.titre, aca.description, GROUP_CONCAT(img.lien) AS liens FROM actifsaero AS aca LEFT JOIN images AS img ON img.idimages = aca.idaero WHERE aca.id = ? GROUP BY aca.id, aca.titre, aca.`description`;'); $recupActifsAero->execute(array($getid)); while($actifsAero = $recupActifsAero->fetch()): $titre = $actifsAero['titre']; $description = $actifsAero['description']; $images = $actifsAero['liens']; ?> <div class="actifsAero"> <h2><?= $actifsAero['titre'] ?></h2> <p><?= $actifsAero['description'] ?></p> <?php foreach(explode(',', $actifsAero['liens']) as $src): ?> <img src="<?= $src ?>"> <br> <?php endforeach; ?> <a href="ficheBatimentAeroTest.php?id=<?= $actifsAero['id'] ?>"><button style="background-color:blue; color:white">Accéder au batiment</button></a> <hr> </div> <?php endwhile; } include('head.php'); ?> <title><?= $actifsAero['titre']; ?></title> </head> <body> <section id="implantationAeroport"> <a id="implantationAeroport"> <?php include("navbarHaute.php"); ?> <?php include("navbar.php"); ?> <container> <div class="actifsAero"> <h2><?= $titre ?></h2> <p><?= $description ?></p> <img src='<?= $images ?>'> <br> <a href="ficheBatimentAeroTest.php?id<?= $actifsAero['id']; ?>"><button style="background-color:blue; color:white">Accéder au batiment</button></a> <hr> </div> </container> </a> </section> <?php include("footer.php"); ?> </body> </body> <script src="assets/js/nav.js"></script> </html>
Partager