2009-03-02, 18:31
  #1
Medlem
Håller på med ett litet enkelt beställning/order system, och kom och tänka på en sak när jag skrev koden. Varje order ska ju självklar ha ett unikt ordernr. Jag har löst detta genom att direkt efter att ordern har lagts till i databasen så hämtas det senaste inlagda ordernr.

INSERT INTO order2 osv;
$result = mysql_query("SELECT id FROM order2 ORDER BY id DESC LIMIT 1");
(id = ordernummret)

Min fundering är nu denna, kan detta bli fel? Alltså finns det någon möjlighet att man får tillbaka fel ordernr om tex två perssoner lägger sin order nästintill samtidigt. Finns det något annat sätt att lösa detta på annars?
Citera
2009-03-02, 20:31
  #2
Medlem
Vanligtvis lägger man till auto increment som en egenskap på en int-kolumn i tabellen. Denna behöver du sedan inte ens tänka på i fortsättningen.

Edit: ojoj. Skrev lite fel.. Rättar till det.
__________________
Senast redigerad av Antant 2009-03-02 kl. 20:36.
Citera
2009-03-02, 22:08
  #3
Medlem
Jo självklart har jag gjort det, kanske skulle sagt det =)
Mena mer om två stycken lägger en order samtidigt och det kan bli något fel då.
Citera
2009-03-02, 22:50
  #4
Medlem
Det lär inte vara något problem. Jag är förvisso inte proffs, men jag har läst en hel del artiklar om säkerhet med databaser och PHP och aldrig har jag läst någonting som berör detta tidigare, så det lär vara ganska safe.
Citera
2009-03-02, 22:56
  #5
Medlem
Protons avatar
under förutsättning att du kör mysql så kan du använda SELECT LAST_INSERT_ID() så kommer du att få tillbaka ett result bestående av sist tillagda idt för denna specifika db-anslutning. Ett annat trick om man använder PHP är ju att använda mysql_last_insert() eller nåt sånt hette den, kom inte ihåg exakt, men den finns
Citera
2009-03-02, 23:43
  #6
Bannlyst
Vad jag förstod det som så tänkte du kolla varje gång någon gjorde en order, kolla det senaste ordernumret och öka det med 1?

Det bästa vore att bara skapa ett fält vid namn "id", sätta det som typen "int" (integer, heltal), sätta "auto_increment" som "extra" och ge den en "primary key" (primär nyckel). Vad jag vet så kan inte två sådana id:s bli samma då.
Citera
2009-03-03, 00:42
  #7
Medlem
gadzooxs avatar
Citat:
Ursprungligen postat av Enigmium
Vad jag förstod det som så tänkte du kolla varje gång någon gjorde en order, kolla det senaste ordernumret och öka det med 1?

Det bästa vore att bara skapa ett fält vid namn "id", sätta det som typen "int" (integer, heltal), sätta "auto_increment" som "extra" och ge den en "primary key" (primär nyckel). Vad jag vet så kan inte två sådana id:s bli samma då.
:
Citat:
Ursprungligen postat av Antant
Vanligtvis lägger man till auto increment som en egenskap på en int-kolumn i tabellen. Denna behöver du sedan inte ens tänka på i fortsättningen.
Citat:
Ursprungligen postat av Yotta
Jo självklart har jag gjort det, kanske skulle sagt det =)

OnT: Ja, om du manuellt selectar högsta ID efter att du gjort en select, finns självklart risken att det hunnit bli en insert däremellan. Som tidigare påpekats är det säkrare att använda mysql_insert_id() för att hämta ditt senaste id.
Citera
2009-03-03, 00:45
  #8
Bannlyst
Citat:
Ursprungligen postat av gadzoox
:


OnT: Ja, om du manuellt selectar högsta ID efter att du gjort en select, finns självklart risken att det hunnit bli en insert däremellan. Som tidigare påpekat är det säkrare att använda mysql_insert_id() för att hämta ditt senaste id.



Håll käften med dig, jobbiga unge som förföljer mig på FB med dina fula "slå-sig-i-ansiktet"-smilies.

OnT:
Det säkraste vore att varje gång extrakolla ifall det redan finns innan det ska sparas. Hur du ska bära dig åt kan du fråga besserwissen gadzoox.
Citera
2009-03-03, 00:48
  #9
Medlem
gadzooxs avatar
Citat:
Ursprungligen postat av Enigmium
OnT: Det säkraste vore att varje gång extrakolla ifall det redan finns innan det ska sparas. Hur du ska bära dig åt kan du fråga besserwissen gadzoox.
Varför är det säkrast? Då måste du hålla på med transaktioner och tabellås och crap. Eftersom en select och efterföljande insert per definition aldrig är en atomisk operation och vi ju använder multithreadade system, går det i princip aldrig att vara säker på om något skett mellan två - ur klientens synvinkel - på varandra efterföljande frågor.

Låt DBMS ta hand om numreringen mha auto_increment/identity, det är sånt den är till för.



Edit: Och du är en liten fjortis, du har ingen talan
__________________
Senast redigerad av gadzoox 2009-03-03 kl. 00:51.
Citera
2009-03-03, 07:45
  #10
Medlem
Rospiggs avatar
Yotta, jag hoppas att du lyssnar på rätt personer här. Det alltså följande som är vattentätt även om två personer lägger in sina ordrar samtidigt:


mysql_query("INSERT INTO order2 osv");
$id = mysql_insert_id();


(Jag förutsätter att du även kollar på svaren från funktionerna för att se när något gått galet.)
Citera
2009-03-03, 08:45
  #11
Medlem
Citat:
Ursprungligen postat av Rospigg
(Jag förutsätter att du även kollar på svaren från funktionerna för att se när något gått galet.)

Ja eller alltså om INSERT misslyckas "or die(mysql_error());" så händer ju inte så mycket mer. Kan ju kontrollera sen om $id fått ett värde överhuvudtaget.

Men tycker du jag borde ha mer felkontroll av $id?
Citera
2009-03-03, 08:56
  #12
Medlem
Rospiggs avatar
Citat:
Ursprungligen postat av Yotta
Ja eller alltså om INSERT misslyckas "or die(mysql_error());" så händer ju inte så mycket mer. Kan ju kontrollera sen om $id fått ett värde överhuvudtaget.

Men tycker du jag borde ha mer felkontroll av $id?
Nej, det räcker så.
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in