Veld met auto_increment

Status
Niet open voor verdere reacties.

raymond88

Gebruiker
Lid geworden
24 feb 2010
Berichten
287
Ik heb bijv. een locatie die ik wil toevoegen via een CMS. Die locatie krijgt een automatisch id, via de database (die staat immers op auto_increment). Nou wil ik echter als ik die toevoeg via het CMS, het ID te weten komen van deze locatie die ik zoejuist heb toegevoegd. Ik moet namelijk nog iets in een andere tabel zetten, waarbij ik dit ID nodig heb.

Wat ik nu heb is een query uitvoeren, maar kan dit niet op een nettere manier?!
 
of het helemaal correct is weet ik niet maar:

PHP:
$id = mysql_insert_id();

//daarna

echo $id;

Of voer je er gelijk iets achteraan uit???
 
Of via MySQL zelf door middel van de functie LAST_INSERT_ID()
[sql]
INSERT INTO tabel (
id,
veld1
) VALUES (
LAST_INSERT_ID(),
'Waarde1'
);
[/sql]
 
Nou, ik heb dan een locatie tabel, en een link tabel. Als ik dan een locatie toevoeg die een id krijg, moet ik nog iets toevoegen aan de link tabel. Dan moet ik dus eerst de last insert van locatie pakken? Want last_insert zal denk ik niet werken voor de link tabel, aangezien ik van locatie die id wil hebben. Moet het dan zoiets zijn;

PHP:
mysql_query("SELECT LAST_INSERT_ID() FROM link")
			or die(mysql_error());

Ik heb echter ook een functie gevonden, die ik waarschijnlijk ook gebruiken kan (misschien mooier denk ik zo);

PHP:
function get_current_insert_id($table) {
    $q = "SELECT LAST_INSERT_ID() FROM $table";
    return mysql_num_rows(mysql_query($q)) + 1;
}

Iemand die me hierbij kan adviseren verder, naar aanleiding van bovenstaand?
 
Die tweede is niet betrouwbaar, want je hoeft niet perse ID+1 te krijgen, als er meerdere processen zijn kan het ook best een keer ID+2 of ID+3 zijn en dan krijg je rare dingen in je database.

Ga uit van LAST_INSERT_ID in SQL en van mysql_insert_id() in PHP, dat zijn de enige functies waar je op kunt vertrouwen, en die kun je allebei pas aanroepen na de insert, want dat is pas het punt waar je echt weet welke ID je krijgt.
 
Dus je/ ik krijg(t) dan zoiets neem ik aan?

PHP:
	mysql_query("INSERT INTO locatie (id, bablablabla)
				VALUES ('', 'bablablabla' )")
	or die(mysql_error()); 
	$query = mysql_query("SELECT LAST_INSERT_ID() FROM locatie")
            or die(mysql_error());
	$result = mysql_query($query) or die(mysql_error());
	$row = mysql_fetch_assoc($result);
	$id = $row['id'];

	mysql_query("INSERT INTO link (id, veld1) 
				VALUES ('$id', 'waarde1' )")
	or die(mysql_error());
 
Je voert nu een query uit, en daarna probeer je de result variabele nog een keer uit te voeren, dat gaat niet werken :)

Verder is het volgensmij goed.

EDIT: Behalve misschien de veldnaam, die is waarschijnlijk niet 'id' tenzij je hem hernoemt.
 
last_insert_id() geeft het id van de laatste query die je hebt uitgevoert. De tabelnaam heeft er verder niets mee te maken, dus je kunt de functie rechtstreeks gebruiken - óók als je in de tweede query iets in een andere tabel stopt:
PHP:
mysql_query("insert into een (kolom) values ('waarde')");
mysql_query("insert into twee (kolom) values (LAST_INSERT_ID())");
 
Je voert nu een query uit, en daarna probeer je de result variabele nog een keer uit te voeren, dat gaat niet werken :)

Verder is het volgensmij goed.

EDIT: Behalve misschien de veldnaam, die is waarschijnlijk niet 'id' tenzij je hem hernoemt.

Ja klopt, ik was even met meerdere/ andere dingen bezig.

@flitsflitsflits, ok. Dat is kristalhelder. Bedankt.
 
Nou kom ik echter op het volgende probleempje, ik heb deze query, maar die staat in een foreach loop, omdat ik meerdere dingen zou kunnen gaan zetten (het kan namelijk 1 ding zijn, maar ook 688). Hoe kan ik dat dan weer oplossen? Hij doet nu namelijk voor het eerste ding de goede, maar voor de volgende allemaal niet (daar pakt ie dus de ID van de tabel waar ik dingen in moet zetten...).
 
Insert je maar 1x een rij en wil je dat ID bewaren? Want dan moet je het opvragen van de last_insert_id boven de loop zetten, en iedere keer dezelfde waarde gebruiken zonder hem opnieuw op te vragen.
 
Dat kan, je vorige oplossing zou ook werken. Zolang je het maar boven de loop zet en niet er in.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan