J'essaie d'écrire le code qui permettrait de générer une chaîne
alphanumérique unique de 8 caractères de longueur, et de la stocker dans un
champ de ma table MySQL. La contrainte est que ce champ ("ID") est une clé
primaire, et que chaque id doit donc être absolument unique pour pouvoir
insérer une nouvelle ligne dans la base de données.
<?php
// ( Etablissement de la connexion, etc. )
srand((double)microtime()*1000000);
$liste = "abcdefghijkmnopqrstuvwxyz0123456789ABCDEFGHJKLMNOPQRSTUVWXYZ";
// Je crée un premier id_unique alphanumérique aléatoire
while (strlen($id_unique)<8) {$id_unique .= $liste[rand(0,59)];}
// Je charge les ID existants dans un tableau
$i=0;
while ($resultat = mysql_fetch_row(mysql_query("SELECT ID FROM Datas",
$connexion))) {
$id_existants[$i] = $resultat[0];
$i++;
}
// Je modifie l'id_unique généré plus haut
// tant qu'il y a un ID existant identique
while (in_array($id_unique, $id_existants)) {
// Si l'id_unique existe déjà dans le tableau id_existants,
// je génère un nouvel id_unique
$id_unique="";
while (strlen($id_unique)<8) {$id_unique .= $liste[rand(0,59)];}
}
// J'insère une nouvelle ligne dans la base avec l'id_unique et mes données
mysql_query("INSERT INTO Datas (ID, Commentaire) VALUES ('$id_unique',
'$commentaire')", $connexion);
?>
Problème : ce code ne fonctionne pas (il semble entraîner une boucle sans
fin, et se termine par un timeout au niveau du client). Je ne vois pas où se
situe le problème...
Je suis pas très bon, et je suppose donc que certains vont trouver mon code
très complexe par rapport à la tache à effectuer... mais je n'ai rien trouvé
de mieux.
Si l'un d'entre vous a une idée, ou une demi-idée à me proposer, merci
beaucoup!
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Jean-Luc
Bonjour Jérémie.
Ta requête MySQL 'SELECT ID FROM Datas' n'est pas correcte. Tu peux aussi faire plus simple pour tester si la valeur '$id_unique' a déjà été attribué à un identifiant 'ID' de ta table 'Datas', par exemple :
$result = mysql_query("SELECT * FROM Datas WHERE ID = '$id_unique'"); if(mysql_num_rows($result)) {
// Un ID est déjà enregistré avec la valeur $id_unique, // il faut en choisir une autre...
} else {
// Il n'existe aucun ID qui a pour valeur $id_unique, // on peut enregistrer les données !
Ta requête MySQL 'SELECT ID FROM Datas' n'est pas correcte. Tu peux aussi
faire plus simple pour tester si la valeur '$id_unique' a déjà été attribué
à un identifiant 'ID' de ta table 'Datas', par exemple :
$result = mysql_query("SELECT * FROM Datas WHERE ID = '$id_unique'");
if(mysql_num_rows($result)) {
// Un ID est déjà enregistré avec la valeur $id_unique,
// il faut en choisir une autre...
} else {
// Il n'existe aucun ID qui a pour valeur $id_unique,
// on peut enregistrer les données !
Ta requête MySQL 'SELECT ID FROM Datas' n'est pas correcte. Tu peux aussi faire plus simple pour tester si la valeur '$id_unique' a déjà été attribué à un identifiant 'ID' de ta table 'Datas', par exemple :
$result = mysql_query("SELECT * FROM Datas WHERE ID = '$id_unique'"); if(mysql_num_rows($result)) {
// Un ID est déjà enregistré avec la valeur $id_unique, // il faut en choisir une autre...
} else {
// Il n'existe aucun ID qui a pour valeur $id_unique, // on peut enregistrer les données !
J'essaie d'écrire le code qui permettrait de générer une chaîne alphanumérique unique de 8 caractères de longueur, et de la stocker dans un champ de ma table MySQL. La contrainte est que ce champ ("ID") est une clé primaire, et que chaque id doit donc être absolument unique pour pouvoir insérer une nouvelle ligne dans la base de données.
<?php // ( Etablissement de la connexion, etc. ) srand((double)microtime()*1000000); $liste > "abcdefghijkmnopqrstuvwxyz0123456789ABCDEFGHJKLMNOPQRSTUVWXYZ";
// Je crée un premier id_unique alphanumérique aléatoire
il faudrait commencer par initialiser $id_unique : $id_unique='';
while (strlen($id_unique)<8) {$id_unique .= $liste[rand(0,59)];}
la syntaxe recommandée est : $liste{rand(0,59)}
accessoirement, il faudrait coder rand(0,61) # 26+26+10-1
// Je charge les ID existants dans un tableau ...
beurk. La probabilité que l'Id existe déjà est assez faible, donc pourquoi pas plutôt essayer d'insérer et de gérer le code retour éventuel :
(en supposant que ID est déclaré comme clé UNIQUE ou PRIMARY de la table Datas)
do { $id_unique=''; while (strlen($id_unique)<8) { $id_unique .= $liste{rand(0,61)}; } $req = "INSERT INTO Datas(ID,Commentaire) VALUES('$id_unique','$commentaire')"; $res = mysql_query($req); if (mysql_errno()<>0) { if (mysql_errno()<>1062) { # clé en double die(mysql_error()."<br>$req"); } } } while (mysql_errno()<>0);
(non testé)
eça -- P'tit Marcel statistiques sur les forums modérés : http://www.centrale-lyon.org/ng/
Jeremie écrivit:
Bonjour,
J'essaie d'écrire le code qui permettrait de générer une chaîne
alphanumérique unique de 8 caractères de longueur, et de la stocker
dans un champ de ma table MySQL. La contrainte est que ce champ ("ID")
est une clé primaire, et que chaque id doit donc être absolument
unique pour pouvoir insérer une nouvelle ligne dans la base de
données.
<?php
// ( Etablissement de la connexion, etc. )
srand((double)microtime()*1000000);
$liste > "abcdefghijkmnopqrstuvwxyz0123456789ABCDEFGHJKLMNOPQRSTUVWXYZ";
// Je crée un premier id_unique alphanumérique aléatoire
il faudrait commencer par initialiser $id_unique :
$id_unique='';
while (strlen($id_unique)<8) {$id_unique .= $liste[rand(0,59)];}
la syntaxe recommandée est :
$liste{rand(0,59)}
accessoirement, il faudrait coder
rand(0,61) # 26+26+10-1
// Je charge les ID existants dans un tableau ...
beurk. La probabilité que l'Id existe déjà est assez faible, donc pourquoi
pas plutôt essayer d'insérer et de gérer le code retour éventuel :
(en supposant que ID est déclaré comme clé UNIQUE ou PRIMARY de la table
Datas)
do {
$id_unique='';
while (strlen($id_unique)<8) {
$id_unique .= $liste{rand(0,61)};
}
$req =
"INSERT INTO Datas(ID,Commentaire) VALUES('$id_unique','$commentaire')";
$res = mysql_query($req);
if (mysql_errno()<>0) {
if (mysql_errno()<>1062) { # clé en double
die(mysql_error()."<br>$req");
}
}
} while (mysql_errno()<>0);
(non testé)
eça
--
P'tit Marcel
statistiques sur les forums modérés : http://www.centrale-lyon.org/ng/
J'essaie d'écrire le code qui permettrait de générer une chaîne alphanumérique unique de 8 caractères de longueur, et de la stocker dans un champ de ma table MySQL. La contrainte est que ce champ ("ID") est une clé primaire, et que chaque id doit donc être absolument unique pour pouvoir insérer une nouvelle ligne dans la base de données.
<?php // ( Etablissement de la connexion, etc. ) srand((double)microtime()*1000000); $liste > "abcdefghijkmnopqrstuvwxyz0123456789ABCDEFGHJKLMNOPQRSTUVWXYZ";
// Je crée un premier id_unique alphanumérique aléatoire
il faudrait commencer par initialiser $id_unique : $id_unique='';
while (strlen($id_unique)<8) {$id_unique .= $liste[rand(0,59)];}
la syntaxe recommandée est : $liste{rand(0,59)}
accessoirement, il faudrait coder rand(0,61) # 26+26+10-1
// Je charge les ID existants dans un tableau ...
beurk. La probabilité que l'Id existe déjà est assez faible, donc pourquoi pas plutôt essayer d'insérer et de gérer le code retour éventuel :
(en supposant que ID est déclaré comme clé UNIQUE ou PRIMARY de la table Datas)
do { $id_unique=''; while (strlen($id_unique)<8) { $id_unique .= $liste{rand(0,61)}; } $req = "INSERT INTO Datas(ID,Commentaire) VALUES('$id_unique','$commentaire')"; $res = mysql_query($req); if (mysql_errno()<>0) { if (mysql_errno()<>1062) { # clé en double die(mysql_error()."<br>$req"); } } } while (mysql_errno()<>0);
(non testé)
eça -- P'tit Marcel statistiques sur les forums modérés : http://www.centrale-lyon.org/ng/
Jeremie
Ta requête MySQL 'SELECT ID FROM Datas' n'est pas correcte. Tu peux aussi faire plus simple pour tester si la valeur '$id_unique' a déjà été attribué
à un identifiant 'ID' de ta table 'Datas'
Bonjour Jean-Luc, Merci beaucoup, ça marche! Voici donc mon code final :
<?php $id_unique=""; srand((double)microtime()*1000000); $liste = "abcdefghijkmnopqrstuvwxyz0123456789ABCDEFGHJKLMNOPQRSTUVWXYZ"; while (strlen($id_unique)<8) $id_unique .= $liste{rand(0,59)}; // rand(0,59) car j'ai enlevé les caractères "l" et "I" (L min. et i maj.) de la liste // ces caractères pouvant être confondus en police Arial par exemple
while ($test <= 0) { $result = mysql_query("SELECT ID FROM Datas WHERE ID='$id_unique'"); if(mysql_num_rows($result)) { // Un ID est déjà enregistré avec la valeur $id_unique, // il faut en choisir une autre... $id_unique=""; while (strlen($id_unique)<1) $id_unique .= $liste{rand(0,9)}; $test=0; } else { // Il n'existe aucun ID qui a pour valeur $id_unique, // on peut enregistrer les données ! mysql_query("INSERT INTO Datas (ID, Commentaire) VALUES ('$id_unique', '$commentaire)", $connexion); $test=1; } } ?>
C'est un code utile bien qu'il n'y ait effectivement qu'une seule chance sur plusieurs millions de millards que la condition if soit vérifiée et qu'il faille donc re-générer un autre id... Le cas où il n'y a plus de possibilité pour une nouvelle combinaison id n'est pas traité ici, vu qu'il faudra dans mon cas qd même plusieurs millions de milliards d'enregistrements avant de parvenir à cette situation.
Merci également à Ptit Marcel pour sa réponse même si je n'ai pas suivi sa solution (qui devait être bonne aussi).
Bon dimanche. Jérémie
Ta requête MySQL 'SELECT ID FROM Datas' n'est pas correcte. Tu peux aussi
faire plus simple pour tester si la valeur '$id_unique' a déjà été
attribué
à un identifiant 'ID' de ta table 'Datas'
Bonjour Jean-Luc,
Merci beaucoup, ça marche!
Voici donc mon code final :
<?php
$id_unique="";
srand((double)microtime()*1000000);
$liste = "abcdefghijkmnopqrstuvwxyz0123456789ABCDEFGHJKLMNOPQRSTUVWXYZ";
while (strlen($id_unique)<8) $id_unique .= $liste{rand(0,59)};
// rand(0,59) car j'ai enlevé les caractères "l" et "I" (L min. et i maj.)
de la liste
// ces caractères pouvant être confondus en police Arial par exemple
while ($test <= 0) {
$result = mysql_query("SELECT ID FROM Datas WHERE ID='$id_unique'");
if(mysql_num_rows($result)) {
// Un ID est déjà enregistré avec la valeur $id_unique,
// il faut en choisir une autre...
$id_unique="";
while (strlen($id_unique)<1) $id_unique .= $liste{rand(0,9)};
$test=0;
} else {
// Il n'existe aucun ID qui a pour valeur $id_unique,
// on peut enregistrer les données !
mysql_query("INSERT INTO Datas (ID, Commentaire) VALUES ('$id_unique',
'$commentaire)", $connexion);
$test=1;
}
}
?>
C'est un code utile bien qu'il n'y ait effectivement qu'une seule chance sur
plusieurs millions de millards que la condition if soit vérifiée et qu'il
faille donc re-générer un autre id...
Le cas où il n'y a plus de possibilité pour une nouvelle combinaison id
n'est pas traité ici, vu qu'il faudra dans mon cas qd même plusieurs
millions de milliards d'enregistrements avant de parvenir à cette situation.
Merci également à Ptit Marcel pour sa réponse même si je n'ai pas suivi sa
solution (qui devait être bonne aussi).
Ta requête MySQL 'SELECT ID FROM Datas' n'est pas correcte. Tu peux aussi faire plus simple pour tester si la valeur '$id_unique' a déjà été attribué
à un identifiant 'ID' de ta table 'Datas'
Bonjour Jean-Luc, Merci beaucoup, ça marche! Voici donc mon code final :
<?php $id_unique=""; srand((double)microtime()*1000000); $liste = "abcdefghijkmnopqrstuvwxyz0123456789ABCDEFGHJKLMNOPQRSTUVWXYZ"; while (strlen($id_unique)<8) $id_unique .= $liste{rand(0,59)}; // rand(0,59) car j'ai enlevé les caractères "l" et "I" (L min. et i maj.) de la liste // ces caractères pouvant être confondus en police Arial par exemple
while ($test <= 0) { $result = mysql_query("SELECT ID FROM Datas WHERE ID='$id_unique'"); if(mysql_num_rows($result)) { // Un ID est déjà enregistré avec la valeur $id_unique, // il faut en choisir une autre... $id_unique=""; while (strlen($id_unique)<1) $id_unique .= $liste{rand(0,9)}; $test=0; } else { // Il n'existe aucun ID qui a pour valeur $id_unique, // on peut enregistrer les données ! mysql_query("INSERT INTO Datas (ID, Commentaire) VALUES ('$id_unique', '$commentaire)", $connexion); $test=1; } } ?>
C'est un code utile bien qu'il n'y ait effectivement qu'une seule chance sur plusieurs millions de millards que la condition if soit vérifiée et qu'il faille donc re-générer un autre id... Le cas où il n'y a plus de possibilité pour une nouvelle combinaison id n'est pas traité ici, vu qu'il faudra dans mon cas qd même plusieurs millions de milliards d'enregistrements avant de parvenir à cette situation.
Merci également à Ptit Marcel pour sa réponse même si je n'ai pas suivi sa solution (qui devait être bonne aussi).