Bonjour,
Je suis un projet mais j'ai actuellement un petit soucis.
J'ai donc créer mon questionnaire de satisfaction qui marchait très bien mais du coup suis passer en modèle MVC pour que ce soit plus clair dans le code et du coup j'ai un soucis.
Dans mon dossier controleur,
j'ai un fichier action.php
Décrivez ici votre code ou ce que vous cherchez à faire
<?php
if (isset($_POST['choix'])) {
if($_GET['id']){ // S'il existe
$next = $_GET['id'];
} else { // N'existe pas donc on prends la question une par défaut
echo "sa marche pas";
$next = 1;
}
// là le visiteur à choisi une réponse
// on prépare notre requête : on ajoute un vote pour la réponse choisie par le votant
if($_POST['choix']=='mauvais'){
addReponse($_SESSION['id_utilisateur'],$_POST['sondage_en_cours'],$_POST['question'],$_POST['choix']);
}else if($_POST['choix']=='moyen') {
addReponse($id_personne,$_POST['sondage_en_cours'],$_POST['question'],$_POST['choix']);
} else {
addReponse($id_personne,$_POST['sondage_en_cours'],$_POST['question'],$_POST['choix']);
}
$next++;
//$erreur = 'Merci d\'avoir voté :)';
//header('Location:index.php?id='.$next);
//header('Location:.');
// exit(); // die()
}
Le souci c'est que $_GET['id'] n'existe pas.
Celui ci correspond à l'identifiant de la question qu'on retrouve dans le dossier model dans le fichier sondage.php
$query = 'select id,question from sondage_questions Where id="'.$_GET['id'].' ORDER BY id "';
Une idée comment faire?
En vous remerciant
Salut
J'ai pas tout compris mais il semble y avoir une erreur de syntaxe dans ta requête:
$query = 'select id,question from sondage_questions Where id="'.$_GET['id'].' ORDER BY id "';
====>
$query = 'select id,question from sondage_questions Where id="'.$_GET['id'].'" ORDER BY id ';
Oui en effet,
En fait je voudrais savoir comment faire pour passer d'une page à une autre.
Au départ je passe dans l'url la valeur id=1.
Ensuite une fois que je répond à la question, le controleur incrémente cet id pour afficher la question 2 puis la 3 puis la 4.
Cependant on ma dit qu'il était impossible d'utiliser $_GET hors du controleur
J'ai un peu de mal à saisir...
Ça fonctionne pas ça ? (vu que c'est commenté)
header('Location:index.php?id='.$next);
exit();
Le contenu de l'attribut "action" de ton formulaire ne serait pas
action.php
par hasard ?
Si c'est le cas, tu dois aussi passer à ce fichier ton paramètre (via l'url si c'est en GET), donc tu devrais avoir
post.php?id=<?= $_GET['id']; ?>
, car si cela n'est pas fait, il semble tout à fait logique que tu n'aie pas accès à cette variable via ce fichier là (action.php)
Voilà ou j'en suis
la view :
<div class="row">
<section>
<?php
if (isset($_SESSION["error"])) {
echo "<p>".$_SESSION["error"]."</p>";
unset($_SESSION["error"]);
}
if(!empty($_SESSION['id_utilisateur'])){
$id_personne = $_SESSION['id_utilisateur'];
var_dump($_SESSION['id_utilisateur']);
}else {
$_SESSION['id_utilisateur'] = mt_rand(1, 100000);
$id_personne = $_SESSION['id_utilisateur'];
}
?>
<div class="type-question">
<p class="question">
<?php
//echo $_SESSION['questions'];
displayQuestions();
?>
</p>
</div>
<?php
if (!empty($_GET['id'])) {
displayAddReponses($_GET['id']);
} else {
displayAddReponses();
}
?>
</section>
</div>
le model
function displayQuestions() {
$query = 'SELECT id,question FROM sondage_questions WHERE id="'.$_GET['id'].'"';
//$result = pg_query($query);
$resultat = db()->query($query);
$data = $resultat->execute();
// On retourne le nombre de ligne d'un résultat
$nb_sondage = $resultat->rowCount();
if ($nb_sondage == 0) {
session_destroy();
echo '<h1>Fin du sondage</h1>';
echo '</br>';
echo "<a href='index.php?id=1'>Retour</a>";
}else {
// on libère l'espace mémoire alloué à cette requête
// mysqli_free_result ($resultat);
while ($donnees = $resultat->fetch())
{
//On affiche les données dans le tableau
echo "<article>";
echo stripslashes(htmlentities(trim($donnees['question'])));
//echo "<input type='submit' name='action' value='Suppr'/>";
echo "</article>";
}
}
}
function displayAddReponses($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();
if (!$resultat->execute()) {
echo '<br>ERREUR select ID ('.$idQuestion.') => vérifier la DB';
} else {
$donnees = $resultat->fetch();
echo "<article>";
echo "<form method='post' action='.'>";
echo "<input type='hidden' name = 'sondage_en_cours' value = '".$donnees['id']."'/>";
echo "<input type='hidden' name = 'question' value = '".$donnees['question']."'/>";
echo "<input type = 'submit' name='choix' value = 'bon' class='bon'/>";
echo "<input type = 'submit' name='choix' value = 'moyen' class='moyen'/>";
echo "<input type = 'submit' name='choix' value = 'mauvais' class='mauvais'/>";
echo "</form>";
echo "</article>";
}
}
le controleur
//Chargement modele
require_once("/model/sondage.php");
//Gestion GET (choix question)
if (!empty($_GET)) {
echo '<br> dans GET rempli';
if (!empty($_GET['id'])) {
echo '<br> dans GET[id] rempli';
$_SESSION['questions'] = displayQuestions(intval($_GET['id']));
} else {
echo '<br> dans GET[id] vide';
$_SESSION['questions'] = displayQuestions();
}
} else {
echo '<br> dans GET vide';
}
//gestion POST (réponse utilisateur)
if (!empty($_POST)) {
echo '<br> dans POST rempli';
//quelque soit le choix, l'appel est toujours le même
addReponse($_SESSION['id_utilisateur'],$_POST['sondage_en_cours'],
$_POST['question'],$_POST['choix']);
} else {
echo '<br> dans POST vide';
}
if (!empty($_GET['id'])) {
echo '<br> dans GET[id] rempli => redirection';
header('Location: index.php?id='.intval($_GET['id']));
exit;
} else {
header('Location: index.php?id=1');
exit;
}
Pour le moment j'ai un souci ici :
header('Location: index.php?id='.intval($_GET['id'])); car il me dit que l'url est mal redirigé
Il ne faut pas mettre de HTML avant ton header (http://php.net/manual/fr/function.header.php)
Quelle est l'erreur précisement ? As tu regardé dans les logs voir ce que ça raconte ?
Notice: Undefined index: id in D:\wamp\www\pour_thomas\satisfaction-mvc-light\controller\actions.php on line 19
Notice: Undefined index: id in D:\wamp\www\pour_thomas\satisfaction-mvc-light\model\sondage.php on line 7
Notice: Undefined index: id in D:\wamp\www\pour_thomas\satisfaction-mvc-light\controller\actions.php on line 22
car $_GET est vide . il affiche bien la question 1 et quand je clique sur une des réponses cela me met ces erreurs
J'ai cela au tout début
http://localhost/pour_thomas/satisfaction-mvc-light/index.php?id=1
et quand je clique sur une des réponses, j'ai cela
localhost/pour_thomas/satisfaction-mvc-light/
C'est peut être à cause de cela ?
Inspecte ton formulaire et regarde l'attribut action
. Si le ?id=
n'est pas là, c'est la source du problème.
//gestion POST (réponse utilisateur)
if (!empty($_POST)) {
echo '<br> dans POST rempli';
$_GET['id']++;
echo $_GET['id'];
//quelque soit le choix, l'appel est toujours le même
addReponse($_SESSION['id_utilisateur'],$_POST['sondage_en_cours'],
$_POST['question'],$_POST['choix']);
header('Location :index.php?id='.intval($_GET['id']));
} else {
// echo '<br> dans POST vide';
header('Location :index.php?id=1');
}
J'ai fait ceci en corrigeant
echo "<form method='post' action = 'index.php?id=".$_GET['id']."'>";
Donc les questions s'affichent correctement les une après les autres par contre cela n'ajoute rien dans la base de donnée..
function addReponse($id_personne,$sondage_en_cours,$question,$choix) {
/* $query = "insert into utilisateur_reponse(id_utilisateur,id_question,reponse_question,reponse)
values('".$id_personne."','".$sondage_en_cours."','".$question."','"$choix"')";
$row = db()->query($query);*/
$query = db()->prepare("insert into utilisateur_reponse(id_utilisateur,id_question,reponse_question,reponse)
values(:id_utilisateur,:id_question,:reponse_question,:reponse)");
$query->bindValue(':id_utilisateur', $id_personne);
$query->bindParam(':id_question', $sondage_questions);
$query->bindParam(':reponse_question', $question);
$query->bindParam(':reponse', $choix);
$query->execute();
}
a priori le execute ne fonctionne pas
Tu utilises PDO dans ta class db ?
Si oui, tu peux afficher les erreurs en faisant: $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); (je crois). ça devrait t'aider a débugger ta requête et surtout comprendre ce qui ne va pas.