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

Heeft iemand enig idee wat ik fout doe?
Laat de daadwerkelijke code eens zien.
/ SCHERMGEGEVSNS OPSLAAN in DB -----------------------------------------------
if (isset($_POST['opslaan'])) {
$id = $_SESSION['id'];
$aanspreek = $_POST['aanspreek'];
$voornaam = ucfirst($_POST['voornaam']);
$voorletters = strtoupper($_POST['voorletters']);
$tussenvoeg = strtolower($_POST['tussenvoeg']);
$achternaam = ucfirst($_POST['achternaam']);
$straat = ucwords($_POST['straat']);
$postcode = strtoupper($_POST['postcode']);
$plaats = strtoupper($_POST['plaats']);
$telefoon = $_POST['telefoon'];
$mobiel = $_POST['mobiel'];
$email = $_POST['email'];
$gebdat = $_POST['gebdat'];
$categorie = ucfirst($_POST['categorie']);
$opmerking = $_POST['opmerking'];
$qInsert = " insert into naw
( aanspreek, voornaam, voorletters, tussenvoeg,
achternaam, straat, postcode, plaats, telefoon, mobiel,
email, gebdat, categorie, opmerking ) values
( '$aanspreek', '$voornaam', '$voorletters',
'$tussenvoeg', '$achternaam', '$straat', '$postcode',
'$plaats', '$telefoon', $mobiel', '$email', '$gebdat',
'$categorie', '$opmerking' ) ";
$qUpdate = " update naw set
aanspreek='$aanspreek', voornaam='$voornaam', voorletters='$voorletters',
tussenvoeg='$tussenvoeg', achternaam='$achternaam', straat='$straat',
postcode='$postcode', plaats='$plaats', telefoon='$telefoon',
mobiel='$mobiel', email='$email', gebdat='$gebdat',
categorie='$categorie', opmerking='$opmerking'
where id='$id' ";
$db = openDB();
if ($id === 9999)
$p = $db->query($qInsert);
else
$p = $db->query($qUpdate);
$id = $db->insert_id;
$db->close();
print $id;
}
Doe eens een echo $_SESSION['id'];
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.
01073Gewoon nul
01069Gewoon nul
09999Gewoon nul

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'.
Ik zou het zo even niet weten.
Zeker de INSERT zou het insert_id moeten teruggeven.
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;
}

En het werkt!
Nogmaals erg bedankt!

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.
Probeer het eens zo :



$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.

Reageren