/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
[MySQL] Finde sidste indsatte ID
Fra : Burns


Dato : 04-05-04 14:53

Normalt når jeg skal finde ID'en p åden sidste record jeg har indsat i min
database, så benytter jeg bare "mysql_insert_id" (PHP). Det fungere sådan
set fint, men man risikere vel, at hvis der er mange inserts lige efter
hinanden, at man så får den forkerte ID tilbage.

Hvordan er man 100% sikker på, at få den rigtige ID tilbage? Bliver man nødt
til at søge på det man lige har indsat (men det er jo heller ikke sikkert,
at dette er unikt)?



 
 
Peter Brodersen (04-05-2004)
Kommentar
Fra : Peter Brodersen


Dato : 04-05-04 17:00

On Tue, 4 May 2004 15:53:05 +0200, "Burns" <invalid@nowhere.xyz>
wrote:

>Normalt når jeg skal finde ID'en p åden sidste record jeg har indsat i min
>database, så benytter jeg bare "mysql_insert_id" (PHP). Det fungere sådan
>set fint, men man risikere vel, at hvis der er mange inserts lige efter
>hinanden, at man så får den forkerte ID tilbage.

Altså, hvis du indsætter noget, og der så samtidig er andre requests
på samme website? Bare rolig, du får den sidst indsatte id tilbage fra
den aktuelle mysql-connection.

Andre simultane hits på webserveren rammer andre childs, der så får
php til at lave selvstændige forbindelser til database-serveren (også
ved brug af persistent connections - det betyder blot at hvert child
ikke lukker hver deres forbindelse til database-serveren)

--
- Peter Brodersen

Ugens sprogtip: "Der er et yndigt land" (og ikke "Det er et yndigt land")

Burns (05-05-2004)
Kommentar
Fra : Burns


Dato : 05-05-04 08:17

> Altså, hvis du indsætter noget, og der så samtidig er andre requests
> på samme website? Bare rolig, du får den sidst indsatte id tilbage fra
> den aktuelle mysql-connection.

Er det éns på en MSSQL server også?

Som jeg har forstået "last_id", så ér det sidste ID der er skrevet til
databasen hvilket i mine øre lyder som, at hvis der er to ID'er der skrives
på samme tid, så kan det være tilfældigt hvilken ID man får tilbage.
Mysql_insert_id ligger jo typisk efter indsættelsen og så kan der vel også
opstå delay dér? Hvis det skulle være afhængigt af childs, burde man vel
have en mysql_insert_id($querylink) ?



Peter Brodersen (05-05-2004)
Kommentar
Fra : Peter Brodersen


Dato : 05-05-04 11:18

On Wed, 5 May 2004 09:16:41 +0200, "Burns" <invalid@nowhere.xyz>
wrote:

>Som jeg har forstået "last_id", så ér det sidste ID der er skrevet til
>databasen hvilket i mine øre lyder som, at hvis der er to ID'er der skrives
>på samme tid, så kan det være tilfældigt hvilken ID man får tilbage.

http://dev.mysql.com/doc/mysql/en/mysql_insert_id.html

"The value of mysql_insert_id() is affected only by statements issued
within the current client connection. It is not affected by statements
issued by other clients."

>Hvis det skulle være afhængigt af childs, burde man vel
>have en mysql_insert_id($querylink) ?

http://dk2.php.net/mysql_insert_id
"If link_identifier isn't specified, the last opened link is assumed."

Det gælder for det aktuelle script. link_identifier'er er kun af
hensyn til hvis det aktuelle script har flere forbindelser åbne.

--
- Peter Brodersen

Ugens sprogtip: "Der er et yndigt land" (og ikke "Det er et yndigt land")

Burns (05-05-2004)
Kommentar
Fra : Burns


Dato : 05-05-04 13:21

> http://dk2.php.net/mysql_insert_id
> "If link_identifier isn't specified, the last opened link is assumed."
>
> Det gælder for det aktuelle script. link_identifier'er er kun af
> hensyn til hvis det aktuelle script har flere forbindelser åbne.

Sidste spørgsmål - det er egentligt mere et PHP spørgsmål, men nu kan vi
lige afslutte den her (hvis du har svaret).

PHP scriptet kan jo godt kaldes mange gange fra min webserver - måske endda
på samme tid, men får hver åbning af scriptet tildelt et unikt database ID -
og er det så denne unikke ID der benyttes ved mysql_insert_id()?

Lad os sige, at jeg har et script (rent teoretisk), hvor scripter delayer i
f.eks. 10 sekunder, hvis det er en given bruger (bruger1).. dermed holdes
database forbindelsen åben. Når en anden bruger (bruger2) så åbner scriptet
lige efter bruger2 (og der ingen delay er på bruger2), så afsluttes hans
script før bruger1 script... har PHP/MySQL selv styr på dét således, at
mysql_insert_id() ved bruger1 = bruger1's ID (og ikke bruger2's som jo reelt
set er den sidste indsatte ID).
Til orientering kan vi sige, at delayet sker lige efter indsættelsen og før
mysql_insert_id().

Jeg håber du forstår?



Peter Brodersen (05-05-2004)
Kommentar
Fra : Peter Brodersen


Dato : 05-05-04 13:33

On Wed, 5 May 2004 14:21:14 +0200, "Burns" <invalid@nowhere.xyz>
wrote:

>PHP scriptet kan jo godt kaldes mange gange fra min webserver - måske endda
>på samme tid, men får hver åbning af scriptet tildelt et unikt database ID -
>og er det så denne unikke ID der benyttes ved mysql_insert_id()?

Ja. Lad os sige, at udførslestiden for scriptet er lang nok, eller
trafikken er stor nok, til at der er simultane besøgende.

- Bruger 1 rammer et webserver-child, der afvikler PHP-kode. I
PHP-koden oprettes der en forbindelse til database-serveren, og på den
måde har PHP en mysql-klient kørende op imod database-serveren.

- Bruger 2 rammer et andet webserver-child, der afvikler PHP-kode. I
PHP-koden oprettes der en ny forbindelse til database-serveren.

- PHP'en for Bruger 1 laver en INSERT (fx til id 1234)

- PHP'en for Bruger 2 laver en INSERT (fx til id 1235)

- PHP'en for Bruger 1 anmoder om mysql_insert_id(), og får 1234
tilbage, idet det er last_insert_id for den klient.

- PHP'en for Bruger 2 anmoder om mysql_insert_id(), og får 1235
tilbage, idet det er last_insert_id for den klient.

- PHP'en for Bruger 2 afsluttes.

- PHP'en for Bruger 1 anmoder måske igen om mysql_insert_id, og får
stadigvæk 1234 tilbage, idet det stadigvæk er last_insert_id for den
klient.

- PHP'en for Bruger 1 afsluttes.

Så der er ingen ko på isen.


Eneste kombinations-"problem" er, hvis man i PHP bruger persistent
connections (mysql_pconnect). Det betyder så, at Bruger 3 bagefter
måske rammer samme webserver-child som Bruger 1. Hvis scriptet så helt
i begyndelsen anmoder om mysql_insert_id(), så giver det 1234, fordi
det stadigvæk er samme klient, der stadigvæk er forbundet.

En sådan situation vil dog normalt ikke forekomme i ordinær kode.

--
- Peter Brodersen

Ugens sprogtip: "Der er et yndigt land" (og ikke "Det er et yndigt land")

Burns (05-05-2004)
Kommentar
Fra : Burns


Dato : 05-05-04 14:16

> Så der er ingen ko på isen.

Mange tak - det var en god forklaring.

> Eneste kombinations-"problem" er, hvis man i PHP bruger persistent
> connections (mysql_pconnect). Det betyder så, at Bruger 3 bagefter
> måske rammer samme webserver-child som Bruger 1. Hvis scriptet så helt
> i begyndelsen anmoder om mysql_insert_id(), så giver det 1234, fordi
> det stadigvæk er samme klient, der stadigvæk er forbundet.

Jeg bruger ikke mysql_pconnect, så det skulle ikke give problemer (for mig).



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408924
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste