[RESOLU] Carousel en PHP

Eléphant du PHP | 133 Messages

23 avr. 2021, 09:41

Bonjour
je cherche à faire un carrousel en PHP.
Je sais faire celui de BOOSTRAP mais j'aimerais que l’utilisateur puisse changer les images dont le lien serait stocker en BDD et l'image dans un dossier.

Après plusieurs recherches j'ai trouvé un post sur ce forum qui était indiqué comme résolu
Je l'ai adapté en fonction de ma BDD, mais j'ai encore un bug.

Code : Tout sélectionner

<!--Carroussel--> <div id="carouselExampleIndicators" class="carousel slide" data-ride="carousel"> <div class="carousel-inner"> <?php /*Extraction des données*/ $reponse = $db->query('SELECT * FROM t_carroussel ORDER BY Id ASC'); $counter = 1; while ($row = $reponse->fetch()) { ?> <div class="item<?php if ($counter <= 1) { echo " active"; } ?>"> <a href="<?php echo $row['Lien_image'] ?>" target="_blank"> <img alt="<?php echo $row['Legende_image'] ?>" src="/Carroussel/Normal/<?PHP echo $row['Lien_image'] ?>" /> </a> <div class="finlay-carousel-caption"> <h3><?php echo $row['Legende_image'] ?></h3> <p><?php echo $row['Legende_image'] ?></p> </div> </div> <?php $counter++; } ?> <a class="carousel-control-prev" href="#carouselExampleControls" role="button" data-slide="prev"> <span class="ti-angle-left indicators-left" aria-hidden="true"></span> <span class="sr-only">Previous</span> </a> <a class="carousel-control-next" href="#carouselExampleControls" role="button" data-slide="next"> <span class="ti-angle-right indicators-right" aria-hidden="true"></span> <span class="sr-only">Next</span> </a> </div> </div>
Erreur
rreur fatale: Erreur non interceptée: Appel à une fonction membre fetch () sur bool dans E: \ FFMO \ Utilisateur.php à la ligne 177
(!) Erreur: Appel à une fonction membre fetch () sur bool dans E: \ FFMO \ Utilisateur.php à la ligne 177
La ligne 177 correspond à

Code : Tout sélectionner

while ($row = $reponse->fetch()) {
J'avoue ne pas comprendre.
Pouvez m'aider encore une fois? merci

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

23 avr. 2021, 11:57

Ce message d'erreur veut dire que $reponse est un booléen.
Quand c'est le cas, c'est souvent car une erreur a eu lieu là où tu initialises cette variable et du coup que ça a renvoyé false.

Pour faciliter le debugage des erreurs PDO, je te recommande d'utiliser la gestion d'erreur en mode PDO::ERRMODE_WARNING
https://www.php.net/manual/fr/pdo.error-handling.php
Quand tout le reste a échoué, lisez le mode d'emploi...

Avatar du membre
Eléphant du PHP | 70 Messages

28 avr. 2021, 15:25

Salut, dans ce genre de cas je serais plus tenter d'utiliser un foreach. Dans votre cas, cla ressemblerais à quelque chose du genre :
<?php
  $BDD = new BDD();
  $dbh = $BDD->getConnection();
  $stmt = $dbh->query('SELECT * FROM t_carroussel ORDER BY Id ASC');
  $counter = $stmt->rowCount();
  foreach($stmt as $row): ?>
<div <?php if($counter <= 1) echo 'class="active"'; ?> >
    <a href="<?= $row['Lien_image'] ?>" target="_blank">
        <img alt="<?= $row['Legende_image'] ?>" src="/Carroussel/Normal/<?= $row['Lien_image'] ?>" />
    </a>
    <div class="finlay-carousel-caption">
        <h3><?= $row['Legende_image'] ?></h3>
        <p><?= $row['Legende_image'] ?></p>
    </div>
</div>
<?php
  endforeach;
?>
" La révolution informatique fait gagner un temps fou aux Hommes, mais ils le passent avec leur ordinateur ! " by Khalil Assala

Eléphant du PHP | 133 Messages

29 avr. 2021, 11:16

Bonjour Shadowwera , j'ai mis en pratique ton code ci-dessus....

Code : Tout sélectionner

<div id="carousel" class="carousel slide" data-bs-ride="carousel"> <div class="carousel-inner"> <?php $stmt = $db->query('SELECT * FROM t_carroussel ORDER BY Id_carroussel ASC'); $counter = $stmt->rowCount(); foreach ($stmt as $row) : ?> <div <?php if ($counter <= 1) echo 'class="active"'; ?>> <a href="<?= $row['Lien_image'] ?>" target="_blank"> <img alt="<?= $row['Legende_image'] ?>" src="/Carroussel/<?= $row['Lien_image'] ?>" /> </a> <div class="finlay-carousel-caption"> <h3><?= $row['Legende_image'] ?></h3> <p><?= $row['Legende_image'] ?></p> </div> </div> <?php endforeach; ?> </div> </div>
...mais cela ne marche pas. Avec 3 images, j'ai 3 images et 3 Légendes affichées les uns au dessus des autres. Je n'ai pas de défilement.
Le code en HTML donne ceci

Code : Tout sélectionner

<div id="carousel" class="carousel slide" data-bs-ride="carousel"> <div class="carousel-inner"> <div > <a href="Image/ffmo1619687406.png" target="_blank"> <img alt="Test image N°1" src="/Carroussel/Image/ffmo1619687406.png" /> </a> <div class="finlay-carousel-caption"> <h3>Test image N°1</h3> <p>Test image N°1</p> </div> </div> <div > <a href="Image/ffmo1619687436.png" target="_blank"> <img alt="Test image n°2" src="/Carroussel/Image/ffmo1619687436.png" /> </a> <div class="finlay-carousel-caption"> <h3>Test image n°2</h3> <p>Test image n°2</p> </div> </div> <div > <a href="Image/ffmo1619687473.png" target="_blank"> <img alt="Test image N°3" src="/Carroussel/Image/ffmo1619687473.png" /> </a> <div class="finlay-carousel-caption"> <h3>Test image N°3</h3> <p>Test image N°3</p> </div> </div> </div> </div>
Je remarque qu'il n' y a pas de div avec la classe "active". C'est peut être l'origine du problème?

Avatar du membre
Eléphant du PHP | 70 Messages

30 avr. 2021, 08:43

Salut JAG11,

Si tu affiche la variable $counter, que te retourne t'elle ?
Elle est supposé te donner le nombre d'entrée que tu as dans ta base `t_carroussel`, et lors de la première entrée ( if ($counter <= 1) ) alors la classe active lui est attribué (echo 'class="active")

S'il ne le fait pas, il doit y avoir soit un soucis avec la variable $counter, soit avec la condition

PS: Voici la doc concernant le rowCount()
" La révolution informatique fait gagner un temps fou aux Hommes, mais ils le passent avec leur ordinateur ! " by Khalil Assala

Eléphant du PHP | 133 Messages

30 avr. 2021, 20:24

Bonsoir

le test sur la variable $counter renvoi 3 qui correspond à mon nombre d'image. Que faire ?

Avatar du membre
Eléphant du PHP | 70 Messages

04 mai 2021, 09:01

Salut !

D'accord je vois, dans ton cas le rowCount() ne servira donc pas
Remplace le par une incrémentation, initialise un $i = 1 avant le foreach, puis à la fin de ton foreach each tu l'incrémente $i++
" La révolution informatique fait gagner un temps fou aux Hommes, mais ils le passent avec leur ordinateur ! " by Khalil Assala

Eléphant du PHP | 133 Messages

05 mai 2021, 12:04

Bonjour, j'ai appliqué ta remarque mais ça ne marche toujours pas. Voici le code:

Code : Tout sélectionner

<div id="carousel" class="carousel slide" data-bs-ride="carousel"> <div class="carousel-inner"> <?php $stmt = $db->query('SELECT * FROM t_carroussel ORDER BY Id_carroussel ASC'); $i=1; foreach ($stmt as $row) : ?> <div <?php if ($i <= 1) echo 'class="active"'; ?>> <a href="<?= $row['Lien_image'] ?>" target="_blank"> <img alt="<?= $row['Legende_image'] ?>" src="/Carroussel/<?= $row['Lien_image'] ?>" /> </a> <div class="finlay-carousel-caption"> <h3><?= $row['Legende_image'] ?></h3> <p><?= $row['Legende_image'] ?></p> </div> </div> <?php $i++; endforeach; ?> </div>

Eléphant du PHP | 133 Messages

05 mai 2021, 12:14

En fait, je viens de le retravailler un peu pour le modifier comme ceci et là j'ai un défilement:

Code : Tout sélectionner

<div id="carousel" class="carousel slide" data-bs-ride="carousel"> <div class="carousel-inner"> <?php $stmt = $db->query('SELECT * FROM t_carroussel ORDER BY Id_carroussel ASC'); $i = 1; foreach ($stmt as $row) : ?> <div <?php if ($i <= 1) echo 'class="carousel-item active"'; else echo 'class="carousel-item"' ?>> <img alt="<?= $row['Legende_image'] ?>" src="/Carroussel/<?= $row['Lien_image'] ?>" class="d-block w-100"> </a> <div class="finlay-carousel-caption"> <h3><?= $row['Legende_image'] ?></h3> <p><?= $row['Legende_image'] ?></p> </div> </div> <?php $i++; endforeach; ?> </div>
Il manquait
carousel-item
avec un else pour les ligne supérieurs à 1.

Ce qui en HTML donne ceci, plus proche du code BOOTSTRAP:

Code : Tout sélectionner

<div class="carousel-inner"> <div class="carousel-item active"> <a href="Normal/ffmo1619691050.png" target="_blank"> <img alt="Bienvenue sur le site de la FFMö" src="/Carroussel/Normal/ffmo1619691050.png" class="d-block w-100"> </a> <div class="finlay-carousel-caption"> <h3>Bienvenue sur le site de la FFMö</h3> <p>Bienvenue sur le site de la FFMö</p> </div> </div> <div class="carousel-item"> <a href="Normal/ffmo1619691091.png" target="_blank"> <img alt="Les 24 h du Mölkky" src="/Carroussel/Normal/ffmo1619691091.png" class="d-block w-100"> </a> <div class="finlay-carousel-caption"> <h3>Les 24 h du Mölkky</h3> <p>Les 24 h du Mölkky</p> </div> </div> <div class="carousel-item"> <a href="Normal/ffmo1619716741.png" target="_blank"> <img alt="Les Mölkkyades" src="/Carroussel/Normal/ffmo1619716741.png" class="d-block w-100"> </a> <div class="finlay-carousel-caption"> <h3>Les Mölkkyades</h3> <p>Les Mölkkyades</p> </div> </div> </div> </div>

Eléphant du PHP | 133 Messages

05 mai 2021, 12:17

Je viens de faire le test d'ajouter une image en BDD, ça fonctionne.

Eléphant du PHP | 133 Messages

05 mai 2021, 12:20

Merci beaucoup pour l'aide

Eléphant du PHP | 133 Messages

05 mai 2021, 12:36

Le code corrigé type BOOTSTRAP

Code : Tout sélectionner

<!--carousel--> <div id="carousel" class="carousel slide carousel-fade" data-bs-ride="carousel"> <div class="carousel-inner"> <?php $stmt = $db->query('SELECT * FROM t_carroussel ORDER BY Id_carroussel ASC'); $i = 1; foreach ($stmt as $row) : ?> <div <?php if ($i <= 1) echo 'class="carousel-item active data-interval="1000"'; else echo 'class="carousel-item data-interval="1000"' ?>> <img alt="<?= $row['Legende_image'] ?>" src="/Carroussel/<?= $row['Lien_image'] ?>" class="d-block w-100"> </a> <div class="carousel-caption d-none d-md-block"> <h3><?= $row['Legende_image'] ?></h3> </div> </div> <?php $i++; endforeach; ?> </div> <button class="carousel-control-prev" type="button" data-bs-target="#carousel" data-bs-slide="prev"> <span class="carousel-control-prev-icon" aria-hidden="true"></span> <span class="visually-hidden">Previous</span> </button> <button class="carousel-control-next" type="button" data-bs-target="#carousel" data-bs-slide="next"> <span class="carousel-control-next-icon" aria-hidden="true"></span> <span class="visually-hidden">Next</span> </button> </div>

Eléphant du PHP | 133 Messages

05 mai 2021, 12:36

Et encore un énorme merci

Avatar du membre
Eléphant du PHP | 70 Messages

05 mai 2021, 15:20

Salut ! Ravi de t'avoir aidé !

Plutôt que d'écrire
<div <?php if ($i <= 1) echo 'class="carousel-item active data-interval="1000"';
else echo 'class="carousel-item data-interval="1000"' ?>>
Ecrit plutôt :
<div class="carousel-item<?php if ($i <= 1) echo ' active' ?> data-interval="1000">
Etant donné que tes classes carousel-item et data-interval="1000" sont constamment présente inutile le les inclure dans ton if :D
" La révolution informatique fait gagner un temps fou aux Hommes, mais ils le passent avec leur ordinateur ! " by Khalil Assala

Eléphant du PHP | 133 Messages

05 mai 2021, 15:54

J'ai essayé ça ne marche pas :non: