W3Schools zegt:
If we perform an INSERT or UPDATE on a table with an AUTO_INCREMENT field, we can get the ID of the last inserted/updated record immediately: $last_id = $conn->insert_id;
Mijn testcode wordt dan :
$db = openDB(); // OO-functie de db-connectie afhandelt, werkt foutloos
if ($pid === 9999) $p = $db->query($qInsert); // zonder pid
else $p = $db->query($qUpdate); // met de optie WHERE pid='$pid'
$pid = $db->insert_id; // ZOU in allebei de gevallen de laatste AI-waarde moeten geven ?
$db->close();
print $pid; // geeft 0 dus waarschijnlijk NULL
01037
print $id = 0
print $_SESSION['id'] = 1037 (bestaand record)
Het bestaande record wordt ook netjes gewijzigd.
Dus MySQLI lijkt verder foutloos verlopen.
09999
print $id = 0
print $_SESSION['id'] = 9999 (aanduiding voor nieuw record dat nog een AI moet krijgen)
Maak van die print $id eens dit:
<?php
print ($id === NULL) ? 'NULL' : 'Gewoon nul';
?>
The mysqli_insert_id() function returns the ID generated by a query on a table with a column having the AUTO_INCREMENT attribute. If the last query wasn't an INSERT or UPDATE statement or if the modified table does not have a column with the AUTO_INCREMENT attribute, this function will return zero.
De kolom id heeft wel degelijk een A_I status en is primaire sleutel.
Zou het helpen om bij het opslaan wél de id dan wel een explicite NULL mee te geven?
Update: nee, dat maakt niets uit.
Overigens is deze code, op het insert_id en OO verandering na, al meer dan 15 jaar tot volle tevredenheid in gebruik. De reden om insert_id toe te voegen is om de gelegenheid te hebben onvolledige records in te voegen. Voorheen zocht ik de laaste gewoon opnieuw op met SELECT op 'voornaam' 'achternaam' en 'plaats'.
Dank voor je inspanning.
Normaliter zoek ik al gauw een omweg als ik een probleem niet snap.
Maar die zag ik nu even niet voor de hand liggen.
Wat ik me nu net bedenk is het volgende:
function getMaxAI() {
$db = openDB();
$p = $db->query(" select * from naw order by id desc ");
$row = $p->fetch_row(); // dat is het record met 9999
$row = $p->fetch_row();
$id=$row[0];
$db->close();
return $id;
}
Ehm nee, niet doen. Je kan er niet vanuit gaan dat je dan het juiste id krijgt. De enige correcte manier na een insert is insert_id gebruiken, en bij een update weet je deze al.
$db = openDB(); // OO-functie de db-connectie afhandelt, werkt foutloos
if ($pid === 9999) {
$p = $db->query($qInsert); // zonder pid
$pid = $db->insert_id; // ZOU in allebei de gevallen de laatste AI-waarde moeten geven ?
}
else $p = $db->query($qUpdate); // met de optie WHERE pid='$pid'
$db->close();
print $pid; // geeft 0 dus waarschijnlijk NULL
Volgens mij werkt insert_id niet bij een update omdat daarbij de update al bestaat.