PHP / MySQL-Zeile einfügen und dann 'id' erhalten


192

Das 'id'-Feld meiner Tabelle wird automatisch vergrößert, wenn ich eine Zeile einfüge. Ich möchte eine Zeile einfügen und dann diese ID erhalten.

Ich würde es so machen, wie ich es gesagt habe, aber gibt es eine Möglichkeit, es zu tun, ohne mir Gedanken über die Zeit zwischen dem Einfügen der Zeile und dem Abrufen der ID zu machen?

Ich weiß, dass ich die Datenbank nach der Zeile abfragen kann, die mit den eingegebenen Informationen übereinstimmt, aber es gibt eine große Änderung, dass es Duplikate gibt, mit dem einzigen Unterschied, dass es sich um die ID handelt.

Antworten:


255
$link = mysqli_connect('127.0.0.1', 'my_user', 'my_pass', 'my_db');
mysqli_query($link, "INSERT INTO mytable (1, 2, 3, 'blah')");
$id = mysqli_insert_id($link);

Siehe mysqli_insert_id().

Was auch immer Sie tun, fügen Sie nicht ein und machen Sie dann ein " SELECT MAX(id) FROM mytable". Wie Sie sagen, es ist eine Rennbedingung und es gibt keine Notwendigkeit. mysqli_insert_id()hat bereits diese Funktionalität.


58
Das PDO-Äquivalent ist PDO :: lastInsertId ( us3.php.net/manual/en/pdo.lastinsertid.php ).
Matthew Flaschen

11
Funktioniert es immer noch, wenn 10000 asynchrone Einfügungen gleichzeitig ausgeführt werden?
zie1ony

16
@ zie1ony Ja, es würde für eine Million asynchrone Einfügungen funktionieren, da MySQL ACID-kompatibel ist. Jede einzelne Einfügung aus den vielen asynchronen Einfügungen befindet sich in einer eigenen isolierten Sitzung. Hierher kommt die ID, wenn Sie mysql_insert_id () von Ihrem PHP (oder LAST_INSERT_ID () in MySQL)
aufrufen

7
Auf dem Dokument gibt es etwas zu beachten: mysql_insert_id() will convert the return type of the native MySQL C API function mysql_insert_id() to a type of long (named int in PHP). If your AUTO_INCREMENT column has a column type of BIGINT (64 bits) the conversion may result in an incorrect value. Instead, use the internal MySQL SQL function LAST_INSERT_ID() in an SQL query. For more information about PHP's maximum integer values, please see the integer documentation.\
Elbek

7
Ich muss alles umschreiben, was ich jemals geschrieben habe -_-
de_nuit

39

Die MySQL-Funktion LAST_INSERT_ID()macht genau das, was Sie brauchen: Sie ruft die ID ab, die während dieser Sitzung eingefügt wurde . Die Verwendung ist daher sicher, auch wenn andere Prozesse (z. B. andere Personen, die genau dasselbe Skript aufrufen) Werte in dieselbe Tabelle einfügen.

Die PHP-Funktion mysql_insert_id()funktioniert genauso wie das Aufrufen SELECT LAST_INSERT_ID()mit mysql_query().


2
NB echo mysql_insert_id(); mysql_query('SELECT LAST_INSERT_ID(600)'); echo mysql_insert_id(); mysql_query('SELECT LAST_INSERT_ID()'); Die zweite mysql_insert_id()spiegelt nicht 600 wider, wo auch mysql_query('SELECT LAST_INSERT_ID()')immer. Um mysql_insert_id()die Änderung widerzuspiegeln, müssen Sie zuerst eine Einfügung oder ein Update durchführen (was sich auf 0 Zeilen auswirken kann). Siehe den allerletzten Absatz von: http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id
Cliffordlife

28

Auf der PHP-Website ist mysql_insert_id jetzt veraltet und wir müssen PDO verwenden. Gehen Sie dazu wie folgt vor:

$db = new PDO('mysql:dbname=database;host=localhost', 'user', 'pass');
$statement = $db->prepare('INSERT INTO people(name, city) VALUES(:name, :city)');
$statement->execute( array(':name' => 'Bob', ':city' => 'Montreal') );

echo $db->lastInsertId();

4
Wir haben die Möglichkeit, entweder PDO oder MySQLi zu verwenden (was ich hier in einer anderen Antwort beschreibe). Ein guter Vergleich: code.tutsplus.com/tutorials/…
Luke

20

Wie @NaturalBornCamper sagte, ist mysql_insert_id jetzt veraltet und sollte nicht verwendet werden. Sie können jetzt entweder PDO oder mysqli verwenden. NaturalBornCamper erklärte PDO in seiner Antwort, daher werde ich zeigen, wie es mit MySQLi ( MySQL Improved ) unter Verwendung von mysqli_insert_id gemacht wird .

// First, connect to your database with the usual info...
$db = new mysqli($hostname, $username, $password, $databaseName);
// Let's assume we have a table called 'people' which has a column
// called 'people_id' which is the PK and is auto-incremented...
$db->query("INSERT INTO people (people_name) VALUES ('Mr. X')");
// We've now entered in a new row, which has automatically been 
// given a new people_id. We can get it simply with:
$lastInsertedPeopleId = $db->insert_id;
// OR
$lastInsertedPeopleId = mysqli_insert_id($db);

Weitere Beispiele finden Sie in der PHP-Dokumentation: http://php.net/manual/en/mysqli.insert-id.php


Danke, dass du das verstanden hast. Ich bevorzuge die Punktnotation von Javascript gegenüber der Pfeilnotation von PHP. : /
Luke

7

Ich möchte nur ein kleines Detail hinzufügen lastInsertId();

Wenn Sie mehr als eine Zeile gleichzeitig eingeben , wird nicht die letzte ID zurückgegeben , sondern die erste ID der Sammlung der letzten Einfügungen.

Betrachten Sie das folgende Beispiel

$sql = 'INSERT INTO my_table (varNumb,userid) VALUES
     (1, :userid),
     (2, :userid)';
$sql->addNewNames = $db->prepare($sql);
addNewNames->execute(array(':userid' => $userid));

echo $db->lastInsertId();

Was hier passiert ist, dass ich my_tablezwei neue Zeilen einschiebe. Die ID der Tabelle wird automatisch erhöht. Hier füge ich für denselben Benutzer zwei Zeilen mit einer anderen hinzu varNumb.

Der Echo-Wert am Ende entspricht der ID der Zeile where varNumb=1, dh nicht der ID der letzten Zeile, sondern der ID der ersten Zeile, die in der letzten Anforderung hinzugefügt wurde.


Halten Sie sich an jeweils eine Operation - scheint die allgemeine Antwort für alle verwendeten Methoden zu sein, um unerwartete Verhaltensweisen zu vermeiden
RozzA

1

Ein Beispiel.

    $query_new = "INSERT INTO students(courseid, coursename) VALUES ('', ?)";
    $query_new = $databaseConnection->prepare($query_new);
    $query_new->bind_param('s', $_POST['coursename']);
    $query_new->execute();
    $course_id = $query_new->insert_id;
    $query_new->close();

In der Codezeile $course_id = $query_new->insert_id;wird die ID der zuletzt eingefügten Zeile angezeigt. Hoffe das hilft.


1

Versuchen Sie so, Sie können die Antwort bekommen:

<?php
$con=mysqli_connect("localhost","root","","new");
// Check connection
if (mysqli_connect_errno())
  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }

mysqli_query($con,"INSERT INTO new values('nameuser','2015-09-12')");

// Print auto-generated id
echo "New record has id: " . mysqli_insert_id($con);

mysqli_close($con);
?>

Schauen Sie sich folgende Links an:

http://www.w3schools.com/php/func_mysqli_insert_id.asp

http://php.net/manual/en/function.mysql-insert-id.php

Bitte beachten Sie auch, dass diese Erweiterung in PHP 5.5 veraltet und in PHP 7.0 entfernt wurde



0

Versuchen Sie das ... es hat bei mir funktioniert!

$sql = "INSERT INTO tablename (row_name) VALUES('$row_value')";
    if (mysqli_query($conn, $sql)) {
    $last_id = mysqli_insert_id($conn);
    $msg1 = "New record created successfully. Last inserted ID is: " . $last_id;
} else {
    $msg_error = "Error: " . $sql . "<br>" . mysqli_error($conn);
    }

-1

Eine andere mögliche Antwort wird sein:

Wenn Sie die Tabelle definieren, mit den Spalten und Daten, die sie haben wird. Die Spalten-ID kann die Eigenschaft AUTO_INCREMENT haben .

Bei dieser Methode müssen Sie sich keine Gedanken über die ID machen , sie wird automatisch erstellt .

Zum Beispiel (aus w3schools )

CREATE TABLE Persons
(
ID int NOT NULL AUTO_INCREMENT,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (ID)
)

Hoffe das wird für jemanden hilfreich sein.

Bearbeiten: Dies ist nur der Teil, in dem Sie definieren, wie eine automatische ID generiert werden soll, um sie nach dem Erstellen zu erhalten. Die vorherigen Antworten sind richtig.


Dies ist überhaupt keine mögliche Antwort. OP gibt bereits an, dass die automatische Inkrementierung (automatische Erhöhung) verwendet wird. OP möchte diese automatisch generierte ID abrufen.
RozzA

Okay, nachdem ich wieder gelesen habe, habe ich bemerkt, dass das Problem nicht nur die ID generiert, OP möchte auch diese ID erhalten. Danke für die Definition: D
neoSmith
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.