Partage
  • Partager sur Facebook
  • Partager sur Twitter

Fonction aléatoire

Sujet résolu
    13 novembre 2017 à 2:43:07

    Bonjour ma fonction aléatoire renvoie toujours la même variable, comment faire ?

    <?php
    function plz(){
    $reks='SELECT * FROM livre WHERE id= ROUND (RAND()*200) +1 ORDER BY RAND( ) LIMIT 1';
    global $b;
    $stp = $b->query($reks);
    $plzz = $stp->fetch();
    return $plzz;
    }
    ?>

    $plzz renvoie toujours la même chose, j'ai essayé plusieurs techniques et cherché sur google mais je trouve aucune solution :s

    • Partager sur Facebook
    • Partager sur Twitter
      13 novembre 2017 à 8:39:51

      Salut,

      A quoi sert le WHERE ?

      -
      Edité par elyppire 13 novembre 2017 à 8:40:02

      • Partager sur Facebook
      • Partager sur Twitter
      Retrouvez-moi aussi sur Zeste de SavoirTutoriel WAMP • Nouvelle F.A.Q. PHP
        13 novembre 2017 à 13:52:38

        Pour un random vraiment aléatoire essayer d'inclure un timestamp. 

        A savoir que le totalement aléatoire est une illusion en informatique, en lançant la même fonction au même moment d'un programme on reviens assez souvent au même résultat, en y ajoutant une notion de temps qui lui par contre est en évolution constante ce phénomène tant à se réduire.

        • Partager sur Facebook
        • Partager sur Twitter
        Emmanuel Simon - Développeur  Php back - end / Mentor OC.
          13 novembre 2017 à 14:16:43

          Bonjour,

          Je déplace dans le forum BDD ;)

          +1 pour elyppire, supprime la clause WHERE, le ORDER BY RAND() LIMIT 1 est suffisant ...

          D'autant qu'avec ta clause WHERE RAND()*200 tu limites le résultat à 200 enregistrements possibles ... et prend le risque de tomber sur un id inexistant ...

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            14 novembre 2017 à 5:06:27

            J'ai changé en 
            $reks='SELECT * FROM livre WHERE RAND() > 0.9 ORDER BY RAND() LIMIT 1';

            maintenant je n'ai pas résolu mon problème,

            quand j'utilise la fonction avec deux variables différentes:

            $x = plz()
            
            $y = plz()

            elles donnent bien deux résultats différents or je l'utilise dans une fonction:

            function z ()
            {$x= plz();
            ...
            }

            à chaque utilisation de la fonction z, $x prend la même valeur et ce même si je supprime $x avec unset ou que je lui attribue une autre valeur temporairement. Comment je peux faire ?

            • Partager sur Facebook
            • Partager sur Twitter
              14 novembre 2017 à 7:05:06

              La question demeure : pourquoi un WHERE dans ta requête ?

              • Partager sur Facebook
              • Partager sur Twitter
              Retrouvez-moi aussi sur Zeste de SavoirTutoriel WAMP • Nouvelle F.A.Q. PHP
                14 novembre 2017 à 8:39:02

                J'ai lu que cela optimisait ma requête sur plusieurs sites
                • Partager sur Facebook
                • Partager sur Twitter
                  14 novembre 2017 à 9:15:43

                  Je veux bien savoir lesquels. En tout état de cause, avant de faire de l'optimisation, il est nécessaire de faire fonctionner :)

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Retrouvez-moi aussi sur Zeste de SavoirTutoriel WAMP • Nouvelle F.A.Q. PHP
                    14 novembre 2017 à 9:20:59

                    JeremBellier a écrit:

                    J'ai changé en 

                    $reks='SELECT * FROM livre WHERE RAND() > 0.9 ORDER BY RAND() LIMIT 1';

                    Quel est ton besoin ? Récupérer un livre au hasard ?

                    Quel est le rôle du 0.9 ?

                    Pour la partie PHP, peux-tu reposter tout le code, celui qui génère toujours la même valeur ?

                    Après il n'est pas forcément intelligent de relancer la requête x fois dans le même code ... Autant récupérer tous les livres dans un tableaux et en choper un au hasard avec PHP. Exemple simpliste :

                    $requete = $b->query('SELECT * FROM livre');
                    $livres = $requete->fetchAll();
                    $requete->closeCursor();
                    
                    function aleaArray( Array $tableau ) {
                    	$alea = rand( 0, count( $tableau )-1 );
                    	return $tableau[$alea];
                    }
                    
                    var_dump( aleaArray($livres) );
                    var_dump( aleaArray($livres) );
                    var_dump( aleaArray($livres) );
                    var_dump( aleaArray($livres) );

                    Ainsi tu ne joues qu'une seule fois la requête SQL ...

                    -
                    Edité par Benzouye 15 novembre 2017 à 9:23:40

                    • Partager sur Facebook
                    • Partager sur Twitter
                    Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                      15 novembre 2017 à 4:14:09

                      $requete = $b->query('SELECT * FROM livre');
                      $livres = $requete->fetchAll();
                      $requete->closeCursor();
                       
                      function aleaArray( Array $tableau ) {
                          $alea = rand( 0, count( $tableau )-1 );
                          return $tableau[$alea];
                      }

                      Ducoup j'ai récupéré les livres dans le tableau et j'utilise la fonction pour prendre une colonne de la bdd aléatoirement

                      function Rando (){	
                      <?php 
                      $tablo = aleaArray($livres);
                      ?>
                      var inc = <?php echo $tablo['page']; ?>;
                      var titre2 = "<?php echo $tablo['titre'];?>";
                      var url = "<?php echo $tablo['url'];?>";	
                      
                      document.getElementById('ti').innerHTML =titre2;
                      document.getElementById('tii').innerHTML =url;
                      document.getElementById('loli').innerHTML =inc;
                      	}

                      $tablo prend toujours la même valeur...

                      • Partager sur Facebook
                      • Partager sur Twitter
                        15 novembre 2017 à 9:25:01

                        Là tu mélanges du JavaScript et du PHP ... tu ne parlais pas de ça au départ ...

                        PHP est exécuté côté serveur (une seule fois) et dans ton cas, génère une page contenant du JavaScript.

                        Ta fonction JavaScript Rando() utilise donc toujours les mêmes données une fois la page chargée côté navigateur ... la variable $tablo n'est évaluée qu'une seule fois ... ta page HTML et ta fonction JavaScript ne contiennent donc qu'un seul livre ... tu peux vérifier cela en regardant simplement le code HTML généré ...

                        • Partager sur Facebook
                        • Partager sur Twitter
                        Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                          15 novembre 2017 à 9:36:51

                          La seule solution est donc de mettre $livres en javascript ?
                          • Partager sur Facebook
                          • Partager sur Twitter
                            15 novembre 2017 à 9:56:33

                            Si tu avais clairement posé ta question au départ ...

                            JeremBellier a écrit:

                            La seule solution est donc de mettre $livres en javascript ?

                            Ou de travailler avec AJAX ...

                            Je suppose que ta fonction Rando est appelé sur un événement du DOM (clic, chargement de la page, etc.).

                            Avec AJAX tu pourrais interroger dynamiquement un fichier PHP qui retournerait un livre aléatoirement ...

                            La question importante est combien de fois par minute/heure/jour vas-tu solliciter la fonction aléa ? Pour savoir comment structurer le truc ...

                            • Partager sur Facebook
                            • Partager sur Twitter
                            Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                              15 novembre 2017 à 10:01:49

                              Je suppose que ta fonction Rando est appelé sur un événement du DOM (clic, chargement de la page, etc.). 

                              Oui clic.

                              La question importante est combien de fois par minute/heure/jour vas-tu solliciter la fonction aléa ? Pour savoir comment structurer le truc ...

                              très sollicitée, plusieurs fois par minute.

                              • Partager sur Facebook
                              • Partager sur Twitter
                                15 novembre 2017 à 10:05:35

                                Ton besoin c'est donc :

                                Chaque minute, plusieurs utilisateurs seront connectés en même temps et vont chacun cliquer sur un bouton pour obtenir un livre au hasard de la base de données, et cela sans recharger la page.

                                C'est bien ça ? Sans recharger la page est important ?

                                -
                                Edité par Benzouye 15 novembre 2017 à 10:06:13

                                • Partager sur Facebook
                                • Partager sur Twitter
                                Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                  15 novembre 2017 à 10:31:06

                                  Si tu ne veux pas recharger la page, alors tu vas devoir faire une chaque fois et utiliser AJAX ...

                                  Côté PHP, un fichier get_livre.php par exemple, qui contiendrait l'appel à la base de données et retournerait un livre au hasard :

                                  <?php
                                  	$livre = array();
                                  	try {
                                  		// Connexion MySQL via PDO
                                  		$bdd = new PDO( ... );
                                  		
                                  		// Requête pour récupérer un livre au hasard
                                  		$requete = $bdd->query(
                                  			'SELECT * FROM livre ORDER BY RAND() LIMIT 1;'
                                  		);
                                  		// Stocker le résultat dans un tableau
                                  		$livre = $requete->fetch();
                                  	}
                                  	catch( Exception $e ) {
                                  		$livre = $e;
                                  	}
                                  	
                                  	// Afficher au format JSON pour AJAX
                                  	echo json_encode( $livre );
                                  ?>

                                  Côté JavaScript, une fonction avec l'appel AJAX. Si tu travaille avec jQuery ce serait :

                                  $('#bouton-livre-aleatoire').click( function(e) {
                                  	$.ajax({
                                  		url: "get_livre.php",
                                  		dataType: 'json',
                                  		error: function(e) {
                                  			console.log(e);
                                  		},
                                  		success: function( livre ) {
                                  			console.log(livre);
                                  			document.getElementById('ti').innerHTML = livre.titre;
                                  			document.getElementById('tii').innerHTML = livre.url;
                                  			document.getElementById('loli').innerHTML = livre.page;
                                  		}
                                  	});
                                  });

                                  -
                                  Edité par Benzouye 15 novembre 2017 à 10:33:15

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                    16 novembre 2017 à 0:33:29

                                    J'ai tout lu ajax, j'ai bien compris et ça marche niquel! merci ;)
                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    Fonction aléatoire

                                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                    • Editeur
                                    • Markdown