2012-10-16 3 views
0

J'ai un système qui génère un lot de codes aléatoires jusqu'à 100 à la fois. Ils sont ensuite insérés dans une base de données. J'utilise un générateur de code et il serait assez improbable qu'un code similaire puisse être créé à nouveau, mais pour m'assurer que je veux vérifier la BD pour un doublon de toute façon. Ma théorie ..Un moyen efficace pour vérifier le mot de passe est dans la base de données

$amount_of_codes 


    while ($x != $amount_of_codes) 
    { 
    $code = gencode(); 
    $mysql_check = "SELECT code FROM data WHERE code = '$code'"; 
    $mysql_check_result = mysql_query($mysql_check); 
    $check = mysql_num_rows($mysql_check_result); 
    if (!$check) 
     { 
     mysql_query("INSERT INTO data(code) values('$code')") 
     $x++ 
     } 
    } 

semble désordre, de meilleures idées?

+0

imo c'est la bonne façon de le faire, pour plus de vitesse: cre mangé un index pour la colonne de code – x4rf41

+1

C'est un bon moyen de le faire. Mais vous n'avez pas besoin d'avoir des mots de passe uniques. Vous avez besoin d'utilisateurs uniques, n'est-ce pas? – elvenbyte

Répondre

1

Donnez la colonne Code une contrainte UNIQUE:

CREATE TABLE Code 
(
    Code .. 
.. 
    CONSTRAINT Code_Unique UNIQUE (Code), 
.. 
); 

Lors de l'insertion, vous ne devez saisir la base de données des exceptions/erreurs, ne pas se soucier si un code existe déjà.

1

Il est désordonné. Plus important encore, il est également soumis à des conditions de course où un autre processus pourrait insérer ce code entre votre chèque et votre insertion.

Si vous voulez éviter cela, faites de la colonne de code une clé unique, puis essayez simplement de l'insérer. Si elle est déjà là, cette opération atomique renverra une erreur ou déclenchera une exception, que vous pouvez vérifier/attraper. En faisant le contrôle après la tentative, vous ne perdez rien puisque vous devez vérifier quand même (dans le cas où la condition de course mentionnée ci-dessus vous mord). Mais ce que vous gagnez est l'atomicité et le code plus propre.

0

Solution vraiment simple, assurez-vous que votre fonction qui met dans les codes ne met pas dans un code qui existe déjà.

En gros:

générer du code

chek si le code existe

oui -> générer un nouveau code

pas -> Code mis en db

Pas de temps pour le script désolé

Questions connexes