Avatar billede jonasst Nybegynder
30. juli 2005 - 12:34 Der er 13 kommentarer og
1 løsning

Give et fortløbende reservationsnummer efter bestilling

Hej Eksperter
Jeg vil gerne give brugerne af mit billetsystem et reservationsnummer, som er fortløbende, efter de har bestilt en billet.
Det kunne jo f.eks. være $id (den primære nøgle i tabellen) Men hvordan henter jeg $id på den INSERT der netop er lavet
Avatar billede nielle Nybegynder
30. juli 2005 - 12:36 #1
Gætter på at vi snakker MySQL:

<?php
  mysql_connect("localhost", "mysql_user", "mysql_password") or
      die("Could not connect: " . mysql_error());
  mysql_select_db("mydb");

  mysql_query("INSERT INTO mytable (product) values ('kossu')");
  printf ("Last inserted record has id %d\n", mysql_insert_id());
?>
Avatar billede mysli Nybegynder
30. juli 2005 - 12:37 #2
SELECT id FROM tabel LIMIT 0,1 ORDER BY id DESC
Avatar billede nielle Nybegynder
30. juli 2005 - 12:42 #3
Funktionen mysql_insert_id()) er direkte skabt til formålet:

http://dk2.php.net/mysql_insert_id
Avatar billede jonasst Nybegynder
30. juli 2005 - 12:52 #4
Ja vi snakker mysql
Og selvfølgelig LIMIT - jeg havde lige glemt mysql limit funktionen det er jo en nem måde at gøre det på.
Men jeg kan godt se at den anden funktion er som skabt til formålet.
Så den prøver jeg først og kan så falde tilbage på den anden:)
Tak for hjælpen begge to gider I smide et svar pls
Avatar billede nielle Nybegynder
30. juli 2005 - 13:07 #5
Den er ikke "som skabt" - den "er skabt" til formålet. Brugen af den har endvidere den fordel at man sparer et SQL-kald til basen for at finde det seneste indsatte, samt at man er sikret imod den (sikkert sjældne situation) hvor der er to brugere som er ved at oprette en ordre på samme tid.

Svar :^)
Avatar billede delphinarious Nybegynder
30. juli 2005 - 13:11 #6
Jeg støtter lige op omkring nielles påstand her. At lave et ekstra sql-kald vil være fuldstændig overflødig brug af ressourcer, når man nu har mysql_insert_id-funktionen. Desuden vil det med at lave et ekstra sql-kald også kunne give problemer, hvis scriptet køres 2 eller flere gange samtidigt af forskellige brugere.
Avatar billede mysli Nybegynder
30. juli 2005 - 13:40 #7
Vil også sige den må gå tile nielle. Var ikke klar over den funktion, men man lærer noget hver dag:)
Avatar billede jonasst Nybegynder
30. juli 2005 - 21:22 #8
Ja det er ret at slippe for samtidigheds problemer og for et ekstra SQL-kald. Endnu engang tak for hjælpen
Avatar billede jonasst Nybegynder
30. juli 2005 - 21:23 #9
Pointene går så til nielle:)
Avatar billede steenolsen1 Nybegynder
31. juli 2005 - 08:24 #10
Lad mig lige blande mig :-)

Kendte ikke til funktionen, som nielle har vist, men det er smart. DOG ville jeg ikke bruge den her, for hvad nu hvis der er to brugere der bestiller samtidig. Så kunne en af brugerne vel godt få vist det forkerte brugernummer, eller hvad?

Det jeg plejer at gøre, er selvfølgelig at inserte de informationer, der nu engang skal insættes. Derudover indsætter jeg brugeren session_id, fordi jeg efterfølgende så kan gøre som mysli foreslår:
SELECT id FROM tabel WHERE sessionid = '$PHPSESSID' ORDER BY id DESC LIMIT 0,1

Det ville jeg mene er mere sikkert - men som sagt, så kender jeg ikke nielles funktion tilstrækkeligt...
Avatar billede nielle Nybegynder
31. juli 2005 - 08:38 #11
Fra MySQL folkene selv:

http://dev.mysql.com/doc/mysql/en/information-functions.html

Citat:

"The last ID that was generated is maintained in the server on a per-connection basis. This means the value the function returns to a given client is the most recent AUTO_INCREMENT value generated by that client. The value cannot be affected by other clients, even if they generate AUTO_INCREMENT values of their own. This behavior ensures that you can retrieve your own ID without concern for the activity of other clients, and without the need for locks or transactions."

Der skulle m.a.o. ikek være nogen problemer med samtidige brugerer.

Derimod må jeg påpege at $PHPSESSID ikke er garanteret at være unik, og at den faktisk heller ikke er det.
Avatar billede steenolsen1 Nybegynder
31. juli 2005 - 08:45 #12
Det lyder jo som om der er tænkt på det hele. Det vil jeg da til at bruge i fremtiden!

Ved godt at $PHPSESSID ikke er unik i ordets egentlige forstand, men men 32 tegn - bogstaver og tal - er det i endnu mere sikkert, end at man ikke vinder i Lotto, at to brugere får præcist samme sessionid. Der er milliarder af kombinationsmuligheder, og jeg tør derfor godt bruge det :-)
Avatar billede nielle Nybegynder
31. juli 2005 - 09:17 #13
A word of caution:

Jeg har faktisk oplevet et enkelt tilfælde hvor de netop havde forsøgt at bruge PHPSESSID som primary key - det gik ikke godt. Det værste var at de jo havde kørt nogle år før at det begyndte at gå galt, så der var temmeligt meget data i deres base som skulle tjekkes igennem for fejl.
Avatar billede steenolsen1 Nybegynder
31. juli 2005 - 10:24 #14
Man skal aldrig sige aldrig - det er jo trods alt også set, at folk vinder i Lotto. Alligevel mener jeg, at risikoen er så forsvindende lille, at man godt kan leve med det.

Hvis der findes bedre/mere sikre måder, hører jeg (og formodentlig også andre) selvfølgelig gerne om det :-) Tænker her på måden man opbygger f.eks. et shoppingsite eller andet på, hvor der er behov for "sikkerhed".
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester