IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Valeur $var=rand(); change si stockée en bdd ou session [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre régulier

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 52
    Points : 97
    Points
    97
    Par défaut Valeur $var=rand(); change si stockée en bdd ou session
    Je commence à m'arracher les cheveux (et vu l'heure la réflexion est tout sauf efficace vu que 7h30 la c'est encore le soir pour moi...)

    Je galère betement sur un truc trés con, le stockage d'une variable dont la valeur est générée aléatoirement.

    Prenons l'exemple suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $test=(rand()%10;
    echo $test;
    mysql_query("UPDATE t_test SET test=".$test." WHERE id=1");
    $_SESSION['test']=$test;
    L'exemple est trés simple, on assigne une valeur aléatoire comprise entre 0 et 10 à une variable $test. On affiche cette variable, puis on la stocke en base et en session. Et bien la valeur stocké n'est pas la même que la valeur affichée. On peut utiliser la variable $test 15 fois dans le script, elle garde bien sûr sa valeur, mais si on essaye de la stocker dans une bdd ou en session, on dirait qu'un random est effectué à nouveau.
    J'ai bien sur essayé pas mal de trucs, un peu toutes les facons de faire de l'aléatoire (mt_rand, un tableau avec array_rand, shuffle($array) -> $array[0], et meme une requete avec ORDER BY RAND()), j'ai tenté avec $test=(int)rand(), de faire un $test=$test/1 apres le rand, et quelques trucs du genre.
    Bref, rien n'y fait, pas moyen de concerver la valeur obtenue aléatoirement (ou alors peut être par des moyens encore plus tordus), et ce aussi bien en local que sur un serveur. Il reste des possibilités de générer du pseudo aléatoire a partir d'md5, time ou autre, mais ca n'explique pas ca, et j'aime pas ne pas comprendre ce sur quoi j'ai perdu betement du temps

    J'ai pas non plus vu de références sur le sujet, la plupart des utilisations d'un générateur de nombres aléatoires se faisant avec usage direct de la variable.

    Si je souhaite stocker cette valeur, c'est pour une rotation d'image. Je récupère aléatoirement l'id d'une image, que je voudrais stocker en session pour éviter d'afficher la même image sur 2 pages consécutives. Un truc tout simple qui aurait du me prendre 5 mins et sur lequel je suis peut être depuis 2-3h le temps de comprendre d'ou venait le problème et expérimenter dans un peu tous les sens...

    Sur ce, je vais me coucher

  2. #2
    Nouveau membre du Club
    Inscrit en
    Décembre 2005
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 27
    Points : 30
    Points
    30
    Par défaut
    salut,

    j'ai remarqué qu'il manquait une parenthèse dans tons code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $test=(rand()%10); //<- ici .. 
    echo $test; 
    mysql_query("UPDATE t_test SET test=".$test." WHERE id=1"); 
    $_SESSION['test']=$test;
    bon, ça n'explique peut-être pas ton problème, mais on ne sait jamais...
    (bonne nuit quand même! )

  3. #3
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Salut

    Premièrement, je te recommande effectivement l'utilisation de mt_rand().
    Ensuite, peut-être simplement qu'un petit or die(mysql_error()) à la suite de mysql_query() pourrait faire apapraître la raison de l'erreur, quoique j'en doute.

    Dans le doute, pense à afficher ta requête avant de l'exécuter.

    Une manière classique de faire tout cela est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $test = mt_rand();
    $sql = "UPDATE t_test SET test=".$test." WHERE id=1";
    mysql_query($sql)
       or die(mysql_error());

  4. #4
    Membre régulier

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 52
    Points : 97
    Points
    97
    Par défaut
    C'était un exemple basique le plus simple possible pour bien montrer la problématique, dans mes tests j'affiche la requete et j'utilise ma classe de gestion mysql qui gère les erreurs. D'autant plus que la requête n'est pas en cause, elle s'effectue normalement et c'est la même chose en session. Le problème vient du random.
    Si je remplace $var=mt_rand(0,10); par $var=5; le problème ne se pose pas.

    C'est vraiment incomprehensible, meme si je place la requête dans une variable (ce qui fait que la valeur se retrouve au milieu d'une chaine), ca continue a faire n'imp dans la base et en session. Au rayon des bizarreries, les valeurs en session et en base semblent être toujours identiques.
    Bizarrement, quand j'exécute ce code seul dans un fichier test, ca passe, mais dans mon index, ca ne passe pas. Pourtant, j'ai essayé avec plusieurs noms de variables qui ne sont utlisés nulle part ailleurs, register_global est à off, la requête n'est exécutée qu'une fois (s'il y avait une redirection apres ca gueulerait à cause des echo) et je ne vois vraiment pas ce qui vient interférer la dedans.
    C'est encore le genre de truc trés con sur lequel on passe des heures pour s'appercevoir à la fin qu'il y a une brindille qui bloque le méchanisme...

  5. #5
    Membre régulier

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 52
    Points : 97
    Points
    97
    Par défaut
    J'ai trouvé... dans le genre truc à la con...

    C'est la directive ErrorDocument 404 de mon .htaccess qui renvoi vers index.php?zone=error. Du coup ca relance l'index pour les erreurs. J'ai un applet flash appelé mais non présent (idem si une image n'est pas trouvée) qui générait donc un nouveau random puisque le script était directement dans l'index...

    Conclusion, si on veut utiliser une page du site comme page d'erreur, faut bien s'assurer qu'on n'a pas de possibilité d'erreur dans les ressources appelées depuis le code html, ou alors bien filtrer les extentions pour ne traiter l'affichage de l'erreur que dans certains cas...

    J'avais bien dit que c'était un truc à la con...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Récupérer une valeur calculée par une précédure stockée
    Par Delphi-ne dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 09/04/2008, 08h54
  2. [MySQL] Récupération d'une valeur à partir d'une procédure stockée
    Par spaukensen dans le forum PHP & Base de données
    Réponses: 14
    Dernier message: 22/03/2008, 12h14
  3. [MySQL] Problème avec les htmlentities stockés dans bdd
    Par zouetchou dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 14/12/2007, 22h01
  4. Réponses: 1
    Dernier message: 08/06/2007, 00h10
  5. Réponses: 3
    Dernier message: 04/05/2007, 14h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo