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.