IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

L'auto-incrémentation commence à 1 et non 0, en php ?


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 52
    Par défaut L'auto-incrémentation commence à 1 et non 0, en php ?
    salut à tous,

    Encore merci à tous ceux qui m'aide cheez.gif

    j'ai crée ma db en php avec un id "auto-increment"...

    j'ai trouvé la fonction pour me dire quel est mon prochain "id" dans ma db (mysql_insert_id(); )

    Ma db refuse de commencer à 0 mais toujours à 1 et lorsque j'inclus un nouvel enregistrement, c'est "1,2,3,..." et non commencé par 0 et donc, ma commande qui me dit quel est l'enregistrement suivant est toujours 0 !

    Que faire ?? Merci d'avance

  2. #2
    Membre émérite
    Avatar de ozzmax
    Inscrit en
    Novembre 2005
    Messages
    977
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Novembre 2005
    Messages : 977
    Par défaut
    salut
    mysql_insert_id() je crois que cette fonction retourne la clé(id) que tu as mis autoincrément de l'ajout qui vient d'etre fais

    Moi je l'utilise a cette fin, quand j'ajoute dans ma table et veux savoir quel est la valeur de l'id qui vient d'etre inserer...

    Et oui ca commence a 1 car c'est le premier enregistrement dans la table...donc il ne devrait pas y avoir de valeur 0??

    tu peux donner un peu de ton code comment tu utilise cette fonction stp

  3. #3
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 313
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 313
    Billets dans le blog
    17
    Par défaut
    On a une table avec un champ en AUTO_INCREMENT, pas une BdD

    j'ai trouvé la fonction pour me dire quel est mon prochain "id" dans ma db (mysql_insert_id(); )
    Non, mysql_insert_id( ) retourne, comme indiqué dans sa doc, la valeur du dernier auto-incrément généré, pas la valeur du prochain.

    efuse de commencer à 0 mais toujours à 1 et lorsque j'inclus un nouvel enregistrement, c'est "1,2,3,..." et non commencé par 0
    C'est le comportement normal.

  4. #4
    Membre Expert
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Par défaut
    En même temps on ne demande pas à un champs de commencer à zéro, mais juste d'être unique et s'auto incrementer :/

  5. #5
    Membre chevronné Avatar de GregPeck
    Inscrit en
    Novembre 2005
    Messages
    530
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 530
    Par défaut
    Si tu veux connaitre le prochain, une technique est de faire une requete comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT MAX(id)+1 FROM table

  6. #6
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 313
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 313
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par GregPeck
    Si tu veux connaitre le prochain, une technique est de faire une requete comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT MAX(id)+1 FROM table
    Bof bof, mieux vaut se méfier de ce genre de manip' car il pourrait y avoir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    T     : client 1 : demande le $next_id (max + 1)
    T + 1 : client 2 : insert
    T + 2 : client 1 : exploite $next_id qui n'est plus valable suite au insert
    Et se demander pourquoi connaître le prochain ID, ça m'étonnerait que tu en aies *vraiment* besoin.

  7. #7
    Membre chevronné Avatar de GregPeck
    Inscrit en
    Novembre 2005
    Messages
    530
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 530
    Par défaut
    Bof bof, mieux vaut se méfier de ce genre de manip' car il pourrait y avoir :
    Oui dans le cas où on l'utilise ensuite pour faire un insert.
    Mais cette info peux servir à autre chose.

    Cela dit même dans le cas que tu décrit, il faut relativiser, c'est vraiment pas de bol si ça se produit. C'est un risque que l'on peux considérer comme acceptable pour une appli perso ou entre pote. Mais bien sur pas de site pro avec beaucoup de visiteurs.

    Et se demander pourquoi connaître le prochain ID, ça m'étonnerait que tu en aies *vraiment* besoin.
    Je confirme aussi que la demande est bizarre, surtout que tu parle de auto_increment

  8. #8
    Expert confirmé
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Par défaut Sequence
    ce que tu cherche c'est le fonctionnement des sequences que l'on trouve dans toutes les bases de données un peu évoluées.

    mais MySQL ne connait pas les séquence et les a remplacé par l'option auto incrément.

    cela répond à 90% du problème mais pas à tout.
    avec une séquence tu peux effectivement savoir quel sera le prochain ID et avoir la garantie que personne ne te le prendra.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT nextval() FROM mysequence
    avec un auto incrément tu peux connaitre se prochain id en faisant un + 1 sur le dernier mais entre le moment ou tu l'obtiens et le moment où tu veux le mettre en base il a peut être été utilisé.

    Bref je suis contrains à rester sur une 4.0 ou 4.1 de MySQL et je n'ai pas trouvé de solution.

    Le gourou de MySQL pourons peut être nous dire si dans les version suivante les sequences sont enfin implémentées.

    A+JYT

  9. #9
    Membre éclairé Avatar de hisy
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    377
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 377
    Par défaut
    Et se demander pourquoi connaître le prochain ID, ça m'étonnerait que tu en aies *vraiment* besoin.
    Il arrive que l'on est besoin du numéro d'implément le l'enregistrement que l'on va faire dans la table 1 pour lié un enregistrement dans la table 2.

    Pour moi la question est intéressante ...

    Si on fait les 2 insertions ( meme dans le meme script) comment garantir que le mechant client 2 évoqué par Seb ne soit pas venu s'intercaler ?

  10. #10
    Expert confirmé
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Par défaut
    comment gérer sans connaitre l'ID le rejeu d'une requête d'insertion.

    pour ma part j'utilise la bonne vielle méthode du next sur une sequence comme dans tout bon programme depuis que les SGBDR existent.

    bref
    préaration de formulaire (avec getNextId)
    affichage du formulaire avec l'ID positionné
    insert de l'enregistrement.

    ces trois étapes sont toujours obligatoires mais qui garanti que ces trois actions se font sur le même enregistrement avec le web et php qu'est-ce qui garanti que deux ou plusieurs acteurs ne vont pas s'intercaler

    prépa form user1
    prépa form user2
    aff form user1
    prépa form user3
    aff form user3
    aff form user2
    insert form user2
    insert form user3
    insert form user1

    avec la gestion des séquence j'ai la garantie que l'id pour le user1 est inferieur à celui du user2 qui est inférieur à celui du user3

    dans toutes les partie du code de ses actions pour chaque user j'ai ID sur et garanti.

    avec un auto incrément je ne sais rien.
    pire
    si je tombe sur un excité du clik sur le bouton envois
    prépa form user1
    prépa form user2
    aff form user1
    prépa form user3
    aff form user3
    aff form user2
    insert form user2
    insert form user3
    insert form user3
    insert form user3
    insert form user3
    insert form user3
    insert form user3
    insert form user1

    dans ce cas si j'ai un autoincrément comment faire pour ne pas se retrouver avec 8 inset à la place de 3 ?

    comment dans le code php détecter que le user3 me reposte le formulaire ?

    si je connais l'ID à l'avance je le mets dans le prépare form
    donc lorsqu'il poste son formulaire je sais que si l'id est dans la base je ne peu accepter les données.
    avec les moteurs qui gèrent les séquences je sais même que c'est un repost et non pas une collision d'ID

    avec MySQL j'ai deux possibilité soit il y a repost soit il y a collision.

    si je ne connais pas l'ID avant je ne sais rien et je ne peux que mettre les valeur en base et donc me retrouver avec des duplicata.

    avec MySQL la seule solution que j'ai trouvé est d'ajouter un champ CHAR non null et unique.

    dans le prépare de mon form j'utilise un UUID (Universal Unique ID)
    Lorsque je reçois les données du formulaire si l'UUID est en base c'est un repost. s'il n'y est pas je fais mon insert.

    mais avec cette méthode je ne connais pas à l'avance la valeur du champs autoincrement. et si je dois m'en servir pour d'autres tables c'est moins évident.

    A+JYT

Discussions similaires

  1. [XL-2003] Clé primaire auto incrémentée non modifiable
    Par Xenna77 dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 03/12/2014, 19h35
  2. Réponses: 8
    Dernier message: 04/03/2014, 16h56
  3. [AC-2007] Clé auto-incrémentée non détectée
    Par billybob2 dans le forum Projets ADP
    Réponses: 4
    Dernier message: 06/09/2011, 19h54
  4. Réponses: 2
    Dernier message: 27/04/2009, 11h39
  5. ca ne fonctionne pas (generateur auto-incrémentant)
    Par tripper.dim dans le forum SQL
    Réponses: 7
    Dernier message: 26/11/2002, 00h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo