Page 1 sur 1

Arreter une boucle for sur chaque element

Posté : 19 nov. 2015, 17:03
par Biohazard401
Bonjour à tous,

Je suis en train de créer un arbre binaire en php et mes données sont dans une bdd.

Le principe c est que chaque noeud comporte un id, une question, une réponse, id_left, id_right. Je possède aussi deux boutons "oui" et "non" et je voudrais qu'a chaque click, je descende d'un cran dans l'arbre.

Voila comment j'ai fait

Code : Tout sélectionner

//calcule le nombre d'element pour ma boucle $counting = $db->query('SELECT * FROM node where questions IS NOT NULL'); $count = $counting->rowCount(); for( $i = 0; $i < $count; $i++ ) { // si i égale 0, nous venons juste de rentrer dans la boucle donc j'initialise les élements if($i ==0){ $select = $db->query('SELECT * FROM node where id=1'); $nodes = $select->fetch(); $current_id = $nodes->id; $current_id_left = $nodes->id_left_node_children; $current_id_right = $nodes->id_right_node_children; $current_question = $nodes->questions; echo $current_question; } if(isset($_POST['yes'])){ $select = $db->prepare('SELECT * FROM node where id=:id'); $select->bindParam(':id', $current_id_left); $select->execute(); $nodes = $select->fetch(); $current_id_left = $nodes->id_left_node_children; $current_id_right = $nodes->id_right_node_children; $current_question = $nodes->questions; echo $current_question; } if(isset($_POST['no'])){ $select = $db->prepare('SELECT * FROM node where id=:id'); $select->bindParam(':id', $current_id_right); $select->execute(); $nodes = $select->fetch(); $current_id_left = $nodes->id_left_node_children; $current_id_right = $nodes->id_right_node_children; $current_question = $nodes->questions; } if($nodes->questions == ""){ echo "reponse " . $nodes->responses; die(); } }
Ce bout de code m'affiche bien les élements mais il m'affiche TOUT les élements d'un coup. Résultat, je me retrouve au feuille de l'arbre en 1 click.

Comment je peut faire pour qu il me pose chaque question une par une et que descende seulement d'un cran dans l'arbre ?

Merci

Re: Arreter une boucle for sur chaque element

Posté : 20 nov. 2015, 15:35
par Spols
Je pense que tu ne devrais charger de ta base de donnée qu'une seule question par affichage.
Tu récupère l'id de la question selon le bouton cliqué précédemment, ou si il y a un reset (ou un premier affichage) la question racine.
Tu load donc les info de ta base, et affiche la question avec les 2 boutons. Il faut faire en sorte que tes boutons renvoi l'id de la question suivante ainsi tu saura à chaque affichage quelle question loader.

Re: Arreter une boucle for sur chaque element

Posté : 20 nov. 2015, 15:54
par Biohazard401
C est ce que je fais avec la requete
$select = $db->prepare('SELECT * FROM node where id=:id');
J'affiche la question ou l'id est égale à l id left de la question d avant.

j ai essayer de faire autrement
$select = $db->prepare('SELECT * FROM node where id=:id');
if(!isset($_POST['id'])){
       $id = 1;
}
elseif ($_POST['choix'] == 'yes') {
       $id = $_POST['current_id_left'];
}
elseif ($_POST['choix'] == 'no') {
       $id = $_POST['current_id_right'];
}
 
$select->execute(array(':id'=>$id));
$nodes = $select->fetch();
$current_id_left = $nodes->id_left_node_children;
$current_id_right = $nodes->id_right_node_children;
$current_question = $nodes->questions;
echo $current_question;
mais pour l instant il ne marche pas :(

merci

Re: Arreter une boucle for sur chaque element

Posté : 20 nov. 2015, 16:58
par Spols
Qu'est-ce qui ne marche pas ?
As tu essayé d'afficher ton $id pour voir quelle partie du code ne marche pas ?
Fait affiché ta requète pour voir si elle correspond à ce qu'elle est censé être, retourne t elle le résultat escompté ?

On ne sais pas t'aider si tu ne nous y aide pas

Re: Arreter une boucle for sur chaque element

Posté : 20 nov. 2015, 18:42
par Biohazard401
Autant pour moi :oops:
$select = $db->prepare('SELECT * FROM node where id=:id');
//var_dump("SELECT * FROM node where id=:id");
if(!isset($_POST['id'])){
    $id = 1;
}
if(isset($_POST['oui'])) {
    //$id = 1
    echo $id;

    //je pense que la solution est la mais vue qu il ne connais pas "current id left", il me mets une erreur
    //$id = $_POST['current_id_left'];
}
if(isset($_POST['non'])) {
    //$id = 1
    echo $id;
    //$id = $_POST['current_id_right'];
}

$select->execute(array(':id'=>$id));
$nodes = $select->fetch();
$current_id_left = $nodes->id_left_node_children;
$current_id_right = $nodes->id_right_node_children;
$current_question = $nodes->questions;

//affiche toujours la question ou l'id est égale a 1
echo $current_question;
Donc pour résumé, ce bout de code ne me mets aucune erreur mais je n'arrive pas à changer l'id quand je suis dans les conditions de "oui" ou "non".

Je pense que la solution du probleme est ici
$id = $_POST['current_id_right'];
Il faut que j arrive a mettre $current_id_left dans $id mais je tourne un peu en rond a ce sujet :?
On est bien d'accord que je ne dois pas faire une boucle ?

Merci

Re: Arreter une boucle for sur chaque element

Posté : 20 nov. 2015, 19:14
par Saian
Salut, il faut bien comprendre qu'à chaque appel de la page le script s'exécute dans son intégralité. Il ne peut pas s'arrêter au milieu en attente d'un retour utilisateur puis continuer où il s'était arrêté.

A chaque appel (que la réponse soit oui ou non) il faut donc transmettre toutes les informations utiles au script. A priori, l'id de la question affichée et quel bouton a été cliqué. Le script pourra alors récupérer l'id de la question suivante selon la réponse et proposer la nouvelle question.

En algo ça donne un truc du style :

Défini question_id = id de la première question

SI réponse à une question
-- Récupération de la question via le paramètre question_id soumis
-- Si réponse oui
---- Défini question_id = id question de réponse oui
-- Sinon
---- Défini question_id = id question de réponse non

Récupération de la question à afficher avec question_id

Affichage du formulaire

Re: Arreter une boucle for sur chaque element

Posté : 20 nov. 2015, 19:22
par Biohazard401
Et c est pour sa qu il faut utiliser les variables $post ?

Re: Arreter une boucle for sur chaque element

Posté : 20 nov. 2015, 19:27
par Saian
La superglobale $_POST permet de récupérer les variables transmises par la soumission d'un formulaire en méthode POST.

Re: Arreter une boucle for sur chaque element

Posté : 20 nov. 2015, 19:34
par Biohazard401
ok super, tu ma bien eclaicie la chose :D

merci beaucoup