Wstaw wiersz PHP / MySQL, a następnie pobierz „id”


192

Pole „id” mojej automatycznej tabeli zwiększa się po wstawieniu wiersza. Chcę wstawić wiersz, a następnie uzyskać ten identyfikator.

Zrobiłbym to tak, jak to powiedziałem, ale czy jest sposób, aby to zrobić, nie martwiąc się o czas między wstawieniem wiersza a otrzymaniem identyfikatora?

Wiem, że mogę zapytać bazę danych o wiersz, który pasuje do wprowadzonych informacji, ale jest duża zmiana, będą duplikaty, a jedyną różnicą jest identyfikator.

Odpowiedzi:


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);

Zobaczyć mysqli_insert_id().

Cokolwiek zrobisz, nie wstawiaj, a następnie „ SELECT MAX(id) FROM mytable”. Jak mówisz, jest to warunek wyścigu i nie ma takiej potrzeby. mysqli_insert_id()ma już tę funkcjonalność.


58
Odpowiednikiem PDO jest PDO :: lastInsertId ( us3.php.net/manual/en/pdo.lastinsertid.php ).
Matthew Flaschen

11
Czy to nadal działa, jeśli jednocześnie będzie 10000 wstawień asynchronicznych?
zie1ony,

16
@ zie1ony Tak, działałoby dla miliona wstawień asynchronicznych, ponieważ MySQL jest zgodny z ACID. Każda pojedyncza wstawka z wielu wstawek asynchronicznych znajduje się w swojej własnej izolowanej sesji, z której pochodzi identyfikator, gdy wywołujesz mysql_insert_id () z twojego PHP (lub LAST_INSERT_ID () w MySQL)
rodrigo-silveira

7
W dokumencie jest coś do odnotowania: 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
muszę przepisać wszystko, co kiedykolwiek napisałem -_-
de_nuit

39

Funkcja MySQL LAST_INSERT_ID()robi dokładnie to, czego potrzebujesz: pobiera identyfikator, który został wstawiony podczas tej sesji . Jest więc bezpieczny w użyciu, nawet jeśli istnieją inne procesy (na przykład inne osoby wywołujące dokładnie ten sam skrypt), wstawiające wartości do tej samej tabeli.

Funkcja PHP działa mysql_insert_id()tak samo jak wywoływanie za SELECT LAST_INSERT_ID()pomocą 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()'); Drugi mysql_insert_id()nie odzwierciedla 600, gdzie mysql_query('SELECT LAST_INSERT_ID()')będzie. Aby uzyskać mysql_insert_id()odzwierciedlenie zmiany, musisz najpierw wstawić lub zaktualizować (co może wpłynąć na 0 wierszy). Zobacz ostatni akapit: http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id
Cliffordlife

28

Jeśli chodzi o stronę PHP, mysql_insert_id jest teraz przestarzały i musimy używać PDO. Aby to zrobić za pomocą PDO, wykonaj następujące czynności:

$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
Mamy opcję użycia PDO lub MySQLi (które opisuję w innej odpowiedzi tutaj). Dobre porównanie: code.tutsplus.com/tutorials/…
Luke

20

Jak powiedział @NaturalBornCamper, mysql_insert_id jest teraz przestarzały i nie należy go używać. Dostępne są teraz opcje używania PDO lub mysqli. NaturalBornCamper wyjaśnił PDO w swojej odpowiedzi, więc pokażę, jak to zrobić za pomocą MySQLi ( MySQL Improved ) za pomocą mysqli_insert_id .

// 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);

Sprawdź dokumentację PHP, aby uzyskać więcej przykładów: http://php.net/manual/en/mysqli.insert-id.php


Dzięki za złapanie tego. Naprawdę wolę notację kropkową JavaScript niż notację strzałkową PHP. : /
Luke

7

Chcę tylko dodać mały szczegół dotyczący lastInsertId();

Wprowadzając więcej niż jeden wiersz na raz, nie zwraca ostatniego Id , ale pierwszy Id kolekcji ostatnich wstawek.

Rozważ następujący przykład

$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();

To, co się tutaj dzieje, polega na tym, że pcham my_tabledwa nowe rzędy. Identyfikator tabeli to auto-inkrement. Tutaj, dla tego samego użytkownika, dodaję dwa wiersze z innym varNumb.

Wartość echa na końcu będzie równa identyfikatorowi wiersza gdzie varNumb=1, co oznacza nie identyfikator ostatniego wiersza, ale identyfikator pierwszego wiersza dodanego w ostatnim żądaniu.


trzymać się jednej operacji na raz - wydaje się być ogólną odpowiedzią dla wszystkich stosowanych metod, aby uniknąć nieoczekiwanych zachowań
RozzA

1

Przykład.

    $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();

Wiersz kodu $course_id = $query_new->insert_id;wyświetli identyfikator ostatniego wstawionego wiersza. Mam nadzieję że to pomoże.


1

Spróbuj tak, aby uzyskać odpowiedź:

<?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);
?>

Spójrz na następujące linki:

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

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

Pamiętaj też, że to rozszerzenie było przestarzałe w PHP 5.5 i usunięte w PHP 7.0



0

Spróbuj tego ... zadziałało dla mnie!

$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

Inną możliwą odpowiedzią będzie:

Kiedy zdefiniujesz tabelę, będzie ona zawierała kolumny i dane. Identyfikator kolumny może mieć właściwość AUTO_INCREMENT .

Dzięki tej metodzie nie musisz się martwić o identyfikator , zostanie on utworzony automatycznie .

Na przykład (wzięte z 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)
)

Mam nadzieję, że to będzie komuś pomocne.

Edycja: To tylko część, w której definiujesz sposób generowania automatycznego identyfikatora, aby uzyskać go po utworzeniu, poprzednie odpowiedzi są prawidłowe.


nie jest to w ogóle możliwa odpowiedź, OP już twierdzi, że używa automatycznego przyrostu (automatyczne zwiększenie). OP chce odzyskać automatycznie wygenerowany identyfikator.
RozzA

Ok, po ponownym przeczytaniu zauważyłem, że problemem jest nie tylko generowanie identyfikatora, OP chce również uzyskać ten identyfikator. Dzięki za definicję: D
neoSmith
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.