Générateur de clé primaire

Soyez le premier à donner votre avis sur cette source.

Snippet vu 9 441 fois - Téléchargée 28 fois

Contenu du snippet

Donc voici un petit script dont je me sert pour générer des clées primaires à l'aide d'une chaine de caractère, il calcule le prochain code en fonction du caractère ascii en cours et s'incremente automatiquement en passant à la série supérieure.
Voila si vous avez des questions n'hésitez pas

Source / Exemple :


<?
function calcul_id( $str )
{
$change = true; //booléen permettant de savoir si on arrive à la fin d'une série
$quit = false; // on quit :)
$size = strlen($str)-1; // taille de la chaine de caractere
while($quit == false) // boucle infinie
{
	if($change == true)
	{
		switch(ord($str[$size])) // compare les codes ascii
		{
	    	case 90: // ' Z '
	        	$str[$size] = chr(65);
	        	$change = true;
	        	break;
			case 57: // ' 9 '
		    	$str[$size] = chr(48);
		    	$change = true;
		    	break;
			default: // par defaut on incremente et on quit
			    $str[$size] = chr(ord($str[$size])+1);
			    $change = false;
			    break;
		}
	}else{
	    $str[$size] = chr(ord($str[$size]));
 		$quit = true;
	}
	$size--;
}
return $str;
}
if (isset($_POST['code']))
{
// exemple d'utilisarion
echo "code passé en paramètre :<b>".$_POST['code']."</b><br>";

	$_POST['code']=calcul_id($_POST['code']);
	echo "Code suivant :<b> ".$_POST['code']."</b></br>";
}

?>
<html>
	<head>
	</head>
	<body>
	<form action="" method="post" >
	<? if(!isset($_POST['code']))
	{
		echo "<b>Entrer le code de référence</b><br>";
		echo "<input type=\"text\" name=\"code\" value=\"";
		if(isset($_POST['code']))echo $_POST['code'];echo "\">";
	}else{
		echo "<input type=\"hidden\" name=\"code\" value=\"";
		if(isset($_POST['code']))echo $_POST['code'];echo "\">";
	}
	?>
	<input type="submit" value="générer code">

	</form>
	</body>
</html>

Conclusion :


Informez moi sur les bugs svp :)

A voir également

Ajouter un commentaire

Commentaires

Messages postés
506
Date d'inscription
vendredi 30 juillet 2004
Statut
Membre
Dernière intervention
3 mars 2008
2
Je ne pense pas que tu trouveras d'infos sur les files !
La meilleures solution est que tu mettes un champs autoincrément dans ta table qui servira de clé primaire, et que tu mettes un autre champs unique ou tu met ta clé générée.
Lors de l'insertion d'un enregistrement, recupère l'eventuel code erreur correspondant au non respect de ta contrainte unique.

bon courage :)
Messages postés
4
Date d'inscription
lundi 3 février 2003
Statut
Membre
Dernière intervention
7 juillet 2005

ok je te remercie pour tes explications très claires ;), normalement il ne devrai pas y avoir plusieurs ajouts en meme tps mais vu qu'on ne sait jamais ,je vais qd meme me renseigner sur cette file.
merci bcp =).
Messages postés
506
Date d'inscription
vendredi 30 juillet 2004
Statut
Membre
Dernière intervention
3 mars 2008
2
Imaginons que tu utilises ton code pour définir des no de commandes.
Soit deux utilisateurs toto et titi
18h00: toto veut ajouter un contrat
18h00: titi veut ajouter un contrat
18h01: ton code retourne AAA1 pour toto
18h01: ton code retourne AAA1 pour titi (le mm car ya pas encore eu l'insertion du contrat de toto
18h02: toto insert son contrat avec le no AAA1
18h02: titi insert son contrat avec le no AAA1 ---> bug car la clé est déja utilisée

De manière générale, ce bug surviendra sur des accès concurrents, pour une appli avec très peu d'utilisateurs, ca devrait passer...

Si tu voulais garder ton système, il te faudrait locker la bd entre le moment du calcul de la clé et celui de l'insertion (mettre les users dans une file)

C'est pour cela que l'autoincrément existe, car la bd gère les requetes une après l'autre :)

VOila, j'espere que j'ai été clair :)
Messages postés
4
Date d'inscription
lundi 3 février 2003
Statut
Membre
Dernière intervention
7 juillet 2005

en quoi est ce dangereux ? tu peux m'expliquer stp ? :)
Messages postés
506
Date d'inscription
vendredi 30 juillet 2004
Statut
Membre
Dernière intervention
3 mars 2008
2
Ultra dangereux, a ne pas utiliser pour une base de données !!!!!
Afficher les 7 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.