Aller au contenu

Un souci avec la fonction rand() en PHP


Sujets conseillés

Posté

Bonjour voilà j'ai une chose sur laquelle j'aimerais avoir une précision en PHP car ca n'est toujours pas clair dans mon esprit.

En fait je cherche a générer un code de vérification avec la fonction rand().

Le souci que j'ai est que je génère un code que je stock dans une variable nommée $vrai_code et que a côté, je récupère le code tapé par l'utilisateur a partir d'un formulaire dans une variable $code.

Ensuite, j'utilise une condition avec if ($code == $vrai_code) et hop il exécute une insertion dans un DB.

Mon souci ben c'est que avec rand(); ca ne marche pas alors que si je définis dans le code un nombre statique, la ca va...

Je me suis dis, ok je vais debug et faire un echo $vrai_code; pour voir si j'avais un nombre bien généré ce qui est le cas...

Ma question: Pq par exemple 100 ( généré avec rand(); ) n'est pas le même que 100 ( récupéré avec un formulaire ) ?

Je pense qu'il doit alors y avoir des types de variables comme en langage C ou je comparerais un String avec un int ?

Quelqu'un pour m'aider? :unsure:

Merci

Posté

Normalement, rand génère un nombre entre 0 et 1, c'est déjà bizarre que tu obtiennes 100.

Pour ma part, pour générer un code de vérification, j'effectue un md5 sur une chaîne de caractères (rand, time, etc), et j'en récupère les 5 premiers caractères.

Posté

Salut Gecko64,

Je ne pense pas que cela vienne du typage des variables, c'est justement un des points faibles/forts de php. Cependant je n'en suis pas certain. Qu'est-ce que ça donne si tu utilises des guillemets (ce qui revient à dire qu'il s'agit d'une chaîne) ?

Par contre en lisant ton post, je me demande s'il ne s'agit pas d'un problème de procédure ... Tu cherches à faire une sorte de code de vérification ? Si c'est le cas, le code est sans doute généré deux fois : une pour la première à la lecture, une seconde fois après envoi des données et rechargement de la page. Si c'est ça, il faut bien vérifier la façon dont tu stockes ta variable car il y a très peu de chance de tomber deux fois de suite sur le même nombre aléatoire ...

Bon, c'est tordu comme hypothèse, mais ce n'est pas impossible :P

Faudrait que tu en dises plus sur ta façon de procéder ...

knockedmaster

Normalement, rand génère un nombre entre 0 et 1, c'est déjà bizarre que tu obtiennes 100.

Rand ne génére pas un nombre entre 0 et 1 ... rand La vérité est ailleurs :wacko:

Posté
Normalement, rand génère un nombre entre 0 et 1, c'est déjà bizarre que tu obtiennes 100.

Pour ma part, pour générer un code de vérification, j'effectue un md5 sur une chaîne de caractères (rand, time, etc), et j'en récupère les 5 premiers caractères.

Ceci pourtant m'a bien donné un nombre entre 100 et 999 : rand(100, 999);

Je l'a vérifié avec un echo :unsure:

Pour l'idée du md5, je note, ca peut toujours être utile aussi si je ne comprend pas au final ce qui cloche avec rand( );

Salut Gecko64,

Je ne pense pas que cela vienne du typage des variables, c'est justement un des points faibles/forts de php. Cependant je n'en suis pas certain. Qu'est-ce que ça donne si tu utilises des guillemets (ce qui revient à dire qu'il s'agit d'une chaîne) ?

Par contre en lisant ton post, je me demande s'il ne s'agit pas d'un problème de procédure ... Tu cherches à faire une sorte de code de vérification ? Si c'est le cas, le code est sans doute généré deux fois : une pour la première à la lecture, une seconde fois après envoi des données et rechargement de la page. Si c'est ça, il faut bien vérifier la façon dont tu stockes ta variable car il y a très peu de chance de tomber deux fois de suite sur le même nombre aléatoire ...

Bon, c'est tordu comme hypothèse, mais ce n'est pas impossible :P

Faudrait que tu en dises plus sur ta façon de procéder ...

knockedmaster

Je crois que tu as raison, je ne pensais plus que ma page était entièrement rechargée et donc mon ancien code effacé par le nouveau en début de cette même page :-/

J'aurais du y penser plus tôt... :nonono: Je vais voir pour modifier ca ;)

Merci !

Posté

Oui enfin facile, j'ai changé mon endroit ou je génère mon code pour que il soit testé avant d'être a nouveau regénéré pour la tentative ou insertion suivante d'un message et malgrè ca, ca me fait toujours le même genre de souci... :(

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
<head>
<title> Electricite Alain - Avis des clients </title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
<?php include("detect_browser_css.php");?>
<Link rel="SHORTCUT ICON" href="images/favicon_2.ico"/>
<style type="text/css">
table
{
border-collapse : collapse;
border : 2px solid white;
margin : auto;
}
th,td
{
border : 1px solid white;
}
</style>
</head>

<body>
<!-- Banniere Superieure-->
<?php include ("entete.php"); ?>
<!-- Menu lateral-->
<?php include ("menugauche.php"); ?>
<!-- Corps Central-->
<div id="corps">
<h1>Laisser un commentaire :</h1>


<?php
include("connexion_BD.php");
//Si le formulaire est complete.
if(isset($_POST["bouton_OK"]) && $_POST["identite"]!=='' && $_POST["commentaire"]!=='' && $_POST["code"] == $vraicode)
{
//On recup les donnees.
$identite = $_POST['identite'];
$commentaire = $_POST['commentaire'];
$date = date('Y,m,d');
$h = date('H');
$m = date('i');
$heure = $h.':'.$m;
//On insere les données dans la base de donnée et on repropose le formulaire.
mysql_query("INSERT INTO messages Values ('','$identite','$commentaire','$date','$heure')");
//On vide le contenu es variables.
unset($_POST['identite']);
unset($_POST['commentaire']);
unset($_POST['code']);
}
//On genere un code.
$vraicode = rand(100,999);
?>
<center>
<form name="avisclient" method="post">
Identite : <input type="text" name="identite" value="<?php if(isset($_POST['identite'])){echo $_POST['identite'];}?>"></input>
<?php
if($_POST["identite"]==='')
{
?>
<font color="red">*</font>
<?php
}
?>
<br/>
Commentaire : <textarea type="textarea" name="commentaire" rows="3" cols="40"><?php if(isset($_POST['commentaire'])){echo $_POST['commentaire'];}?></textarea>
<?php
if($_POST["commentaire"]==='')
{
?>
<font color="red">*</font>
<?php
}
?>
<br/>
Code : <input type="text" name="code" value=""></input>
<?php
if($_POST["code"]==='')
{
?>
<font color="red">*</font>
<?php
}
elseif(isset($_POST["code"]))
{
?>
<font color="red">Mauvais code</font>
<?php
}
echo $vraicode;
?>
<br/>
<input type="submit" name="bouton_OK" value="Soumettre">
</form>
</center>

Posté (modifié)

Vi vi vi, ça ne peut pas aller comme ça :nonono:

if(isset($_POST["bouton_OK"]) && $_POST["identite"]!=='' && $_POST["commentaire"]!=='' && $_POST["code"] == $vraicode)
{
blabla
}
//On genere un code.
$vraicode = rand(100,999);

Tu vérifies une variable qui n'existe pas puisque tu la déclares après ...

Tu peux (dois) utiliser une variable de session pour mémoriser le nombre aléatoire généré :

if(isset($_POST["bouton_OK"]) && $_POST["identite"]!=='' && $_POST["commentaire"]!=='' && $_POST["code"] == $_SESSION['vraicode'])
{
blabla
}
else
{
//On genere un code.
$vraicode = rand(100,999);
// On l'enregistre dans une variable de session
$_SESSION['vraicode'] = $vraicode;
}

N'oublie pas de placer un session_start(); tout au début de ton code, avant qu'il n'y ait le moindre affichage, sinon c'est le bug !

EDIT : tu peux aussi ajouter un else pour ne générer le code que s'il n'existe pas ou s'il est mauvais ... Je viens de tester ça fonctionne

Tiens-nous au courant ;)

@+

Modifié par KnockedMaster
Posté

Ha ben merci à toi KnockedMaster :P

Je viens de faire les modifs et ca fonctionne sans souci maintenant :)

Je commence a mieux comprendre :P

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...