Redirection vers une autre page avec modele MVC

Par gweared, il y a 8 ans


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

Ce que je fais

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

15 réponses

G1.3, il y a 8 ans

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 ';
gweared, il y a 8 ans

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

G1.3, il y a 8 ans

J'ai un peu de mal à saisir...

Ça fonctionne pas ça ? (vu que c'est commenté)

header('Location:index.php?id='.$next); exit();
gweared, il y a 8 ans

non puisque $_GET['id'] est inconnu

Lourys, il y a 8 ans

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)

gweared, il y a 8 ans

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&eacute;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é

gweared, il y a 8 ans

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

G1.3, il y a 8 ans

Et l'URL lorsque tu as cette erreur ?

G1.3, il y a 8 ans

Inspecte ton formulaire et regarde l'attribut action. Si le ?id= n'est pas là, c'est la source du problème.

gweared, il y a 8 ans
//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..

G1.3, il y a 8 ans

Tu peux remontrer la fonction addReponse stp ?

gweared, il y a 8 ans
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

G1.3, il y a 8 ans

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.