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


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
Auteur

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();
gweared
Auteur

non puisque $_GET['id'] est inconnu

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
Auteur

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é

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 ?

gweared
Auteur

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

Et l'URL lorsque tu as cette erreur ?

gweared
Auteur

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.

gweared
Auteur
    //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..

Tu peux remontrer la fonction addReponse stp ?

gweared
Auteur
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.