RE-COMPTER L'AUTO-INCREMENT D'UNE TABLE (POUR LES FAINÉANTS ^^)

cs_yoman64 Messages postés 592 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 4 décembre 2008 - 6 mars 2008 à 10:47
 Utilisateur anonyme - 19 juil. 2008 à 11:23
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/45967-re-compter-l-auto-increment-d-une-table-pour-les-faineants

Utilisateur anonyme
19 juil. 2008 à 11:23
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 190 Date d'inscription lundi 25 novembre 2002 Statut Membre Dernière intervention 22 décembre 2009
16 juin 2008 à 19:36
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 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
16 mars 2008 à 23:43
lol donc oué les accents passent, et pas que ca apparement ^^ :)

Merci Yoman64 pour l'infos ! :)
cs_yoman64 Messages postés 592 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 4 décembre 2008
16 mars 2008 à 23:41
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 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
16 mars 2008 à 21:56
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 ! :)
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
6 mars 2008 à 16:51
c'est le but ! :)
titoo87 Messages postés 5 Date d'inscription mardi 27 avril 2004 Statut Membre Dernière intervention 15 mars 2008
6 mars 2008 à 16:44
je travaille donc dessus ;) merci pour les conseils cela m'aide à progresser ;)
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
6 mars 2008 à 15:36
T'inquiète il dira pas non ;)

Par ailleurs, dans ta modification de scripts prends en compte :
_ Faire des entrées en POST au lieu de GET
_ Gestion de la sécurité (analyser les entrées $_GET (POST))
_ Gerer les erreurs de connexions, de selections et de requetes dans la base de donnée
_ Séparer le code HTML du code PHP
_ Eventuellement en faire une fonction plutut qu'un script style mysql_update_ai ();

Car dans l'état actuel des choses, ton code devrait être supprimé.
J'attends ta mise à jour ! :)
titoo87 Messages postés 5 Date d'inscription mardi 27 avril 2004 Statut Membre Dernière intervention 15 mars 2008
6 mars 2008 à 13:57
Salut !

En fait, je n'ai pas trouvé de solution pour le faire rapidement sur google (mots clés mal choisis certainement :p) donc je me suis dis que j'allais essayer de faire mon propre script... Raté... Mais maintenant j'ai la solution !! merci beaucoup !! Je vais adapter le script avec ta solution si tu est d'accord ;)

++
cs_yoman64 Messages postés 592 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 4 décembre 2008
6 mars 2008 à 10:47
Salut,
Bon... Aucune vérifications d'erreur, ensuite ton script risque très probablement de générer des erreurs si il essait d'attribuer une clée qui existe déja (un champs se trouvant plus loin ayant l'id que tu veux attribuer par exemple), si tu classait les champs par la colonne d'auto increment avant de les fetcher ça réduit le risque d'erreur

Ensuite... moi je fais ça en deux lignes

alter table `table` DROP `id`
alter table `table` ADD `id` INT AUTO_INCREMENT PRIMARY KEY FIRST

il y a peut être même une fonction mysql déja fait pour le faire, mais j'en doute.

Bref je veux pas te décourager, mais ton code est totalement à refaire !

Bonne chance
Rejoignez-nous