Bonjour,
Je suis actuellement sur un affichage de question en fonction d'un id précis.
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']." ?";
}
}
}
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.
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 ?
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...).
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.
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
?
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
Est ce que cela pourrait avoir un rapport avec le $_GET['id'] qui est le paramètre que j'envoie en url ?