Re-compter l'auto-increment d'une table (pour les fainéants ^^)

Soyez le premier à donner votre avis sur cette source.

Snippet vu 7 663 fois - Téléchargée 103 fois

Contenu du snippet

Voici un petit script à placer dans votre fichier fonctions.inc.php, et appeller la fonction dans vos pages pour recompter l'auto_increment d'une table.

NB : la connexion à la base de données n'est pas inclue dans cette fonction, mais il est possible de l'ajouter facilement.

Source / Exemple :


//////////////////////////////////////////////////////////////////////////////////////////////////
||												||
|| Mettre à jour l'auto_increment d'une table							||
|| en recomptant celui_ci pour chaque enregistrements						||
|| @author : titoo87										||
|| @mail : titoo87@gmail.com									||
||												||
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
// Auto_increment
function mysql_update_ai($table, $champ, $debut){
	
	// Gestion des erreurs
	error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);
	
	// Vérification des informations
	$table=str_replace("\"|'|<|>","",$table);
	$champ=str_replace("\"|'|<|>","",$champ);
	
	if(!preg_match("/[A-Za-z0-9]+/",$table)){ echo "Table incorrecte";} 
	else{
		if(!isset($debut)||$debut==""){ echo "Erreur, début non précisé"; return false;} 
		else{
			// Supression du champ d'auto_increment
			mysql_query("ALTER TABLE ".$table." DROP ".$champ."") or die ("Impossible de mettre à jour l'auto_increment : table ou champ inexistant.");
					
			// Ajout du champ d'auto_increment
			mysql_query("ALTER TABLE ".$table." ADD ".$champ." INT AUTO_INCREMENT PRIMARY KEY FIRST;") or die ("Impossible de mettre à jour l'auto_increment");
					
			// On retourne TRUE
			return true;
		}
	}
}

Conclusion :


C'est assez pratique pour garder une table propre ^^

A voir également

Ajouter un commentaire

Commentaires

db77
Messages postés
2
Date d'inscription
mercredi 3 mai 2006
Statut
Membre
Dernière intervention
19 juillet 2008
-
Bonjour,
C'est bien de proposer ce genre de script mais je le trouve dangereux. En effet, le numéro auto-incrémenté est souvent utilisé comme clef dans une autre table, exemple :

Table catégorie (supposée avoir subi des suppressions)
Id - Libellé
17 - Informatique
22 - Electronique
31 - Papeterie
38 - Divers
Une table produits
id - id_cat - Libellé
1 - 17 - Disque dur
2 - 22 - Condensateur
3 - 31 - Post-It
4 - 17 - Lecteur disquettes
5 - 22 - Transistor
6 - 17 - Carte vidéo

Si après ton script on a :
Id - Libellé
1 - Informatique
2 - Electronique
3 - Papeterie
4 - Divers
Que deviennent les "liens" de la table Produits ?

Donc, à utiliser en connaissance de cause ;)
ronanry
Messages postés
191
Date d'inscription
lundi 25 novembre 2002
Statut
Membre
Dernière intervention
22 décembre 2009
-
petite question Yoman64...arrivais tu tjs a accéder à ta table après ? car j'ai lu je sais plus où que tu pouvais créer une table avec un "."(point) dans le nom mais qu'après tu ne pouvais plus y accéder...mais la création fonctionnait tt de meme...
codefalse
Messages postés
1127
Date d'inscription
mardi 8 janvier 2002
Statut
Modérateur
Dernière intervention
21 avril 2009
1 -
lol donc oué les accents passent, et pas que ca apparement ^^ :)

Merci Yoman64 pour l'infos ! :)
cs_yoman64
Messages postés
593
Date d'inscription
samedi 19 janvier 2002
Statut
Membre
Dernière intervention
4 décembre 2008
-
Salut,

Pour complêter ce que disait codefalse, ne serait-il pas opportun d'échapper les chaines ? $table = mysql_real_escape_string($table);
idem pour champs par exemple. Ensuite évidement vérifier si les requêtes se déroule bien est essentiel avant de retourner true (évite les or die aussi, renvois une exception ou simplement false)

Sinon pour les charactères autorisés (je suis d'avis que d'échapper suffit, pas besoin de validé absolument puisque dans le pire des cas la requête va échouer tout simplement) eh bien ils semblents tous autorisés (sauf ` ) Parce que je me suis créé une base appelé "'ÉÈÀWS!#$%?&*_a@ et ça a passé... lol
codefalse
Messages postés
1127
Date d'inscription
mardi 8 janvier 2002
Statut
Modérateur
Dernière intervention
21 avril 2009
1 -
C'est une bonne chose ta mise à jour, ca montre ta motivation :)

Comme toujours, des remarques, afin de l'améliorer :

Le paramètre début dans la signature de ta fonction, tu devrait lui mettre un paramètre optionnel : 0, ainsi que le parametre champ à 'id' par exemple (le champ que tu utilise le plus pour l'ai), du coup cela donnerai function mysql_update_ai($table, $champ 'id', $debut 0);

comme ca apres tu appelerai ta fonction avec mysql_update_ai ('visiteurs');

# error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);
tu devrais laisser cette fonctionnalité au code appelant, ta fonction ne doit pas modifier le moteur interne de ton code. Ou au pire si c'est vraiment nécéssaire, tu restitue le niveau d'erreur à son état initial à la fin de la fonction. Mais c'est à déconseiller.

# // Vérification des informations
# $table=str_replace(""|'|<|>","",$table);
# $champ=str_replace(""|'|<|>","",$champ);
#
# if(!preg_match("/[A-Za-z0-9]+/",$table)){ echo "Table incorrecte";}

Tu remplace des charactères incorrectes pour ensuite indiquer que ta table est incorrecte. Tu effectue des travaux inutilements du coup. Soit elle est correcte, soit elle ne l'est pas. De plus, [A-Za-z0-9] n'est pas complet, en effet tu peux avoir une table qui aie un underscore (_), donc tu invalide un table potentiellement valide. Par ailleur , je n'en suis pas sur, mais je crois que les accents marchent aussi, juste qu'ils sont déconseillés.

Du coup tu à deux possibilités : Soit te taper la doc pour trouver ce qui est autorisé et ce qui ne l'est pas.
Soit ne pas tester la validité de la table et tester le résultat de la requete mysql. Si ca passe pas, c'est peut-etre à cause d'une table erronée. (Outre le fait que ta table peux avoir des caractères invalides, elle peux aussi ne pas exister (une table "visiteurs" est valide, mais l'ai-je réellement dans ma base de donnée ?)). Donc au lieu d'ajouter une couche de validitée, peut-être juste envoyer la requete et regarder le résultat ?

Ensuite, tu effectue les deux requetes sans tenir du compte de ce que donne leur résultat, et tu retourne true.
Cela veut dire que meme si je n'instancie pas une connexion à une base de donnée, et donc que ton code ne fonctionnera pas, l'appel de ta fonction me retournera true. Je ne peux donc jamais savoir si ta fonction à bien marché ou pas. teste ta requete avec
if (mysql_query ('...') === false)
return false;

if (mysql_query ('second query') === false)
return false;

return true;
là ca passe mieux déjà ! :)

J'attends une éventuelle mise à jour de ton code. On arrive à quelque chose d'intéressant maintenant :)
Sans mise à jour, je lui mettrai 6.

Courage ! :)

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.