mysqli::$insert_id

mysqli_insert_id

(PHP 5, PHP 7, PHP 8)

mysqli::$insert_id -- mysqli_insert_idLiefert den Wert, der bei der letzten Anweisung für die AUTO_INCREMENT-Spalte erzeugt wurde

Beschreibung

Objektorientierter Stil

int|string $mysqli->insert_id;

Prozeduraler Stil

mysqli_insert_id(mysqli $mysql): int|string

Gibt die ID zurück, die durch eine INSERT- oder UPDATE-Anweisung für eine Tabelle mit einer Spalte mit dem Attribut AUTO_INCREMENT erzeugt wurde. Im Fall einer INSERT-Anweisung für mehrere Zeilen, wird der erste automatisch erzeugte Wert zurückgegeben, der erfolgreich eingefügt wurde.

Wenn eine INSERT- oder UPDATE-Anweisung mit der MySQL-Funktion LAST_INSERT_ID() ausgeführt wird, wird auch der von mysqli_insert_id() zurückgegebene Wert geändert. Wenn LAST_INSERT_ID(expr) verwendet wurde, um den Wert von AUTO_INCREMENT zu erzeugen, wird der Wert des letzten Ausdrucks expr anstelle des erzeugten AUTO_INCREMENT-Werts zurückgegeben.

Gibt 0 zurück, wenn die vorherige Anweisung einen AUTO_INCREMENT-Wert nicht verändert hat. mysqli_insert_id() muss unmittelbar nach der Anweisung aufgerufen werden, die den Wert erzeugt hat.

Parameter-Liste

mysql

Nur bei prozeduralem Aufruf: ein von mysqli_connect() oder mysqli_init() zurückgegebenes mysqli-Objekt.

Rückgabewerte

Gibt den Wert der AUTO_INCREMENT-Spalte zurück, die durch die vorherige Anweisung aktualisiert wurde. Gibt Null zurück, wenn es keine vorherige Anweisung für die Verbindung gab oder wenn die Anweisung keinen AUTO_INCREMENT-Wert aktualisiert hat.

Nur Anweisungen, die über die aktuelle Verbindung gesendet werden, beeinflussen den Rückgabewert. Der Wert wird nicht von Anweisungen beeinflusst, die über andere Verbindungen oder Clients ausgegeben werden.

Hinweis:

Wenn die Zahl größer ist als der maximale int-Wert, wird sie als Zeichenkette zurückgegeben.

Beispiele

Beispiel #1 $mysqli->insert_id-Beispiel

Objektorientierter Stil

<?php

mysqli_report
(MYSQLI_REPORT_ERROR MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost""my_user""my_password""world");

$mysqli->query("CREATE TABLE myCity LIKE City");

$query "INSERT INTO myCity VALUES (NULL, 'Stuttgart', 'DEU', 'Stuttgart', 617000)";
$mysqli->query($query);

printf("Der neue Datensatz hat die ID %d.\n"$mysqli->insert_id);

/* Tabelle löschen */
$mysqli->query("DROP TABLE myCity");

Prozeduraler Stil

<?php

mysqli_report
(MYSQLI_REPORT_ERROR MYSQLI_REPORT_STRICT);
$link mysqli_connect("localhost""my_user""my_password""world");

mysqli_query($link"CREATE TABLE myCity LIKE City");

$query "INSERT INTO myCity VALUES (NULL, 'Stuttgart', 'DEU', 'Stuttgart', 617000)";
mysqli_query($link$query);

printf("Der neue Datensatz hat die ID %d.\n"mysqli_insert_id($link));

/* Tabelle löschen */
mysqli_query($link"DROP TABLE myCity");

Die obigen Bespiele erzeugen folgende Ausgabe:

Der neue Datensatz hat die ID 1.
add a note add a note

User Contributed Notes 8 notes

up
45
will at phpfever dot com
16 years ago
I have received many statements that the insert_id property has a bug because it "works sometimes".  Keep in mind that when using the OOP approach, the actual instantiation of the mysqli class will hold the insert_id. 

The following code will return nothing.
<?php
$mysqli
= new mysqli('host','user','pass','db');
if (
$result = $mysqli->query("INSERT INTO t (field) VALUES ('value');")) {
   echo
'The ID is: '.$result->insert_id;
}
?>

This is because the insert_id property doesn't belong to the result, but rather the actual mysqli class.  This would work:

<?php
$mysqli
= new mysqli('host','user','pass','db');
if (
$result = $mysqli->query("INSERT INTO t (field) VALUES ('value');")) {
   echo
'The ID is: '.$mysqli->insert_id;
}
?>
up
1
mmulej at gmail dot com
1 year ago
There has been no examples with prepared statements yet.

```php
$u_name = "John Doe";
$u_email = "johndoe@example.com";

$stmt = $connection->prepare(
    "INSERT INTO users (name, email) VALUES (?, ?)"
);
$stmt->bind_param('ss', $u_name, $u_email);
$stmt->execute();

echo $stmt->insert_id;
```

For UPDATE you simply change query string and binding parameters accordingly, the rest stays the same.

Of course the table needs to have AUTOINCREMENT PRIMARY KEY.
up
1
www dot wesley at gmail dot com
3 years ago
When using "INSERT ... ON DUPLICATE KEY UPDATE `id` = LAST_INSERT_ID(`id`)", the AUTO_INCREMENT will increase in an InnoDB table, but not in a MyISAM table.
up
4
alan at commondream dot net
18 years ago
I was having problems with getting the inserted id, and did a bit of testing. It ended up that if you commit a transaction before getting the last inserted id, it returns 0 every time, but if you get the last inserted id before committing the transaction, you get the correct value.
up
3
bert at nospam thinc dot nl
14 years ago
Watch out for the oo-style use of $db->insert_id. When the insert_id exceeds 2^31 (2147483648) fetching the insert id renders a wrong, too large number. You better use the procedural mysqli_insert_id( $db ) instead.

[EDIT by danbrown AT php DOT net: This is another prime example of the limits of 32-bit signed integers.]
up
1
Nick Baicoianu
15 years ago
When running extended inserts on a table with an AUTO_INCREMENT field, the value of mysqli_insert_id() will equal the value of the *first* row inserted, not the last, as you might expect.

<?
//mytable has an auto_increment field
$db->query("INSERT INTO mytable (field1,field2,field3) VALUES ('val1','val2','val3'),
('val1','val2','val3'),
('val1','val2','val3')");

echo $db->insert_id; //will echo the id of the FIRST row inserted
?>
up
-5
owenzx at gmail dot com
9 years ago
The example is lack of insert_id in multi_query. Here is my example:
Assuming you have a new test_db in mysql like this:

create database if not exists test_db;
use test_db;
create table user_info (_id serial, name varchar(100) not null);
create table house_info (_id serial, address varchar(100) not null);

Then you run a php file like this:

<?php
define
('SERVER', '127.0.01');
define('MYSQL_USER', 'your_user_name');
define('MYSQL_PASSWORD', 'your_password');

$db = new mysqli(SERVER, MYSQL_USER, MYSQL_PASSWORD, "test_db", 3306);
if (
$db->connect_errno)
  echo
"create db failed, error is ", $db->connect_error;
else {
 
$sql = "insert into user_info "
   
. "(name) values "
   
. "('owen'), ('john'), ('lily')";
  if (!
$result = $db->query($sql))
    echo
"insert failed, error: ", $db->error;
  else
    echo
"last insert id in query is ", $db->insert_id, "\n";
 
$sql = "insert into user_info"
   
. "(name) values "
   
. "('jim');";
 
$sql .= "insert into house_info "
   
. "(address) values "
   
. "('shenyang')";
  if (!
$db->multi_query($sql))
    echo
"insert failed in multi_query, error: ", $db->error;
  else {
    echo
"last insert id in first multi_query is ", $db->insert_id, "\n";
    if (
$db->more_results() && $db->next_result())
      echo
"last insert id in second multi_query is ", $db->insert_id, "\n";
    else
      echo
"insert failed in multi_query, second query error is ", $db->error;
  }
 
$db->close();
}
?>

You will get output like this:

last insert id in query is 1
last insert id in first multi_query is 4
last insert id in second multi_query is 1

Conclusion:
1 insert_id works in multi_query
2 insert_id is the first id mysql has used if you have insert multi values
up
-7
drburnett at mail dot com
5 years ago
msqli_insert_id();
This seems to return that last id entered.
BUT,  if you have multiple users running the same code, depending on the server or processor I have seen it return the wrong id.

Test Case:
Two users added an item to their list.
I have had a few times where the id was the id from the other user.
This is very very rare and it only happens on my test server and not my main server.

I am guessing it is because of multicores (maybe hyperthreading) or how the operating system handles multi-threads.

It is rare, but it happens.
To Top