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


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.

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
Auteur

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

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
Auteur

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?

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
Auteur

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

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
Auteur

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

gweared
Auteur

Alors a priori sa serait du au min.