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 ?