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

Eléphanteau du PHP | 43 Messages

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

Mammouth du PHP | 19672 Messages

10 sept. 2005, 16:52

Ça ne me surprends pas vraiment :
function gen() {
    $id = mt_rand(1,$lim); // <<=== D'où sort cette variable $lim ??
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 43 Messages

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!!!
}
...

Eléphanteau du PHP | 28 Messages

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;
?>

Mammouth du PHP | 19672 Messages

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 ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 43 Messages

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 :?

Mammouth du PHP | 19672 Messages

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>
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: