Wie erhalte ich die zuletzt eingefügte ID einer MySQL-Tabelle in PHP?

93

Ich habe eine Tabelle, in die häufig neue Daten eingefügt werden. Ich muss die allerletzte ID der Tabelle erhalten. Wie kann ich das machen?

Ist es ähnlich SELECT MAX(id) FROM table?

gweg
quelle
1
Ja, diese Abfrage gibt die letzte ID der Tabelle zurück. Eine Bedingung ist jedoch, dass die ID der Primärschlüssel sein muss. So können Sie Reue vermeiden.
Sathish
7
@sathish: Das Hauptproblem dieser Methode ist die Parallelität .
CMS
3
Um es näher zu erläutern: Das Problem dabei ist, dass Sie möglicherweise eine ID erhalten, die nicht Ihre letzte ID ist, wenn jemand anderes etwas in die Tabelle zwischen Ihrer INSERTund der Abfrage einfügt . MAX(id)
Täuschung
3
@ Jocelyn diese Frage wurde ein Jahr später mit Tausenden weniger Ansichten als diese Frage gestellt.
Naftali aka Neal
3
@Neal, du hast recht. Die andere Frage sollte als Duplikat dieser Frage geschlossen werden.
Jocelyn

Antworten:

133

Wenn Sie PDO verwenden, verwenden Sie PDO::lastInsertId.

Wenn Sie Mysqli verwenden, verwenden Sie mysqli::$insert_id.

Wenn Sie immer noch MySQL verwenden:

Bitte verwenden Sie keine mysql_*Funktionen in neuem Code . Sie werden nicht mehr gewartet und sind offiziell veraltet . Sehen Sie die rote Box ? Erfahrenmehr über vorbereitete Anweisungen statt, und verwenden Sie PDO oder MySQLi - dieser Artikel wird Ihnen helfen, entscheidenwelche. Wenn Sie sich für PDO entscheiden, finden Sie hier ein gutes Tutorial .

Aber wenn Sie müssen, verwenden Sie mysql_insert_id.

täuschen
quelle
Das Problem bei diesem ist, dass Sie die falsche ID erhalten können, wenn viele Einfügungen auftreten (z. B. wenn Ihre Datenbank auch etwas protokolliert).
Mike
@ Mike Nicht, wenn Sie mysql_insert_id direkt nach Ihrem verwenden mysql_query. Wenn Sie dazwischen natürlich mehrere andere Abfragen über dieselbe Verbindung ausführen, kann Ihnen dort nichts weiterhelfen.
Täuschung
7
Um sicherzustellen, dass Sie NIEMALS eine falsche ID erhalten, verpacken Sie Ihren Code mit einer TRANSAKTION .
Marcelo Assis
28
mysql stellt sicher, dass dies die letzte ID DER AKTUELLEN VERBINDUNG ist. Es gibt also keine Probleme, wenn Sie diese Anweisung direkt nach der Einfügeabfrage einfügen. Keine Sorge, dass andere Prozesse Einfügungen ausführen. Sie müssen dies nicht in eine Transaktion einschließen. Im MySQL-Handbuch heißt es: "Die generierte ID wird pro Verbindung auf dem Server verwaltet. Dies bedeutet, dass der von der Funktion an einen bestimmten Client zurückgegebene Wert der erste AUTO_INCREMENT-Wert ist, der für die letzte Anweisung generiert wurde, die eine AUTO_INCREMENT-Spalte betrifft von diesem Client . Dies ist der Grund dafür ist , sollten Sie nicht MAX (ID) verwenden , wählen
woens
1
@deceze, was ist mit dieser PDOVoreingenommenheit, die wir überall sehen? Schauen wir uns noch einmal den Funktionsvergleich an. Es ist klar, dass dies mysqlider Gewinner ist, wenn Sie sich die Hände mit Sachen auf niedrigem Niveau schmutzig machen müssen. Mit anderen Worten, selbst wenn man wählt PDO er schließlich müssen verwenden mysqlisowieso.
Pacerier
53

Es gibt eine Funktion, um zu wissen, welche ID zuletzt in die aktuelle Verbindung eingefügt wurde

mysql_query('INSERT INTO FOO(a) VALUES(\'b\')');
$id = mysql_insert_id();

Die Verwendung von max ist eine schlechte Idee, da dies zu Problemen führen kann, wenn Ihr Code gleichzeitig in zwei verschiedenen Sitzungen verwendet wird.

Diese Funktion heißt mysql_insert_id

RageZ
quelle
2
mysql _ (...) ist in der Version PHP> = 5.5 veraltet.
Iago
Ja, ich erinnere mich nur daran. :)
Iago
18

Mit gU :

$pdo->lastInsertId();

Mit Mysqli :

$mysqli->insert_id;

Bitte verwenden Sie keine mysql_*Funktionen in neuem Code . Sie werden nicht mehr gewartet und sind offiziell veraltet . Sehen Sie die rote Box ? Erfahrenmehr über vorbereitete Anweisungen statt, und verwenden Sie PDO oder MySQLi - dieser Artikel wird Ihnen helfen, entscheidenwelche. Wenn Sie sich für PDO entscheiden, finden Sie hier ein gutes Tutorial .

Naftali alias Neal
quelle
8

Was Sie geschrieben haben, würde Ihnen das Beste bringen, idvorausgesetzt, sie sind einzigartig und automatisch inkrementiert. Dies wäre in Ordnung, vorausgesetzt, Sie können Probleme mit der Parallelität einladen.
Da Sie MySQL als Datenbank verwenden, gibt es die spezifische Funktion, LAST_INSERT_ID()die nur für die aktuelle Verbindung funktioniert, die die Einfügung durchgeführt hat.
PHP bietet auch dafür eine spezielle Funktion an mysql_insert_id.

Dlamblin
quelle
6

Versuchen Sie, dies sollte gut funktionieren:

$link = mysqli_connect("localhost", "my_user", "my_password", "world");

$query = "INSERT blah blah blah...";
$result = mysqli_query($link, $query);

echo mysqli_insert_id($link);
Sandhu
quelle
1
Danke, dass du es bemerkst. Ich habe den Code bearbeitet, eigentlich ist es $ link (Variable, die die Verbindung hält)
Sandhu
3

Sie können die zuletzt eingefügte ID über die integrierte PHP-Funktion abrufen mysql_insert_id();

$id = mysql_insert_id();

Sie erhalten auch die neueste ID von

$id = last_insert_id();
Rahul
quelle
4
Dies ist auch falsch, da empfohlen wird, eine veraltete Bibliothek zu verwenden. Wirklich, löschen Sie diese
STT LCU
@STTLCU Welches Snippet hier ist veraltet?
TheBlackBenzKid
@ TheBlackBenzKid beide, weil sie auf mysql_ * -Funktionen basieren
STT LCU
@Rahul $ id = last_insert_id (); funktioniert nicht, da es möglicherweise veraltet ist.
Esha
3

So erhalten Sie die zuletzt eingefügte ID im Codeigniter Verwenden Sie nach dem Ausführen der Einfüge-Abfrage nur eine Funktion, die insert_id()für die Datenbank aufgerufen wird. Sie gibt die zuletzt eingefügte ID zurück

Ex:

$this->db->insert('mytable',$data);
echo $this->db->insert_id(); //returns last inserted id

in einer Zeile

echo $this->db->insert('mytable',$data)->insert_id();
Narsimha
quelle
3

Die Verwendung mysql_insert_id()ist in Ordnung , es gibt jedoch einen speziellen Hinweis zur Verwendung. Sie müssen ihn nach der ausgeführten INSERT-Abfrage aufrufen, dh in derselben Skriptsitzung. Wenn Sie es sonst verwenden, würde es nicht richtig funktionieren.

Mihail Dimitrov
quelle
2

Sauber und einfach -

$selectquery="SELECT id FROM tableName ORDER BY id DESC LIMIT 1";
$result = $mysqli->query($selectquery);
$row = $result->fetch_assoc();
echo $row['id'];
Hitesh
quelle
1

HINWEIS: Wenn Sie mehrere Einfügungen mit einer Anweisung ausführen, ist mysqli :: insert_id nicht korrekt.

Der Tisch:

create table xyz (id int(11) auto_increment, name varchar(255), primary key(id));

Wenn Sie dies tun:

insert into xyz (name) values('one'),('two'),('three');

Die mysqli :: insert_id ist 1 nicht 3.

Um den richtigen Wert zu erhalten, gehen Sie wie folgt vor:

mysqli::insert_id + mysqli::affected_rows) - 1

Dies wurde dokumentiert, ist aber etwas dunkel.

bartonlp
quelle
1

Ich bevorzuge die Verwendung einer reinen MySQL-Syntax, um die letzte auto_increment-ID der gewünschten Tabelle zu erhalten.

php mysql_insert_id () und mysql last_insert_id () geben nur die letzte Transaktions-ID an.

Wenn Sie die letzte automatisch inkrementierte ID einer Tabelle in Ihrem Schema (nicht nur die letzte Transaktion 1) möchten, können Sie diese Abfrage verwenden

SELECT AUTO_INCREMENT FROM information_schema.TABLES
    WHERE TABLE_SCHEMA = 'my_database' 
    AND TABLE_NAME = 'my_table_name';

Das ist es.

syjust
quelle
Ich bin mir nicht sicher, da diese SQL im Kontext der Frage einfach falsch ist. Auch diese Methode ist anfällig für mögliche Rennbedingungen, wenn zwei oder mehr Clients diese SQL ungefähr zur gleichen Zeit ausführen. Ich bin mir nicht sicher Wie schnell diese Spaltendaten nach einer Einfügung aktualisiert werden, was mich zweifelhaft macht. Die PHP-Funktionen, die die letzte ID erhalten können, basieren auf der Verbindungs- / Sitzungsebene (entspricht mehr oder weniger der LAST_INSERT_ID () von MySQL ), wodurch die Race-Bedingungen gespeichert werden
Raymond Nijland,
1

Es ist traurig, keine Antworten mit einem Beispiel zu sehen.

Verwenden von Mysqli :: $ insert_id :

$sql="INSERT INTO table (col1, col2, col3) VALUES (val1, val2, val3)";
$mysqli->query($sql);
$last_inserted_id=$mysqli->insert_id; // returns last ID

Verwenden von PDO :: lastInsertId :

$sql="INSERT INTO table (col1, col2, col3) VALUES (val1, val2, val3)";
$database->query($sql);
$last_inserted_id=$database->lastInsertId(); // returns last ID
Rost
quelle
0

Mit MySQLiTransaktion konnte ich manchmal nicht bekommen mysqli::$insert_id, weil es 0 zurückgab. Besonders wenn ich gespeicherte Prozeduren verwendete, die INSERTs ausführten . Es gibt also einen anderen Weg innerhalb der Transaktion:

<?php

function getInsertId(mysqli &$instance, $enforceQuery = false){
    if(!$enforceQuery)return $instance->insert_id;

    $result = $instance->query('SELECT LAST_INSERT_ID();');

    if($instance->errno)return false;

    list($buffer) = $result->fetch_row();

    $result->free();

    unset($result);

    return $buffer;
}

?>
BlitZ
quelle
0

Verwenden Mysqli als mysql depricating ist

<?php
$mysqli = new mysqli("localhost", "yourUsername", "yourPassword", "yourDB");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}
// Conside employee table with id,name,designation
$query = "INSERT INTO myCity VALUES (NULL, 'Ram', 'Developer')";
$mysqli->query($query);

printf ("New Record has id %d.\n", $mysqli->insert_id);

/* close connection */
$mysqli->close();
?>
Poorna Rao
quelle
0

Ich habe es versucht

mysqli_insert_id ($ dbConnectionObj)

Dies gibt die zuletzt eingefügte ID der aktuellen Verbindung zurück. Wenn Sie Ihre Verbindungen ordnungsgemäß verwalten, sollte dies funktionieren. Hat zumindest für mich gearbeitet.

user2166373
quelle
0

Bitte verwenden Sie PDP und versuchen Sie dies dann

$stmt = $db->prepare("...");
$stmt->execute();
$id = $db->lastInsertId();
Humphrey
quelle
-1

$ lastid = mysql_insert_id ();

Treby
quelle
-1

Bei all diesen Diskussionen gehe ich davon aus, dass der Grund für die Überprüfung der maximalen ID darin besteht, zu wissen, welche ID als nächstes kommen soll. (Wenn meine maximale ID 5 ist, ist der nächste 5 + 1 = 6).

>> Wenn dies nicht der Grund ist, entschuldige ich mich am besten

Wenn jemand anderes Informationen zwischen Ihrem CHECK und INSERT einfügt, erhalten Sie eine falsche ID.

Es kann also gelöst werden, wenn Sie einen Hash erstellen, der einen Zeitstempel oder einen anderen eindeutigen Wert enthält.

Dann können Sie in derselben Funktion Ihre Informationen mit leeren Werten und Ihrem Hash einfügen. Das würde eine ID erstellen, wenn Sie AUTO_INCRECEMENT ausgewählt haben.

Dann hätten Sie in derselben Funktion immer noch Ihren Hash und könnten nach einer ID mit demselben Hash suchen. Und dann können Sie das Auffüllen leerer Werte mit mysql UPDATE abschließen.

Dies beinhaltet ein bisschen mehr Verbindungen, aber es ist immer noch eine Möglichkeit, dies zu tun ...

Viel Glück beim Lösen.

Aurimas
quelle
-2

Wenn Ihre Tabelle eine AUTO INCREMENT-Spalte wie UserID, Emp_ID, .. hat, können Sie diese Abfrage verwenden, um den zuletzt eingefügten Datensatz SELECT * FROM table_name abzurufen, wobei UserID = (wählen Sie MAX (UserID) aus table_name). Im PHP-Code:

$con = mysqli_connect('localhost', 'userid', 'password', 'database_name');
                                if (!$con) {
                                    die('Could not connect: ' . mysqli_error($con));
                                }
                                $sql = "SELECT * FROM table_name where UserID=(select MAX(UserID)from table_name)";
                                $result = mysqli_query($con, $sql);

Dann können Sie abgerufene Daten als Ihre Anforderung verwenden

Naveen1425
quelle
Verschlüsseln Sie keine Passwörter . Wenn der Angreifer die Datenbank erhält, erhält er auch den Verschlüsselungsschlüssel.
Zaph
-3
mysql_query("INSERT INTO mytable (product) values ('kossu')");

printf("Last inserted record has id %d\n", ***mysql_insert_id()***);
khamar Balkrishna
quelle