problème génération nombre aléatoire

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : problème génération nombre aléatoire

par Cyrano » 10 sept. 2005, 17:26

Ta fonction ne retourne rien, c'est normal que tu n'aies rien :

Tu appelles la fonction, mais non seulement la fonction ne retourne rien, mais tu ne récupères rien non plus. Exemple pour illustrer:
<?php
/* On définit une fonction */
function ajout_ligne($txt)
{
    if(!empty($txt))
    {
        /* On initialise la variable de retour avec le texte envoyé en paramètre */
        $retour = "<p>". $txt ."</p>\n";
    }
    else
    {
        /* Le paramètre envoyé est une chaine vide, on initialise le retour avec une phrase par défaut */
        $retour = "<p>Vous avez envoyé une chaine vide.</p>\n";
    }
    return $retour;
}
/* FIN de la fonction */
?>

<?php
/* Début du script */
?>
<html>
<head>
<title></title>
</head>
<body>
<?php
/* On crée une variable qui va contenir le retour de la fonction */
$chaine = ajout_ligne("Ceci est le retour formaté par la fonction ajout_ligne()");
/* Maintenant on peut faire afficher le résultat */
echo($chaine);

/* Fin du script */
?>
</body>
</html>

par anonymousguest » 10 sept. 2005, 17:12

j'ai modifier la foncion et l'appel de cette fonction, ca donne ceci:
//fonction de génération du numéro de la ligne (id)
function gen($limf, $formerf) {
	$id = mt_rand(1,$limf);
	
	//vérification de l'absence de number dans former
	if (!preg_match("!$id!", $formerf))
	{
		$former=$formerf.'&nbsp;'.$id;
	}
	
	else
	{
		gen($limf, $formerf);
	}
}

gen($lim, $former);
mais ca marche toujours pas :?

par Cyrano » 10 sept. 2005, 17:11

Je crois que tu n'as pas bien saisi les fonctions en PHP : Les variables qu'on touve à l'intérieur d'une fonction sont des variables "privées" dont la portée se limite à l'intérieur de la fonction. De la même manière, les variables qui sont à l'extérieur de la fonction n'influencent pas les instructions de la fonction.

La fonction PHP est un monde clos: on lui envoie ou non des paramètres et elle retourne ou non le résultat des instructions qu'elle exécute. Mais il y a indépendance entre l'intérieur et l'extérieur d'une fonction.

Ta variable $former est modifiée sans avoir été au préalable initialisée à l'intérieur de la fonction: le fait de l'avoir initialisée en début de script n'y change rien, ça se passe en dehors de la fonction qui est une boite étanche: la seule porte d'entrée, ce sont les parenthèses du nom de la fonction, c'est là qu'on fait passer des paramètres.

Est-ce que tu saisis sommairement ce principe général ?

par Lunatic » 10 sept. 2005, 17:05

Il faut que tu lises quelques tutos sur les fonctions et la portée des variables ;)

Ton code devrait plutôt ressembler à cela :
<?php
$former=2;

//connexion bdd
mysql_connect("localhost", "login", "mdp") or die('Impossible de se connecter : ' .mysql_error());
mysql_select_db("db");

//compte le nombre d'entrées dans la bdd
$retour = mysql_query("SELECT COUNT(*) AS nbre_entrees FROM table");
while ($donnees = mysql_fetch_array($retour))
{
    $lim = $donnees['nbre_entrees'];
}

//fonction de génération du numéro de la ligne (id)
function gen($une_variable) {
    $id = mt_rand(1,$une_variable);
    
    //vérification de l'absence de number dans former
    if (!preg_match("!$id!", $former))
    {
        $former.='$nbsp;'.$id;
    }
    
    else
    {
        gen($une_variable);
    }
}

gen($lim);
echo $former.'<br/>'.$id;
?>

par anonymousguest » 10 sept. 2005, 16:55

...
//connexion bdd
mysql_connect("localhost", "login", "mdp") or die('Impossible de se connecter : ' .mysql_error());
mysql_select_db("db");

//compte le nombre d'entrées dans la bdd
$retour = mysql_query("SELECT COUNT(*) AS nbre_entrees FROM table");
while ($donnees = mysql_fetch_array($retour))
{
    $lim = $donnees['nbre_entrees']; // <<=== D'ici!!!
}
...

par Cyrano » 10 sept. 2005, 16:52

Ça ne me surprends pas vraiment :
function gen() {
    $id = mt_rand(1,$lim); // <<=== D'où sort cette variable $lim ??

problème génération nombre aléatoire

par anonymousguest » 10 sept. 2005, 16:46

Bonjour,
et oui, encore moi.
je cherche à travailler dans une entrée d'une bdd sélectionnée aléatoirement, j'ai donc codé le script ci-dessous pour définir cette entrée.
j'ai placé une ligne d'affichage pour vérifier l'efficacité du script mais $id ne s'affiche pas :(
<?php
$former=2;

//connexion bdd
mysql_connect("localhost", "login", "mdp") or die('Impossible de se connecter : ' .mysql_error());
mysql_select_db("db");

//compte le nombre d'entrées dans la bdd
$retour = mysql_query("SELECT COUNT(*) AS nbre_entrees FROM table");
while ($donnees = mysql_fetch_array($retour))
{
	$lim = $donnees['nbre_entrees'];
}

//fonction de génération du numéro de la ligne (id)
function gen() {
	$id = mt_rand(1,$lim);
	
	//vérification de l'absence de number dans former
	if (!preg_match("!$id!", $former))
	{
		$former.='$nbsp;'.$id;
	}
	
	else
	{
		gen();
	}
}

gen();
echo $former.'<br/>'.$id;
?>
PS: j'ai fait une regex pour ne pas que la ligne soit la même chaque fois, ici, j'ai défini la variable contenant les id précédents arbitrairement, en vrai, elle sera transmise par post à chaque page