Page 1 sur 1

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

Posté : 10 sept. 2005, 16:46
par anonymousguest
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

Posté : 10 sept. 2005, 16:52
par Cyrano
Ça ne me surprends pas vraiment :
function gen() {
    $id = mt_rand(1,$lim); // <<=== D'où sort cette variable $lim ??

Posté : 10 sept. 2005, 16:55
par anonymousguest
...
//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!!!
}
...

Posté : 10 sept. 2005, 17:05
par Lunatic
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;
?>

Posté : 10 sept. 2005, 17:11
par Cyrano
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 ?

Posté : 10 sept. 2005, 17:12
par anonymousguest
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 :?

Posté : 10 sept. 2005, 17:26
par Cyrano
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>