PHP / MySQL masukkan baris kemudian dapatkan 'id'


192

Bidang 'id' pada tabel saya otomatis bertambah ketika saya memasukkan satu baris. Saya ingin menyisipkan baris dan kemudian mendapatkan ID itu.

Saya akan melakukannya seperti yang saya katakan, tetapi apakah ada cara saya bisa melakukannya tanpa khawatir tentang waktu antara memasukkan baris dan mendapatkan id?

Saya tahu saya dapat meminta database untuk baris yang cocok dengan informasi yang dimasukkan, tetapi ada perubahan besar akan ada duplikat, dengan satu-satunya perbedaan adalah id.

Jawaban:


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

Lihat mysqli_insert_id().

Apa pun yang Anda lakukan, jangan masukkan lalu lakukan " SELECT MAX(id) FROM mytable". Seperti yang Anda katakan, ini adalah kondisi balapan dan tidak perlu. mysqli_insert_id()sudah memiliki fungsi ini.


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

11
Apakah masih berfungsi jika akan ada 10.000 sisipan async pada saat yang sama?
zie1ony

16
@ zie1ony Ya, itu akan bekerja selama satu juta sisipan async karena MySQL sesuai dengan ACID. Setiap insert individu dari banyak menyisipkan async adalah dalam sendiri terisolasi sesi, yang mana ID berasal dari ketika Anda menelepon mysql_insert_id () dari PHP Anda (atau LAST_INSERT_ID () di MySQL)
rodrigo-silveira

7
Pada dokumen ada sesuatu yang perlu diperhatikan: 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
perlu menulis ulang semua yang pernah saya tulis -_-
de_nuit

39

Fungsi MySQL LAST_INSERT_ID()tidak hanya apa yang Anda butuhkan: ia mengambil id yang dimasukkan selama sesi ini . Jadi aman untuk digunakan, bahkan jika ada proses lain (orang lain memanggil skrip yang sama persis, misalnya) memasukkan nilai ke dalam tabel yang sama.

Fungsi PHP mysql_insert_id()melakukan hal yang sama seperti memanggil SELECT LAST_INSERT_ID()dengan 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()'); Yang kedua mysql_insert_id()tidak mencerminkan 600, di mana seperti yang mysql_query('SELECT LAST_INSERT_ID()')akan. Untuk mendapatkan mysql_insert_id()agar mencerminkan perubahan Anda harus terlebih dahulu melakukan penyisipan atau pembaruan (yang dapat mempengaruhi 0 baris). Lihat paragraf terakhir: http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id
Cliffordlife

28

Mengenai situs web PHP, mysql_insert_id sekarang sudah tidak digunakan lagi dan kita harus menggunakan PDO. Untuk melakukan ini dengan PDO, lanjutkan sebagai berikut:

$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
Kami memiliki opsi untuk menggunakan PDO atau MySQLi (yang saya jelaskan di jawaban lain di sini). Perbandingan yang bagus: code.tutsplus.com/tutorials/…
Luke

20

Seperti yang dikatakan @NaturalBornCamper, mysql_insert_id sekarang sudah tidak digunakan lagi dan tidak boleh digunakan. Opsi sekarang untuk menggunakan PDO atau mysqli. NaturalBornCamper menjelaskan PDO dalam jawabannya, jadi saya akan menunjukkan bagaimana melakukannya dengan MySQLi ( Peningkatan MySQL ) menggunakan 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);

Lihatlah dokumentasi PHP untuk lebih banyak contoh: http://php.net/manual/en/mysqli.insert-id.php


Terima kasih sudah menangkapnya. Saya lebih suka notasi titik Javascript daripada notasi panah PHP. : /
Luke

7

Saya hanya ingin menambahkan detail kecil tentang lastInsertId();

Saat memasukkan lebih dari satu baris pada saat itu, itu tidak mengembalikan Id terakhir , tetapi Id pertama dari koleksi sisipan terakhir.

Perhatikan contoh berikut

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

Yang terjadi di sini adalah saya mendorong my_tabledua baris baru. Id tabel adalah peningkatan otomatis. Di sini, untuk pengguna yang sama, saya menambahkan dua baris dengan yang berbedavarNumb .

Nilai gema di akhir akan sama dengan id dari baris di mana varNumb=1, yang berarti bukan id dari baris terakhir , tetapi id dari baris pertama yang ditambahkan dalam permintaan terakhir.


tetap berpegang pada satu operasi pada suatu waktu - tampaknya menjadi jawaban keseluruhan untuk semua metode yang digunakan, untuk menghindari perilaku yang tidak terduga
RozzA

1

Sebuah contoh.

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

Baris kode $course_id = $query_new->insert_id;akan menampilkan ID dari baris yang dimasukkan terakhir. Semoga ini membantu.


1

Coba seperti ini Anda bisa mendapatkan jawabannya:

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

Lihat tautan berikut:

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

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

Harap perhatikan juga bahwa ekstensi ini sudah tidak digunakan lagi dalam PHP 5.5 dan dihapus dalam PHP 7.0



0

Coba ini ... itu berhasil untuk saya!

$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

Jawaban lain yang mungkin adalah:

Saat Anda menentukan tabel, dengan kolom dan data yang akan dimilikinya. ID kolom dapat memiliki properti AUTO_INCREMENT .

Dengan metode ini, Anda tidak perlu khawatir tentang id , itu akan dibuat secara otomatis .

Misalnya (diambil dari 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)
)

Semoga ini bermanfaat bagi seseorang.

Sunting: Ini hanya bagian di mana Anda menentukan cara membuat ID otomatis, untuk mendapatkannya setelah dibuat, jawaban sebelumnya sebelumnya benar.


ini sama sekali bukan jawaban yang mungkin, OP sudah menyatakan mereka menggunakan kenaikan otomatis (kenaikan otomatis). OP ingin mengambil id yang dibuat secara otomatis.
RozzA

Oke, setelah membaca lagi saya perhatikan bahwa masalahnya bukan hanya menghasilkan id, OP juga ingin mendapatkan id itu. Terima kasih untuk definisinya: D
neoSmith
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.