Affichage question en fonction de l'id

Par gweared, il y a 8 ans


Bonjour,

Je suis actuellement sur un affichage de question en fonction d'un id précis.

Ce que je fais

Voici ce que j'affiche dans la vue.

<div class="type-question"> <p class="question"> <?php //echo $_SESSION['questions']; if (!empty($_GET['id'])) { displayQuestions($_GET['id']); } else { $_GET['id']++; if (!empty($_GET['id'])) { displayQuestions($_GET['id']); }else { displayQuestions(); } } ?> </p> </div>

et voici le model

function displayQuestions($idQuestion = 1) { $query = 'SELECT id,question FROM sondage_questions WHERE id= :id '; $resultat = db()->prepare($query); $resultat->bindValue('id',$idQuestion,PDO::PARAM_INT); $data = $resultat->execute(); // On retourne le nombre de ligne d'un résultat $nb_sondage = $resultat->rowCount(); if ($nb_sondage == 0) { session_destroy(); echo '<h2>Merci de votre participation.</h2>'; //echo '</br>'; header('Refresh: 3; URL = ./index.php?id=1'); //echo "<a href='index.php?id=1'>Retour</a>"; }else { while ($donnees = $resultat->fetch()) { //On affiche les données dans le tableau echo $donnees['question']." ?"; } } }

Ce que je veux

On affiche actuellement des questions avec un id 1 - 2 - 3 etc..
On a également des réponses. Quand on répond à la question à l'id 1 on passe à la suivante et ainsi de suite.

Ce que j'obtiens

Si jamais je supprime la question à l'id 3, le site ne va afficher que les 2 premières questions et n'affichera jamais la 4ème.

Je pense que cela est du à cela :

$nb_sondage = $resultat->rowCount(); if ($nb_sondage == 0) {

Auriez vous une idée ?

10 réponses

celionor, il y a 8 ans

pour le foreach, comme cela?

Oui

Si je supprime la question 2 et 3, il va m'afficher bien la question 1 et 4 par contre il va mafficher 3 fois la question 4. Pourquoi?

Hum. Un foreach boucle sur tes entrées, il n'invente rien :)
Quand tu exécutes ta requête sous MySQL, as-tu le même résultat ? Que te retourne $nb_sondage ?

gweared, il y a 8 ans

il me retourne -1 pour $nb_sondage et au bout de la 4 ème entrée 0.

Mardan, il y a 8 ans
select * from sondage_questions where id = (select min(id) from sondage_questions where id > 2)

Avec cette requête, tu peux récupérer l'id suivant.

celionor, il y a 8 ans

Utilise un foreach() au lieu d'un while().

Après, pour plus de clareté dans ton code, retiens qu'une fonction doit faire une chose. Là, displayQuestions() fait beaucoup trop d'actions (requête, session, affichage...).

gweared, il y a 8 ans

plutot comme cela non

select * from sondage_questions where id = (select min(id) from sondage_questions where id > 1)

mais du coup avec cette requete, tu n'a plus ceci ?

$resultat->bindValue('id',$idQuestion,PDO::PARAM_INT);

un foreach ici ?

while ($donnees = $resultat->fetch()) { //On affiche les données dans le tableau echo $donnees['question']." ?"; }

Si je fais cela, la page devient toute blanche

celionor, il y a 8 ans

Je te conseille de revoir l'utilisation de binValue() sur la doc PHP.
Ton premier paramètre doit remplacer la valeur à rechercher, pas le nom de la colonne.

db()->prepare('select * from sondage_questions where id = (select min(id) from sondage_questions where id > :id)'); $resultat->bindValue(':id', $idQuestion, PDO::PARAM_INT);

Oui, le foreach() va te permettre de boucler sur l'ensemble des entrées de ta requête.

gweared, il y a 8 ans

je viens de tester. si je fais comme tu as mis, cela m'affiche bien la question 1 et 2 puis sa plante.
Le foreach lui m'affiche une page blanche

edit : pour le foreach, comme cela?

foreach($resultat as $idQuestion => $donnees)

edit :

Alors cela a l'air de marché par contre une nouvelle erreur c'est produit.
Si je supprime la question 2 et 3, il va m'afficher bien la question 1 et 4 par contre il va mafficher 3 fois la question 4. Pourquoi?

celionor, il y a 8 ans

Je ne comprends pas qu'il te retourne -1, désolé. Donc soit je ne comprends pas ce que tu veux faire, soit j'ai loupé quelque chose.

Reprends ton code avec un fetchAll() + un foreach() pour afficher tous les résultats associés à l'id

requête SQL > fetchAll($request) > foreach() > echo

Ou un fetch() pour n'afficher qu'un résultat (pas besoin de foreach() ou de while())

requête SQL > fetch($request) > echo

gweared, il y a 8 ans

Est ce que cela pourrait avoir un rapport avec le $_GET['id'] qui est le paramètre que j'envoie en url ?

gweared, il y a 8 ans

Alors a priori sa serait du au min.