[MySQL en PHPBB] Opvragen waarde ID van ingevoerde regel

Hulp nodig bij een modificaties of op zoek naar een MOD? Bekijk ons archief. Support wordt helaas niet meer verleend.
Forumregels

Sinds 1 januari 2009 wordt phpBB2 niet meer ondersteund.
Onderstaande informatie is verouderd en dient uitsluitend als archief.
phpBB2.0.x
Gesloten
Hans Kamp
Berichten: 470
Lid geworden op: 17 jan 2004, 08:39
Locatie: Enschede

[MySQL en PHPBB] Opvragen waarde ID van ingevoerde regel

Bericht door Hans Kamp » 08 apr 2004, 09:24

Stel ik heb een tabel die ik als volgt gecreeerd heb:

Code: Selecteer alles

CREATE TABLE `test` (
`id` INT NOT NULL AUTO_INCREMENT ,
`naam` VARCHAR( 255 ) NOT NULL ,
PRIMARY KEY ( `id` ) 
);
En ik wil een naam toevoegen:

Code: Selecteer alles

INSERT INTO `test` ( `id` , `naam` ) VALUES ('', 'Hans');
dan wordt voor het veld id een lege waarde ingevoerd, maar bij een SELECT-opdracht krijg je voor id een oplopende nummer. Nu is mijn vraag: hoe weet je wat het nummer is bij de laatst-gebruikte INSERT-opdracht, en hoe vraag je dat op in PHP?

Code: Selecteer alles

$sql = "INSERT INTO test (id,naam) VALUES ('', 'Hans')";
$result = $db->sql_quary($sql);

if (!$result)
{
    message_die(GENERAL_ERROR, 'Could not insert topic watch information', '', __LINE__, __FILE__, $sql);
}

$row = $db->sql_fetchrow($result);
En dan met $row["id"] de waarde id opvragen voor het laatste veld. Geen idee of dat kan... Of moet ik een SELECT doen met de waarden (bij WHERE) die ik bij de INSERT heb ingevuld?

Gebruikersavatar
WebSiteNet
Berichten: 6524
Lid geworden op: 20 okt 2003, 16:56
Locatie: Wieringerwerf
Contacteer:

Bericht door WebSiteNet » 08 apr 2004, 09:33

Je moet de id dan query'en (nieuw werkwoord :) ) met de naam hans. En die insert into query kan beter:

INSERT INTO test ( naam ) VALUES ('Hans');
Ik gebruik zelf nooit back quotes omdat im dat verspilde moeite vind om ze in te typen. :)

Hans Kamp
Berichten: 470
Lid geworden op: 17 jan 2004, 08:39
Locatie: Enschede

Bericht door Hans Kamp » 08 apr 2004, 10:00

Bedankt. Ik zat al in die richting te denken, maar ik had gehoopt dat een SELECT niet nodig was geweest (maar dat is het dus toch).

Wat die backquotes betreft heb je gelijk. Een gedeelte van de bovenstaande code is gegenereerd door phpmyadmin (ik weet overigens niet waarom phpmyadmin die backquotes genereert).

Gebruikersavatar
mosymuis
Berichten: 6940
Lid geworden op: 05 feb 2003, 14:00
Locatie: Amsterdam
Contacteer:

Bericht door mosymuis » 08 apr 2004, 10:19

Website heeft gelijk; je moet primary ID's nooit zelf ingeven omdat die kolommen bijna altijd de auto_increment eigenschap hebben. MySQL vult ze dan dus voor je in. Maar om toch nog even antwoord te geven op je originele vraag;

Code: Selecteer alles

SELECT max(id) AS last_id
FROM test;
zo selecteer je het laatste id. Komt vast nog eens van pas. ;)

Hans Kamp
Berichten: 470
Lid geworden op: 17 jan 2004, 08:39
Locatie: Enschede

Bericht door Hans Kamp » 08 apr 2004, 11:17

mosymuis schreef:Website heeft gelijk; je moet primary ID's nooit zelf ingeven omdat die kolommen bijna altijd de auto_increment eigenschap hebben. MySQL vult ze dan dus voor je in. Maar om toch nog even antwoord te geven op je originele vraag;

Code: Selecteer alles

SELECT max(id) AS last_id
FROM test;
zo selecteer je het laatste id. Komt vast nog eens van pas. ;)
Dat klopt, want ik probeer zelf een mod te schrijven. Maar is deze methode echt veilig (ik denk dat de methode van WebSiteNet veiliger is)? Ik twijfel vanwege het mogelijke scenario:

1. Gebruiker A maakt een regel met id = 25 (INSERT).
2. Gebruiker B maakt een regel met id = 26 (INSERT).
3. Gebruiker A vraagt regel op van het laatst ingevoegde regel (SELECT). max(id) is dan niet 25 maar 26, dus gebruiker A krijgt de regel waar hij niet om gevraagd heeft.

Gebruikersavatar
mosymuis
Berichten: 6940
Lid geworden op: 05 feb 2003, 14:00
Locatie: Amsterdam
Contacteer:

Bericht door mosymuis » 08 apr 2004, 11:25

Hans Kamp schreef:3. Gebruiker A vraagt regel op van het laatst ingevoegde regel (SELECT). max(id) is dan niet 25 maar 26, dus gebruiker A krijgt de regel waar hij niet om gevraagd heeft.
Waarom zou je op die manier een id opvragen, natuurlijk werkt dat dan niet. Daar is deze functie ook niet voor bedoeld.

Hans Kamp
Berichten: 470
Lid geworden op: 17 jan 2004, 08:39
Locatie: Enschede

Bericht door Hans Kamp » 08 apr 2004, 11:39

Normaal ook niet, maar stel dat de bovenstaande gebeurtenissen zeer kort achter elkaar gebeuren, bijna tegelijkertijd (ook door mogelijke multitasking van de MySQL-server)...

Gebruikersavatar
mosymuis
Berichten: 6940
Lid geworden op: 05 feb 2003, 14:00
Locatie: Amsterdam
Contacteer:

Bericht door mosymuis » 08 apr 2004, 11:41

Nogmaals, waarom zou je op die manier een id opvragen? Wat wil je precies bereiken?

Hans Kamp
Berichten: 470
Lid geworden op: 17 jan 2004, 08:39
Locatie: Enschede

Bericht door Hans Kamp » 08 apr 2004, 11:47

mosymuis schreef:Nogmaals, waarom zou je op die manier een id opvragen? Wat wil je precies bereiken?
Om een lang verhaal kort te maken: Ik wil een regel toevoegen en ik wil weten met welk id dat is gebeurt (aangezien het invullen van het id automatisch gaat, auto_increment). Eigenlijk gaf WebSiteNet al een bevredigend antwoord op mijn vraag.

Gebruikersavatar
mosymuis
Berichten: 6940
Lid geworden op: 05 feb 2003, 14:00
Locatie: Amsterdam
Contacteer:

Bericht door mosymuis » 08 apr 2004, 11:54

Hans Kamp schreef:Eigenlijk gaf WebSiteNet al een bevredigend antwoord op mijn vraag.
Ik zei ook al dat hij het goede antwoord was, dat van mij was gewoon een toelichting. ;)

Gesloten