A voir également:
- Auto increment php
- [PHP/MySQL] Valeur d'un auto increment ✓ - Forum - PHP
- [PHP + mysql] Valeur retour d'un champ ne s'affiche pas ✓ - Forum - PHP
- [MySql] obtenir la valeur de l'actuel AUTO-INCREMENT ✓ - Forum - PHP
- [PHP/MySQL] Récupérer valeur MAX ✓ - Forum - PHP
- PHP MySQL - Enregistrer valeur checkbox ✓ - Forum - PHP
10 réponses
Taboujr
- Messages postés
- 507
- Date d'inscription
- vendredi 18 janvier 2002
- Statut
- Membre
- Dernière intervention
- 2 janvier 2008
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
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
noufelo
- Messages postés
- 17
- Date d'inscription
- vendredi 7 mars 2008
- Statut
- Membre
- Dernière intervention
- 12 mai 2008
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
merci
thedwarf21
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 ^^
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 ^^
Kenfack Guy
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.
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.
teebo
- Messages postés
- 33478
- Date d'inscription
- jeudi 14 octobre 2004
- Statut
- Modérateur
- Dernière intervention
- 24 février 2011
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...
ö,ö
\_/
Pas forcement tres efficace, mais ca marche au moins...
ö,ö
\_/
Utilisateur anonyme
>
teebo
- 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
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
Taboujr
- Messages postés
- 507
- Date d'inscription
- vendredi 18 janvier 2002
- Statut
- Membre
- Dernière intervention
- 2 janvier 2008
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
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
Utilisateur anonyme
sinon en SQL il te suffit de SELECT MAX(le_champ) FROM la_table
kinder.surprise,
le maton du matou
kinder.surprise,
le maton du matou
Taboujr
- Messages postés
- 507
- Date d'inscription
- vendredi 18 janvier 2002
- Statut
- Membre
- Dernière intervention
- 2 janvier 2008
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/
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/
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 ...