[PHP/MySQL] Valeur d'un auto increment [Résolu/Fermé]

Signaler
Messages postés
507
Date d'inscription
vendredi 18 janvier 2002
Statut
Membre
Dernière intervention
2 janvier 2008
-
 toto -
Hello !!
J'ai une page où j'effectue une requête telle que celle ci-dessous :
$req=mysql_query("INSERT INTO table VALUES('',$var1,$var2)");
Le premier champ, je ne lui donne pas de valeur parce qu'il est en auto-increment. Or, plus loin dans ma page, j'ai besoin de cette valeur... et je suis bien embêtée !!
Z'auriez pas une 'tite idée qui traîne pour moi ?
Merci d'avance.

Tabou Junior

10 réponses

Messages postés
507
Date d'inscription
vendredi 18 janvier 2002
Statut
Membre
Dernière intervention
2 janvier 2008
114
A cette adresse, http://www.multimania.lycos.fr/webmaster/references/mysql/commandephp3.phtml , j'ai trouvé ça :

Retourne le dernier identifiant généré par un champ de type AUTO_INCREMENT. Cette fonction opère sur la connexion MySQL courante ou sur la connexion spécifiée par link_identifier et retourne le dernier identifiant généré par la réalisation de la dernière fonction INSERT.
Exemple int mysql_insert_id (link_identifier)

J'ai pas eu le temps d'essayer, je vous tiens au courant :-))

Tabou Junior
7
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

Bonjour,
Cette opération ne serait elle pas dangereuse puisque imaginons que je suis PDG de Google et que je mette cela en place ...
Il y a toute les chance pour que mon serveur traite en parallèle 2 inscriptions et ainsi me retourne le mauvais ID non?

ServerThread1
{
...
INSERT INTO ... (id = 300000)
}
ServerThread2
{
INSERT INTO ... (id = 300001)
id =300001 //OK
...
}
ServerThread1
{
id =300001 // Usurpation d'identité...
...
}

J'espère avoir été claire et si quelqu'un peut confirmer...
Du coup le mieux est de faire un vieux select bien lourd derrière avec Where champ = champ que je vien de remplir ...
Messages postés
17
Date d'inscription
vendredi 7 mars 2008
Statut
Membre
Dernière intervention
12 mai 2008
2
slt, je suis un debutant en sql, je sais pas comment re-mettre une table en auto increment, je me connecte sur phpmyadmin chez ovh.

merci
Voici la requête qui marche sur MySQL, pour récupérer la dernière valeur d'un auto incrément.

SELECT max( LAST_INSERT_ID(cle_primaire)) FROM table
De mon côté j'émettrais bien une réserve :

L'appel au MAX ou au LAST_INDEX_ID dans une requête exécutée juste après l'insertion présente toutefois un inconvénient majeur (bien que le cas dont je vais parler a très peu de chances de se produire) : si deux personnes appellent cette méthode en même temps (tout à fait possible surtout pour une application devant supporter une charge en utilisateurs importante), on peut se retrouver dans le cas suivant :

Utilisateur 1    Utilisateur 2    Insertion    LAST_INDEX_ID
       |-------------------|--------------->|                        |
       |                        |--------------->|                        |
       |                        |                     |----------------->|
       |                        |                     |----------------->|

Ici, la requête d'insertion de l'utilisateur 2 arrive avant que la requête de LAST_INDEX_ID pour l'utilisateur 1 ne soit lancée et on se retrouve ainsi dans le cas où le LAST_INDEX_ID qui lui est fourni correspond à l'enregistrement saisi par l'utilisateur 2. D'où faille de sécurité possible.

Concernant, l'utilisation d'une clé candidate, c'est effectivement ce qu'il y a de plus "Merisien" à faire cependant, il s'agit souvent de clés composés, ce qui va rapidement alourdir le code et la maintenance (à plus forte raison sur de gros projets où l'on ne peut pas toujours éviter de mettre en place des relations N-aires).

La meilleure solution consisterait dans l'utilisation du LAST_INDEX_ID couplée à un MUTEX (sémaphore binaire) pour l'emploi de la méthode d'insertion. Facile à mettre en place :

private $insDispo = true;

public function insert ($bdd)
{
while (!$insDispo); // en attente de disponibilité
insDispo = false;

// mettre ici toute la partie insertion en base de données
// ainsi que la récupération de l'index

insDispo = true;
}

Ainsi l'utilisateur 2 est placé en attente tant que la transaction de l'utilisateur 1 n'est pas terminée : cela peut ralentir le traitement en cas de forte charge mais au profit de la sécurité et de la garantie du bon fonctionnement de l'application ^^
salut à toi, si ta cle est autoincrement, cela veut dire qu'on ne la saisie pas.
Je te propose de prendre un ou deux champs et de gérer les enregistrements de manière à ce que ce ou ces champs
soient uniques à chaque enregsitrement. Tu feras la requette de sélection à partir de ces champs et tu retrouvera ton code.
Messages postés
33478
Date d'inscription
jeudi 14 octobre 2004
Statut
Modérateur
Dernière intervention
24 février 2011
1 761
Si c'est en auto increment, apres l'insertion de ton champs tu demandes la plus grosse valeur du champs...
Pas forcement tres efficace, mais ca marche au moins...

ö,ö
\_/
Utilisateur anonyme
Ton auto-increment, il est en index?

Kalamit,
Je ponce donc j'essuie
Messages postés
33478
Date d'inscription
jeudi 14 octobre 2004
Statut
Modérateur
Dernière intervention
24 février 2011
1 761 > Utilisateur anonyme
Pourquoi tu me demandes a moi? ;-)
A priori si la base est bien faite oui puisque auto increment => clef primaire...

ö,ö
\_/
Utilisateur anonyme >
Messages postés
33478
Date d'inscription
jeudi 14 octobre 2004
Statut
Modérateur
Dernière intervention
24 février 2011

Oups, pardon... Je m'a planté...
Enfin toujours est il que, j'ai jamais reussi a retrouvé un index auto-incrémenté dans MySql...
Alors qq'un le fait, ca m'interresse aussi.

Kalamit,
Je ponce donc j'essuie
Messages postés
33478
Date d'inscription
jeudi 14 octobre 2004
Statut
Modérateur
Dernière intervention
24 février 2011
1 761 > Utilisateur anonyme
Ha, c'est nul ca, l'interet d'un champ auto incremente est justement de l'indexer...

ö,ö
\_/
Messages postés
481
Date d'inscription
mardi 21 janvier 2003
Statut
Membre
Dernière intervention
20 avril 2006
106 > Utilisateur anonyme
voila pour toi
"SELECT LAST_INSERT_ID() FROM matable".
Messages postés
507
Date d'inscription
vendredi 18 janvier 2002
Statut
Membre
Dernière intervention
2 janvier 2008
114
Oui mon auto-increment est en index.
Mais c'est pas bête l'idée de prendre le plus gros.
J'va faire un truc du genre
SELECT id FROM table WHERE (cond.) ORDER BY id DEC LIMIT 1.
Z'en pensez quoi ? Ca devrait marcher, je pense. Je vous tiens au courant.

Tabou Junior

sinon en SQL il te suffit de SELECT MAX(le_champ) FROM la_table

kinder.surprise,
le maton du matou
Messages postés
507
Date d'inscription
vendredi 18 janvier 2002
Statut
Membre
Dernière intervention
2 janvier 2008
114
Bon ben ça y est, j'ai testé et comme promis, je vous tiens au courant...

Au niveau du fonctionnement, je n'ai pas vu de différence particulière entre mysql_insert_id() et SELECT MAX(Ch) FROM Tbl, mais au niveau de l'optimisation, c'est différent. En effet, my_sql_insert_id est une fonction php alors que SELECT MAX etc.. nécessite l'exécution d'une nouvelle requête SQL.

Sinon, pour info, j'ai aussi trouvé une fonction sql sympa : LAST_INSERT_ID(). Elle est censé fournir la valeur de l'index du dernier enregistrement de la connexion SQL en cours. Mais ça, j'ai jamais essayé.

Voilà voilà.

TaBou JuNioR, qu'avait promis de vous tenir au courant.
http://membres.lycos.fr/taboujr/
essai d'ajouter "@@IDENTITY" comme ça :
- Insert into table values(nul........)@@IDENTITY

il retourn la valeur du champ auto incrémenté qui vient d'etre inséré.