IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Boucles pour vérifier si un rand() est présent ou non


Sujet :

Langage PHP

  1. #1
    Membre actif

    Homme Profil pro
    Webmaster, Réalisateur Vidéo, Chef de projet Web documentaire
    Inscrit en
    Juillet 2006
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Webmaster, Réalisateur Vidéo, Chef de projet Web documentaire
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2006
    Messages : 404
    Points : 241
    Points
    241
    Par défaut Boucles pour vérifier si un rand() est présent ou non
    Bonjour

    Un nombre rand me renvoie une question d'un QCM, mais pour éviter de voir 2 fois la même question je vérifie si le numero est dèja sorti et je vérifie si toutes les questions sont déjà sorties.
    J'avais utilisé l'instruction goto cela fonctionnait bien mais suivant la version de serveurs je risque des problèmes. Je pense qu'il y a une solution des do while mais je ne vois pas bien comment mettre ça en place.

    Le code de la boucle avec les goto:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    // SI LA SESSION JEU N'EST PAS DÉFINI (PREMIERE VISITE) Affectation DU TABLEAU servant à vérifier si une question est déjà sorti
    if(!isset($_SESSION['jeu'])){ 
    	$tabrand=array($i);
    }
    else{
    	$tabrand=$_SESSION['tab'];
    	$i++;
     
    }// COMPTAGE DES LIGNES DE LA TABLE POUR DÉFINIR LE NOMBRE MAXI DU NUMERO ALEATOIRE
    $count=mysqli_query($liendb, "SELECT * FROM qcm");
    $countligne= mysqli_num_rows($count);
    // NOMBRE ALEATOIRE DE 1 au nombre trouvé avant ($countligne)
    boucle:
    $rand= rand(1,$countligne);
     
    // si le numero au hasard n'est pas dans le tableau (déjà sorti) le numero est incrémenté dans le tableau 
    if(!in_array($rand, $tabrand)){
    $tabrand[$i]=$rand;
    // passage en session de la table de la session jeu permettant de définir permiere viste ou pas et de l'id pour être incrémenter au procahin passage.
    $_SESSION['tab']=$tabrand;
    $_SESSION['jeu']="ok";
    $_SESSION['id']=$i;
     
     
     
    // requête sql pour afficher l'élément dont l'id correspond au N° sorti
    $sqlquest="SELECT * FROM qcm where idqcm='$rand'";
    $req = mysqli_query($liendb,$sqlquest) or die(mysql_error());
     
    $question=mysqli_fetch_assoc($req);
    $laquestion=$question['quest'];
    $rep1=$question['rep1'];
    $rep2= $question['rep2'];
    $rep3=$question['rep3'];
    $them= $question['theme'];
    }
     
    // si le numero est déjà dans le tableau  et si toutes les questions n'ont pas déjà été posées le goto fait revenir au choix du rand
    else {
    	if($i<$countligne){
    	goto boucle;
    	}
    	else{// sinon c'est terminé
    	?>
        <div id="fin">
        <div id="score">La partie est terminée </div>
    }
    // quand le rand n'est pas encore sorti affichage de la page html.

  2. #2
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 835
    Points
    2 835
    Par défaut
    Vous codez en Assembleur ? =D

    Il n'y a pas besoin de goto(). D'ailleurs, vous m'apprenez quelque chose, je ne savais même pas qu'il était possible de l'utiliser en PHP

    Quoi qu'il en soit, votre code est presque correct. Il vous faut cependant utiliser des tableaux pour stocker vos informations.
    Voici un petit exemple :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    <?php
    session_start();
     
    if (!$_SESSION['answered_list_ids']) {
    	$_SESSION['answered_list_ids'] = array();
    }
     
    if (!$_SESSION['max_question_id']) {
    	$count = mysqli_query($liendb, "SELECT MAX(votre_champ_id) AS max_id FROM qcm"); // Meilleure requête que de tout compter !
    	$countligne = mysqli_fetch_assoc($count);
    	$_SESSION['max_question_id'] = $countligne['max_id'];
    }
     
    $new_question_id = 0;
    while(!$new_question_id && count($_SESSION['answered_list_ids']) < $_SESSION['max_question_id']) {
    	$rand = mt_rand(0, $_SESSION['max_question_id']);
    	if (!in_array($rand, $_SESSION['answered_list_ids'])) {
    		$new_question_id = $_SESSION['answered_list_ids'][] = $rand;
    	}
    }
     
    if ($new_question_id) {
            // On a une question a afficher
    } else {
           // On a affiché toutes les questions, on pourrait afficher un message comme quoi c'est fini
    }


    NB: J'ai modifié la requête qui compte les IDs et je l'ai mise en SESSION pour éviter de la refaire tout le temps... Il faudra le changer si elles sont destinées à changer très souvent !

  3. #3
    Membre actif

    Homme Profil pro
    Webmaster, Réalisateur Vidéo, Chef de projet Web documentaire
    Inscrit en
    Juillet 2006
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Webmaster, Réalisateur Vidéo, Chef de projet Web documentaire
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2006
    Messages : 404
    Points : 241
    Points
    241
    Par défaut
    merci darkstar123456.
    La fonction goto m'a rappelé des vieux souvenirs quand je bidouillais en basic dans les années 80.
    De ce que j'ai put en lire beaucoup n'aime pas cette fonction, perso je trouve ça très pratique car j'ai encore un peu de mal avec les boucles.
    Je n'ai d'ailleurs pas tout compris à ce que tu proposes j'ai besoin d'éclaircissement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $new_question_id = 0;
    while(!$new_question_id && count($_SESSION['answered_list_ids']) < $_SESSION['max_question_id']) {// pourquoi le ! devant new_question id
    	$rand = mt_rand(0, $_SESSION['max_question_id']);
    	if (!in_array($rand, $_SESSION['answered_list_ids'])) {
    		$new_question_id = $_SESSION['answered_list_ids'][] = $rand;
    	}
    }
    if ($new_question_id)// si je comprends bien le if est équivalent à if ($new_question_id !=0), j'ignorais qu'un if renvoyait FALSE s'il était égal à 0
    et ensuite quand j teste la valeur $rand n'est pas renvoyé dans la suite, je ne comprends pas ou est le pb.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if ($new_question_id) {
    	echo"<br>rand ".$rand;
    // requete sql pour afficher l'élément dont l'id correspond au N° sorti
    $sqlquest="SELECT * FROM qcm where idqcm='$rand'";
    $req = mysqli_query($liendb,$sqlquest) or die(mysql_error());
    $question=mysqli_fetch_assoc($req);
    $laquestion=$question['quest'];
    }
    le echo rand ne renvoie rien et donc mes variables suivantes sont vide.
    merci pour ton aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2000] Comment faire pour vérifier qu'un fichier est bien présent dans un emplacement précis
    Par Avinetor dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 05/06/2009, 14h12
  2. Réponses: 11
    Dernier message: 16/12/2007, 16h33
  3. vérifier si groupe local est présent sur un PC
    Par poussin_44 dans le forum VB.NET
    Réponses: 3
    Dernier message: 01/08/2007, 15h44
  4. Réponses: 2
    Dernier message: 20/07/2007, 08h02
  5. Réponses: 6
    Dernier message: 12/01/2007, 21h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo