France Hardware : Forums de discussion
Retrouvez les prix près de chez vous :  
Index du forum | Liste des membres | Liste des groupes | Inscription | F-A-Q | Recherche
Pseudo :    Password :     
22 319 membres enregistrés - 1 871 655 posts - 95 033 topics
Index des forums FH  | Index des forums DegroupNews
      Programmation
           MDB2 et lastInsertId()
38 connectés(record : 207 le 05 juin 2007 - 05 h 23)

Vous devez vous connecter pour répondre au topic.
MDB2 et lastInsertId()

grabber
Coordinateur
MacBook Pro 2,4 Powered

Messages : 8 510
Inscrit le 06/03/02
Ville : Angers
Non connecté
  Posté le 08 janvier 2008 - 01 h 36 m 49 s
hello,

bon j'ai un epineux problème à résoudre...
ca fait 2h que je cherche de tous les côtés mais pour l'instant j'arrive pas à trouver LA réponse que j'attends...
mon problème est con à la base : insérer une ligne dans une table et récupérer l'id

la fonction de php qui gere ca "bug", enfin non elle bug pas, elle est documentée telle qu'elle, mais c'est merdique, je m'explique :
lorsque l'on fait appel dans mon cas via mysql à la fonction mysql_insert_id(), celle ci retourne bein l'id de la ligne inseree, dans une table bein entendu ou l'on a un increment sinon aucun interet...
Le problème de cette fonction c'est que si entre temps d'autres insertions sont faites dans la table, la valeur retournée va être celle de la 1ère valeur insérée parmi les valeurs... et non pas celle qui nous intéresse. En postgres on gère ça via une séquence, mais en mysql c'est assez merdique.
de toute façon, je vous arrête tout de suite, mais à des fins de portabilité j'utilise MDB2.

Donc voila mon problème, je n'arrive pas à trouver noir sur blanc écrit que la fonction lastInsertId() incluse à MDB2 réagit correctement ou non, typiquement est ce qu'elle se réfère bien à la séquence et non pas à l'id de la valeur d'une série.

Voila en gros.

Alors j'ai regardé un peu de tous les côtés, jme suis paluché toute la doc de MDB2 et je trouve pas. D'autre part, j'ai lu sur certains sites que pour gérer ça correctement il fallait passer la connection à la base en factory, alors bon voila le probleme quand on bosse tout seul et qu'on a appris sur le tas sans cours, je pige pas trop la notion de factory et ce qu'elle apporte. dans l'idéal, j'aimerais "encapsuler" toutes les requetes d'un utilisateur dans une bulle, ce qui me permettrait d'éviter les insertions externes, mais ca je sais pas comment faire :(

voila voila, je vous cache pas que c'est un peu la crise la...
alors la disons que c'est pour un mail d'activation avec une url du type : blabla.php?iduser=154&key=qdqsd45s4qs5d43qs4
la cle a 20 caracteres aleatoires que je stocke dans la table, donc a la rigueur jmen fout un peu, je pourrais gerer juste avec la cle, 20 caracteres aleatoires, faut deja avoir pas de bol pour que la meme cle tombe 2 fois sur 2 comptes non actives... mais bon, dans l'ideal, je veux trouver la soluce reelle pour ce probleme de last insert id car j'ai deja eu le cas, et la je risque de l'avoir sur une periode de charge donc je veux pas que tout pete et que la routine d'activation foire :jap:

si quelqu'un a des tuyaux j'achete :jap:

merci d'avance



:firefox:

moinal


Messages : 122
Inscrit le 12/03/05
Ville : Aix en provence
Non connecté
  Posté le 08 janvier 2008 - 09 h 42 m 07 s
T'aas testé l'émulation de sequence par mdb2 ?
vu par là : http://hugo.developpez.com/tutoriels/php/pear/mdb2/

    Code     
 1. Pour les personnes familières avec les séquences, MDB2 en propose aussi une émulation :
 2. php
 3. 
 4.         $result = $db->manager->createSequence($seq_name);
 5.         $array = $db->manager->listSequences();
 6.         $id = $db->currID($seq_name); // récupération de la valeur courante de la séquence
 7.         $id = $db->nextID ($seq_name); // incrémentation de la séquence
 8.         $result = $db->manager->dropSequence($seq_name);
 9. 
10. 






grabber
Coordinateur
MacBook Pro 2,4 Powered

Messages : 8 510
Inscrit le 06/03/02
Ville : Angers
Non connecté
  Posté le 08 janvier 2008 - 09 h 58 m 21 s
pour tester il faudrait que je puisse balancer x insert de x ip differentes a la meme seconde, autant dire que c'est impossible de simuler un truc pareil :(
d'autre part, le terme emulation me fait un peu peur, cette fonctionnalite etant intrinseque a postgres et pas du tout a mysql, la couche d'abstraction n'est elle qu'une emulation ou une implementation reelle ???

c'est justement la question que je pose :jap:

t pas sur msn toi ? tu fais bande a part smatin :P :lol:
dis donc tu voudrais pas msn ton poto le dbman :P



:firefox:

OdL1234


Messages : 5
Inscrit le 08/01/08
Ville : Nice
Non connecté
  Posté le 08 janvier 2008 - 12 h 12 m 10 s
Bonjour,

Sollicité par un pote sur ce point, je post donc :)

Le problème que tu as avec ton "ID autoincrément" ne sera vraiment réglé que... lorsque tu te passeras de cet ID autoincrément qui est une dérive dans le monde "PHP MySQL" et qui peut dans 99% des cas être supprimé dans le monde de la DB relationnelle.

En effet, un schéma relationnel est un découpage "d'un gros tas de données" en table qui tend à avoir humainement du sens.

Plus précisemment cet ID autoincrément ne sert qu'à assurer une unicité sur une table mais vu que ces tables sont censées avoir humainement du sens, il y a forcément un champ (ou une combinaison de champs) de cette table qui pourront assurer cette unicité.

Exemple d'une table quelconque qui contient les champs :
- utilisateur
- password
- email
- date d'inscription
- date de naissance
- ville

=> ici, le champ "email" assurera parfaitement l'unicité (que ce soit avec une PK ou une contrainte UNIQUE, peu importe, ça c'est un autre débat). Pas besoin d'ID autoincrement et donc pas de problème... et... c'est comme ça qu'un schéma relationnel doit être fait :)

Ca donnera :
create table my_users (
..... blabla ....
email varchar(50) not null unique,
..... blabla......... );

OdL


Message édité 1 fois, la dernière par OdL1234 le 08 janvier 2008 - 12 h 13.


grabber
Coordinateur
MacBook Pro 2,4 Powered

Messages : 8 510
Inscrit le 06/03/02
Ville : Angers
Non connecté
  Posté le 08 janvier 2008 - 13 h 50 m 10 s
salut Fred,

oui c'est certain pour le schema relationnel, mon probleme teint des vieilles (mauvaises) habitudes d'une part, et d'autre part au fait que je n'ai malheureusement pas le temps de tout reprendre pour l'instant car je dois sortir cette appli au plus vite, au minimum dans une pre version utilisable.
la solution en consequence pour moi est d'effectivement pour mon probleme d'activation de jouer sur la cle d'activation et sur l'email, c'est ce que j'avais envisage ce matin.
pour la future version, il est certain que je vais revoir cet aspect d'auto increment qui de toute facon n'apporte pas tant de flexibilite qu'il n'y parait sur le papier.

merci de ta reponse en tout cas :jap:

Oliv (et merci moino pour le passage de question :P )



:firefox:

betux
Coordinateur
testis ...

Messages : 2 851
Inscrit le 08/10/03
Ville : lyon et parfois grenoble
Non connecté
  Posté le 08 janvier 2008 - 14 h 25 m 41 s
que ce soit en oracle ou en sql server c'est la requete sql qui retourne l'id de mémoire apres tu stocks en var.
je pense que ça doit être la même chose en mysql non ?



Il faut que le hasard renverse la fourmi pour qu elle voit le ciel.

OdL1234


Messages : 5
Inscrit le 08/01/08
Ville : Nice
Non connecté
  Posté le 08 janvier 2008 - 16 h 18 m 19 s
@grabber : sinon tu dois pouvoir émuler une vraie séquence avec un trigger pour pallier ton problème actuel




OdL1234


Messages : 5
Inscrit le 08/01/08
Ville : Nice
Non connecté
  Posté le 08 janvier 2008 - 16 h 28 m 30 s
@grabber : hmmm un truc sans doute con, pourquoi tu veux récupérer l'ID d'un autoincrément qui ne sert qu'à assurer une unicité ? :/




Woofy
Pour les bons tuyaux me demander

Messages : 26 008
Inscrit le 11/01/02
Ville : Paris / Grenoble
Non connecté
  Posté le 08 janvier 2008 - 17 h 37 m 24 s
Ben si jamais tu veux faire des clé étrangères en faisant des liens avec d'autres enregistrements sur d'autres tables ?



:smileymouth: Totalement inutile, donc completement indispensable :smileymouth:

:sms:


OdL1234


Messages : 5
Inscrit le 08/01/08
Ville : Nice
Non connecté
  Posté le 08 janvier 2008 - 18 h 00 m 16 s
Ah bah ouais, et voilà le problème auquel tu te heurtes avec un ID autoincrément et pas avec une vraie PK ;)




grabber
Coordinateur
MacBook Pro 2,4 Powered

Messages : 8 510
Inscrit le 06/03/02
Ville : Angers
Non connecté
  Posté le 09 janvier 2008 - 00 h 39 m 19 s
woofy > voila c'est ca :(

bah en resume, les mauvaises habitudes, des habitudes a perdre...

sinon pour mon bete probleme d'activation j'ai resolu le probleme en gerant ca avec l'email en unique et une key d'activation stockee dans la table a la generation du mail. pour ca ca colle. mais comme je disais a moino sur msn, de toute facon, je boucle cette premiere version et je refais completement mon modele pour pondre une seconde version mi 2008 qui elle repondra vraiment a mes attentes, d'ailleurs si tu peux y jeter un oeil :P (Odl1234). d'ailleur t'aurais pas pu nous trouver un pseudo encore pire :dd: :lol:



:firefox:

OdL1234


Messages : 5
Inscrit le 08/01/08
Ville : Nice
Non connecté
  Posté le 09 janvier 2008 - 08 h 10 m 55 s
Voilà, très bien le mail en unique ou le nom de l'utilisateur sinon, ça revient au même ;)

Pas de pb pour jetter un OeiL :o mais là on passera par un vrai mail en direct, ça ira mieux ;)

Pour le pseudo bah ouais, j'ai créé rapide ;)




grabber
Coordinateur
MacBook Pro 2,4 Powered

Messages : 8 510
Inscrit le 06/03/02
Ville : Angers
Non connecté
  Posté le 02 février 2008 - 13 h 14 m 55 s
je remonte le topic...

en effet, je viens de reprendre une appli d'un client que j'avais pas touchee depuis 6 mois faute de budget cote client et sur laquelle il manquait des modules (il en manque toujours d'ailleurs...).

a l'epoque, j'avais demarre l'appli en utilisant pear db ,et puis la histoire de gagner du temps, je suis passe en local, et en local, j'ai mdb2 et plus db. du coup, j'ai pas mal de merdes notamment le fetchmode qui sur db n'etait pas en dur, de qui fait que j'utilisais des fois assoc et des fois pas (en passant pas row[0] par exemple, tres mauvais e methode ;) ). bref donc quelques corrections et mise en evidence d'un bug plus ennuyeux...

j'avais des requetes style : SELECT LAST_INSERT_ID()
hors ca ne marche plus via MDB2, resultat, toutes les requetes decoulant de celle ci ne s'executaient pas.
donc ce matin je me suis penche sur le probleme a nouveau et je l'ai enfin resolu...

donc !

pour ceux que ca interesse, il convient juste d'ajouter les modulkes common.php dasn tous les sous folders de MDB2, ainsi on etend la classe qui de fait propose une nouvelle methode.

ainsi, pour recuperer l'id insere, je fais ca :

    Code php    
1. $id_contact=$db->lastInsertId('contact', 'c_id');


ou contact est le nom de la table et c_id le nom de l colonne auto increment :jap:

ca marche nikel ! moi content :D

hope this helps :P



:firefox:

grabber
Coordinateur
MacBook Pro 2,4 Powered

Messages : 8 510
Inscrit le 06/03/02
Ville : Angers
Non connecté
  Posté le 02 février 2008 - 13 h 20 m 48 s
PS : pour ceux chez qui ce truc planterait la page, jetez un oeil dans le log php et vous aurez un message merdique provenant du require...

en fait, le souci vient du fait que lorsque l'on telecharge a la mano le driver de la base utilisee pour MDB2, il ne prend que le driver brut et ca ne suffit pas, j'en ai bien chie pour trouver les fameux fichiers common.php...

voila le fichier que j'ai recup pour moi, si vous n'avez pas la meme version de MDB2 bein sur, ben prenez celui qui convient a votre version : MDB2-2.4.1

contenu de l'archive :

total 176
drwx------+ 54 MooG staff 1836 2 fév 13:20 ..
drwxr-xr-x 6 MooG staff 204 2 fév 13:19 .
-rw-r--r-- 1 MooG staff 5945 2 fév 13:19 toto2
-rw-r--r--@ 1 MooG staff 6148 2 fév 12:15 .DS_Store
drwxr-xr-x 8 MooG staff 272 2 fév 12:15 MDB2-2.4.1
-rw-r--r-- 1 MooG staff 70816 3 mai 2007 package.xml

./MDB2-2.4.1:
total 304
drwxr-xr-x 6 MooG staff 204 2 fév 13:19 ..
drwxr-xr-x 8 MooG staff 272 2 fév 12:15 .
-rw-r--r--@ 1 MooG staff 6148 2 fév 12:15 .DS_Store
drwxr-xr-x 8 MooG staff 272 2 fév 12:15 MDB2
drwxr-xr-x 9 MooG staff 306 2 fév 12:15 docs
drwxr-xr-x 35 MooG staff 1190 2 fév 12:15 tests
-rw-r--r-- 1 MooG staff 2887 3 mai 2007 LICENSE
-rw-r--r-- 1 MooG staff 140275 3 mai 2007 MDB2.php

./MDB2-2.4.1/MDB2:
total 128
-rw-r--r--@ 1 MooG staff 6148 2 fév 12:16 .DS_Store
drwxr-xr-x 8 MooG staff 272 2 fév 12:15 Driver
drwxr-xr-x 8 MooG staff 272 2 fév 12:15 .
drwxr-xr-x 8 MooG staff 272 2 fév 12:15 ..
-rw-r--r-- 1 MooG staff 6421 3 mai 2007 Date.php
-rw-r--r-- 1 MooG staff 26138 3 mai 2007 Extended.php
-rw-r--r-- 1 MooG staff 7215 3 mai 2007 Iterator.php
-rw-r--r-- 1 MooG staff 8314 3 mai 2007 LOB.php

./MDB2-2.4.1/MDB2/Driver:
total 16
-rw-r--r--@ 1 MooG staff 6148 2 fév 12:15 .DS_Store
drwxr-xr-x 8 MooG staff 272 2 fév 12:15 .
drwxr-xr-x 8 MooG staff 272 2 fév 12:15 ..
drwxr-xr-x 3 MooG staff 102 2 fév 12:15 Datatype
drwxr-xr-x 3 MooG staff 102 2 fév 12:15 Function
drwxr-xr-x 3 MooG staff 102 2 fév 12:15 Manager
drwxr-xr-x 3 MooG staff 102 2 fév 12:15 Native
drwxr-xr-x 3 MooG staff 102 2 fév 12:15 Reverse

./MDB2-2.4.1/MDB2/Driver/Datatype:
total 128
drwxr-xr-x 8 MooG staff 272 2 fév 12:15 ..
drwxr-xr-x 3 MooG staff 102 2 fév 12:15 .
-rw-r--r-- 1 MooG staff 63758 3 mai 2007 Common.php

./MDB2-2.4.1/MDB2/Driver/Function:
total 16
drwxr-xr-x 8 MooG staff 272 2 fév 12:15 ..
drwxr-xr-x 3 MooG staff 102 2 fév 12:15 .
-rw-r--r-- 1 MooG staff 7958 3 mai 2007 Common.php

./MDB2-2.4.1/MDB2/Driver/Manager:
total 64
drwxr-xr-x 8 MooG staff 272 2 fév 12:15 ..
drwxr-xr-x 3 MooG staff 102 2 fév 12:15 .
-rw-r--r-- 1 MooG staff 32309 3 mai 2007 Common.php

./MDB2-2.4.1/MDB2/Driver/Native:
total 8
drwxr-xr-x 8 MooG staff 272 2 fév 12:15 ..
drwxr-xr-x 3 MooG staff 102 2 fév 12:15 .
-rw-r--r-- 1 MooG staff 3499 3 mai 2007 Common.php

./MDB2-2.4.1/MDB2/Driver/Reverse:
total 40
drwxr-xr-x 8 MooG staff 272 2 fév 12:15 ..
drwxr-xr-x 3 MooG staff 102 2 fév 12:15 .
-rw-r--r-- 1 MooG staff 17844 3 mai 2007 Common.php

./MDB2-2.4.1/docs:
total 64
drwxr-xr-x 8 MooG staff 272 2 fév 12:15 ..
drwxr-xr-x 9 MooG staff 306 2 fév 12:15 .
drwxr-xr-x 5 MooG staff 170 2 fév 12:15 examples
-rw-r--r-- 1 MooG staff 421 3 mai 2007 CONTRIBUTORS
-rw-r--r-- 1 MooG staff 471 3 mai 2007 MAINTAINERS
-rw-r--r-- 1 MooG staff 7873 3 mai 2007 README
-rw-r--r-- 1 MooG staff 1264 3 mai 2007 STATUS
-rw-r--r-- 1 MooG staff 62 3 mai 2007 TODO
-rw-r--r-- 1 MooG staff 7940 3 mai 2007 datatypes.html

./MDB2-2.4.1/docs/examples:
total 40
drwxr-xr-x 5 MooG staff 170 2 fév 12:15 .
drwxr-xr-x 9 MooG staff 306 2 fév 12:15 ..
-rw-r--r-- 1 MooG staff 9234 3 mai 2007 example.php
-rw-r--r-- 1 MooG staff 2978 3 mai 2007 example_php5.php
-rw-r--r-- 1 MooG staff 1651 3 mai 2007 metapear_test_db.schema

./MDB2-2.4.1/tests:
total 800
drwxr-xr-x 8 MooG staff 272 2 fév 12:15 ..
drwxr-xr-x 35 MooG staff 1190 2 fév 12:15 .
-rw-r--r-- 1 MooG staff 903 3 mai 2007 Console_TestListener.php
-rw-r--r-- 1 MooG staff 998 3 mai 2007 HTML_TestListener.php
-rw-r--r-- 1 MooG staff 1115 3 mai 2007 MDB2_Connect_Test.php
-rw-r--r-- 1 MooG staff 12199 3 mai 2007 MDB2_api_testcase.php
-rw-r--r-- 1 MooG staff 12681 3 mai 2007 MDB2_bugs_testcase.php
-rw-r--r-- 1 MooG staff 33563 3 mai 2007 MDB2_datatype_testcase.php
-rw-r--r-- 1 MooG staff 29423 3 mai 2007 MDB2_extended_testcase.php
-rw-r--r-- 1 MooG staff 9660 3 mai 2007 MDB2_function_testcase.php
-rw-r--r-- 1 MooG staff 22157 3 mai 2007 MDB2_internals_testcase.php
-rw-r--r-- 1 MooG staff 26005 3 mai 2007 MDB2_manager_testcase.php
-rw-r--r-- 1 MooG staff 3290 3 mai 2007 MDB2_native_testcase.php
-rw-r--r-- 1 MooG staff 6094 3 mai 2007 MDB2_nonstandard.php
-rw-r--r-- 1 MooG staff 4326 3 mai 2007 MDB2_nonstandard_ibase.php
-rw-r--r-- 1 MooG staff 4480 3 mai 2007 MDB2_nonstandard_mssql.php
-rw-r--r-- 1 MooG staff 4170 3 mai 2007 MDB2_nonstandard_mysql.php
-rw-r--r-- 1 MooG staff 3313 3 mai 2007 MDB2_nonstandard_mysqli.php
-rw-r--r-- 1 MooG staff 4457 3 mai 2007 MDB2_nonstandard_oci8.php
-rw-r--r-- 1 MooG staff 4880 3 mai 2007 MDB2_nonstandard_pgsql.php
-rw-r--r-- 1 MooG staff 4262 3 mai 2007 MDB2_nonstandard_sqlite.php
-rw-r--r-- 1 MooG staff 23845 3 mai 2007 MDB2_reverse_testcase.php
-rw-r--r-- 1 MooG staff 7328 3 mai 2007 MDB2_testcase.php
-rw-r--r-- 1 MooG staff 75758 3 mai 2007 MDB2_usage_testcase.php
-rw-r--r-- 1 MooG staff 1963 3 mai 2007 README
-rw-r--r-- 1 MooG staff 346 3 mai 2007 basic.phpt
-rw-r--r-- 1 MooG staff 5696 3 mai 2007 clitest.php
-rw-r--r-- 1 MooG staff 467 3 mai 2007 config.php
-rw-r--r-- 1 MooG staff 2007 3 mai 2007 driver_test.schema.xml
-rw-r--r-- 1 MooG staff 1188 3 mai 2007 import.schema.php
-rw-r--r-- 1 MooG staff 5468 3 mai 2007 test.php
-rw-r--r-- 1 MooG staff 3426 3 mai 2007 testUtils.php
-rw-r--r-- 1 MooG staff 4339 3 mai 2007 test_setup.php.dist
-rw-r--r-- 1 MooG staff 1853 3 mai 2007 testchoose.php
-rw-r--r-- 1 MooG staff 477 3 mai 2007 tests.css



:firefox:

defrance
PI-nary rules

Messages : 704
Inscrit le 05/09/03
Ville : Lyon
Non connecté
  Posté le 02 février 2008 - 15 h 46 m 42 s
hello grabber,
une solution qui est loin d'etre propre est de passer par un champ initialisé avec un timestamp et le code utilisateur que tu stockes aussi dans ton programme. ensuite tu récupères l'enreg et l'id crée en le sélectionnant avec la clé conservé.
je sais c'est pas super propre mais au moin cela à le mérite de fonctionner.



La connerie c'est la décontraction de l'esprit, c'est pour cela que de temps en temps je m'autorise à faire le con.
Serge Gainsbourg


grabber
Coordinateur
MacBook Pro 2,4 Powered

Messages : 8 510
Inscrit le 06/03/02
Ville : Angers
Non connecté
  Posté le 02 février 2008 - 16 h 18 m 33 s
hello,

ouais c clair, le truc c'est que je bosse sur de la grosse appli, donc moins j'en fait et mieux jme porte :lol: enfin je veux dire que j'essaye de deleguer au maximum a l'abstraction pour m'affranchir des bidouillages.
le probleme c'est qu'en multi utilisateur, ca devient vite le merdier de bidouiller.
mais je vois ce que tu veux dire, en gros creer une session virtuelle par utilisateur dans une table ce qui permet de tracer la transaction ;) mais ca fait quand meme beaucoup de choses a gerer, enfin de la requete du moins, alors si je peux en faire l'economie...

pour l'instant MDB2 a l'air de suivre, j'ai reimplemente la methode sur oplusieurs modules, ca tient le coup... a suivre...



:firefox:

Page genérée en 1.4204 secondes par RahForum 2.0 | Gzip off |  Stats |  Metaforums |  RSS
© 2004 Cerbere Systems.
Prix Matériel Informatique | Informatique Lyon | Informatique Grenoble | Informatique Annecy | Informatique Marseille | Informatique Bordeaux | Forum Informatique
ADSL |Actualité ADSL | e-commerce | Commande Au Volant
Creative Commons
Message Boards and Forums Directory