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 :

enregistement d'une référence aléatoire [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 181
    Par défaut enregistement d'une référence aléatoire
    Bonjour,

    J'ai crée un formulaire d'enregistrement qui intègre une référence aléatoire.

    Le petit problème qui concerne cette enregistrement, est que je me suis aperçu qu'il y'avait des références identiques enregistrées pour des profils différents.

    Comment pourrai-je faire pour faire une vérification (quelle n'existe pas) avant un nouvel enregistrement?

    Voici la fonction qui me permet d'intégrer une référence aléatoire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    function numero() 
    {
    $chrs = 10 ; 
    $ref = "LUX-"  ;
    mt_srand ((double) microtime() * 1000000);
    while (strlen($ref)<$chrs)
    {
    $chr = chr(mt_rand (0,255));
    if (eregi("^[a-hj-km-np-z2-9]$", $chr))
    $ref = $ref.$chr;
    };
    return $ref;
    }
    Dois-je rajouter un if quelque part avant la requete ?

  2. #2
    Membre éclairé
    Avatar de titoon
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 71
    Par défaut
    Avec une boucle while, tu devrais pouvoir t'en sortir :
    nouvelle_reference = numero();
    tant qu'il y a des enregistrements avec reference = nouvelle_reference {
    ..nouvelle_reference = numero();
    }
    ici, on est sur nouvelle_reference est une référence unique

  3. #3
    Membre Expert Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Par défaut
    Salut,
    sinon si t'as une clé primaire en auto-increment, tu peux l'ajouter à la fin de ta réf.
    bye

  4. #4
    Membre éclairé
    Avatar de titoon
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 71
    Par défaut
    Citation Envoyé par Djakisback
    Salut,
    sinon si t'as une clé primaire en auto-increment, tu peux l'ajouter à la fin de ta réf.
    bye
    Pas bête, ajoute quand même un séparateur, sinon tu peux avoir des problèmes (un tiré par les cheveux, mais bon... ) :
    reference : abc12, clef primaire : 3
    reference : abc1, clef primaire : 23
    sans séparateur : abc123 pour les 2
    avec séparateur : abc12-3 et abc1-23

  5. #5
    Membre Expert Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Par défaut
    Dans son cas c'est pas nécessaire car sa fonction lui retourne obligatoirement une chaîne de 10 caractères ^^

  6. #6
    Membre éclairé
    Avatar de titoon
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 71
    Par défaut
    Ooops

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 181
    Par défaut
    Ce ne serait pas plus simple de vérifier si la référence existe déjà où non, comme pour une adresse mail?

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    elseif  ((mysql_num_rows(mysql_query("SELECT 1 FROM util 
    WHERE email = '".$frm['email']."'")) > 0)
    ) {
    $erreurs['email'] = true;
    $msg['email'] = " Cette adresse électronique existe déjà";
    }

  8. #8
    Membre Expert Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Par défaut
    C'est la solution proposée par titoon. Solution qui prend plus de temps que l'autre et qui peut générer une boucle infinie, en fonction du nombre de refs possibles générées et du nombre d'enregistrements mais qui fonctionne très bien (sur 10 cars il devrait pas y avoir de problème)

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 181
    Par défaut
    J'ai pas tout capté...

    Il faut que je crée une nouvelle boucle ?

  10. #10
    Membre Expert Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Par défaut
    Oui, si tu choisis de ne pas utiliser la soluce de la clé primaire en auto-incrément.
    Il faut que tu génères une référence "tant" qu'elle existe déjà dans la table.

    Ca pourrait donner un truc du style, avant ta requête d'insertion :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    do	{
    	$ref = numero();
    	$sql = "SELECT ref FROM table WHERE ref='".$ref."'";
    	$res = mysql_query($sql);
    }
    while(mysql_num_rows($res) != 0);
    comme tu peux le voir, c'est possible, en théorie, que ca boucle indéfiniment. Mais statistiquement avec 10 cars pour ta ref c'est peux probable, sauf si ta table contient des millions d'enregistrements (y a moyen de faire le calcul mais je suis pas statisticien ^^)

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 181
    Par défaut
    Je vais tenter ce principe et je vous tiens au courant de l'évolution

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 181
    Par défaut
    Ca a l'air de fonctionner jusqu'à présent (test sur 30 inscriptions)

    Par contre, j'ai une petite erreur de temps en temps là ou j'ai rajouté la boucle...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Fatal error: Maximum execution time of 30 seconds exceeded in G:\mon_site\administrer\admin.php on line 496
    Mais bon, ce n'est pas grave, je me déconnect, et je recommence...

    Reste plus qu'à tester sur 2000 incriptions

    En vous remerciant

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

Discussions similaires

  1. [VBA] Ajouter dynamiquement une référence
    Par jpharand dans le forum VBA Access
    Réponses: 23
    Dernier message: 16/04/2010, 23h28
  2. Comment stocker une référence vers un TTreeNode ds un DFM ?
    Par phplive dans le forum Composants VCL
    Réponses: 1
    Dernier message: 19/07/2005, 12h33
  3. [SOAP][Web Service] erreur création d'une référence Web
    Par Maximil ian dans le forum XML/XSL et SOAP
    Réponses: 6
    Dernier message: 20/06/2005, 13h29
  4. comment obtenir une ligne aléatoirement
    Par titoumimi dans le forum Langage SQL
    Réponses: 2
    Dernier message: 18/05/2005, 15h52
  5. Une référence à un élément de sa propre table
    Par szdavid dans le forum Langage SQL
    Réponses: 7
    Dernier message: 29/06/2004, 10h46

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