Pagina 1 van 1
[MySQL en PHPBB] Opvragen waarde ID van ingevoerde regel
Geplaatst: 08 apr 2004, 09:24
door Hans Kamp
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?
Geplaatst: 08 apr 2004, 09:33
door WebSiteNet
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.

Geplaatst: 08 apr 2004, 10:00
door Hans Kamp
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).
Geplaatst: 08 apr 2004, 10:19
door mosymuis
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;
zo selecteer je het laatste id. Komt vast nog eens van pas.

Geplaatst: 08 apr 2004, 11:17
door Hans Kamp
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;
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.
Geplaatst: 08 apr 2004, 11:25
door mosymuis
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.
Geplaatst: 08 apr 2004, 11:39
door Hans Kamp
Normaal ook niet, maar stel dat de bovenstaande gebeurtenissen zeer kort achter elkaar gebeuren, bijna tegelijkertijd (ook door mogelijke multitasking van de MySQL-server)...
Geplaatst: 08 apr 2004, 11:41
door mosymuis
Nogmaals, waarom zou je op die manier een id opvragen? Wat wil je precies bereiken?
Geplaatst: 08 apr 2004, 11:47
door Hans Kamp
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.
Geplaatst: 08 apr 2004, 11:54
door mosymuis
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.
