Arreter une boucle for sur chaque element

Avatar du membre
Petit nouveau ! | 5 Messages

19 nov. 2015, 17:03

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

Mammouth du PHP | 1967 Messages

20 nov. 2015, 15:35

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.
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Avatar du membre
Petit nouveau ! | 5 Messages

20 nov. 2015, 15:54

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

Mammouth du PHP | 1967 Messages

20 nov. 2015, 16:58

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
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Avatar du membre
Petit nouveau ! | 5 Messages

20 nov. 2015, 18:42

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

Avatar du membre
Mammouth du PHP | 1609 Messages

20 nov. 2015, 19:14

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
Modifié en dernier par Saian le 20 nov. 2015, 19:24, modifié 1 fois.
Développeur web depuis + de 20 ans

Avatar du membre
Petit nouveau ! | 5 Messages

20 nov. 2015, 19:22

Et c est pour sa qu il faut utiliser les variables $post ?

Avatar du membre
Mammouth du PHP | 1609 Messages

20 nov. 2015, 19:27

La superglobale $_POST permet de récupérer les variables transmises par la soumission d'un formulaire en méthode POST.
Développeur web depuis + de 20 ans

Avatar du membre
Petit nouveau ! | 5 Messages

20 nov. 2015, 19:34

ok super, tu ma bien eclaicie la chose :D

merci beaucoup