Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1233 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Gestion des champs en auto-incrémentation avec PEAR

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Gestion des champs en auto-incrémentation avec PEAR

n°609031
rufo
Pas me confondre avec Lycos!
Posté le 12-01-2004 à 15:34:43  profilanswer
 

   Voilà, je suis en train de développer un site en PHP qui repose sur une BD (ici, MySQL, mais ça pourrait être une autre, genre Oracle). Pour être (en théorie) indépendant de la BD utilisée, j'utilise les primitives de la bibliothèque PEAR.
 
    Seulement, d'après mon bouquin de PHP (la bible PHP), les champs auto-incrémentés n'exsitent pas sur toutes les SGBD. Il conseille donc d'utiliser les séquences (les fct createSequence, dropSequence et nextId). Sauf que dans l'exemple de mon bouquin, la table est remplie d'un coup, donc la fonction nextId retourne les valeurs de 1 à n. Dans mon cas, je veux que ça retourne le bon ID, genre, si j'ai déjà 3 enregistrements dans ma table, je veux que nextId retourne 4.
    Mais voilà, je n'y suis pas parvenu. J'ai essayé de faire un while sur nextId pour que, une fois arrivé à la fin de la séquence, la fonction renvoie une erreur, mais je boucle à l'infini (et en plus, ce genre de méthode serait très longue dans le cas d'un grand nb d'enregistrements).
    J'ai donc trouvé comme solution de secours, retourner l'ID max et l'incrémenter. Mais j'ai peur qu'entre la première requête (récup de l'ID max) et la requête INSERT, il y ait eu une autre insertion et que par conséquent, mon ID récupéré ne serait plus bon :(...
 
    Vous pouvez m'aider, svp? Merci beaucoup... :hello:

mood
Publicité
Posté le 12-01-2004 à 15:34:43  profilanswer
 

n°610145
rufo
Pas me confondre avec Lycos!
Posté le 13-01-2004 à 09:39:14  profilanswer
 

up :)

n°611105
ethernal
Chercheur de vérité...
Posté le 13-01-2004 à 21:39:24  profilanswer
 

il y a peu de chance que cela arrive si tu fais tes query l'une derrière l'autre.

Code :
  1. $query= "select max(id) as newID from table";
  2. $result= executequery($query);
  3. $query= "insert into ...";
  4. $result= executequery($query);


 
Dans le pire des cas, lock la table (en espérant que ton sgbd le supporte), mais c'est très lourd.
Si ton script s'interrompt juste après le lock, ta table sera figée...
 
--edit 15/01/2004--
non non ne me remercie pas, c'est normal je suis là pour ça...  [:the grosminet]  


Message édité par ethernal le 15-01-2004 à 19:37:35
n°613200
rufo
Pas me confondre avec Lycos!
Posté le 16-01-2004 à 08:59:56  profilanswer
 

ethernal a écrit :

il y a peu de chance que cela arrive si tu fais tes query l'une derrière l'autre.

Code :
  1. $query= "select max(id) as newID from table";
  2. $result= executequery($query);
  3. $query= "insert into ...";
  4. $result= executequery($query);


 
Dans le pire des cas, lock la table (en espérant que ton sgbd le supporte), mais c'est très lourd.
Si ton script s'interrompt juste après le lock, ta table sera figée...
 
--edit 15/01/2004--
non non ne me remercie pas, c'est normal je suis là pour ça...  [:the grosminet]  


 
Comme tu as pu le lire dans mon premier post, la méthode que tu me proposes est celle que j'ai mis en place (mais sans le lock). En tout cas, c'est sympa de m'avoir répondu, car je vois que ce que j'ai fait n'est pas trop débile... :)

n°613747
ethernal
Chercheur de vérité...
Posté le 16-01-2004 à 19:15:52  profilanswer
 

oui, c'est exact, c'est la même méthode avec la précision de faire les query l'une derrière l'autre.
(Je l'ai précisé pcq la première fois que j'ai dû faire cela en Cobol, je créais mon ID lors de la demande de création d'un nouvel élément et je lockais la table... et évidemment cela change tout :D, le temps que la personne valide son enregistrement, les autres étaient bloquées.)
 
La seule possibilité, est de faire tes querys en "1 bloc".
 
Je pense qu'il y a déjà eu qq messages concernant les "Lock", mais cette méthode a toujours été déconseillée (si le dé-lock ne se fait pas, la table est inutilisable).
 [:pom2ping]

n°615651
rufo
Pas me confondre avec Lycos!
Posté le 19-01-2004 à 14:28:09  profilanswer
 

ethernal a écrit :

oui, c'est exact, c'est la même méthode avec la précision de faire les query l'une derrière l'autre.
(Je l'ai précisé pcq la première fois que j'ai dû faire cela en Cobol, je créais mon ID lors de la demande de création d'un nouvel élément et je lockais la table... et évidemment cela change tout :D, le temps que la personne valide son enregistrement, les autres étaient bloquées.)
 
La seule possibilité, est de faire tes querys en "1 bloc".
 
Je pense qu'il y a déjà eu qq messages concernant les "Lock", mais cette méthode a toujours été déconseillée (si le dé-lock ne se fait pas, la table est inutilisable).
 [:pom2ping]  


 
c'est clair...(pour le de-lock)


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Gestion des champs en auto-incrémentation avec PEAR

 

Sujets relatifs
gestion du retour a la ligne dans une variable???[Delphi] Gestion mémoire bizarre
[PHP/sql] Valeur d'un champs table sql qui change au cours du temps ?[MySQL] Modifier la valeur de l'AUTO_INCREMENT [résolu]
SQL : Initialisation des champs ajoutés par un ALTER TABLE[Tomcat] Gestion de cache ?
[HTML/JS] variables et nom de champs textesCreer Systeme NEWS - HTML - avec gestion admin ???
recopier des lignes en modifiant certains champs...Projet de gestion hasardeuse de frame (vrai défi inside)
Plus de sujets relatifs à : Gestion des champs en auto-incrémentation avec PEAR


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR