Bagaimana cara mendapatkan ID terakhir yang dimasukkan dari tabel MySQL di PHP?


93

Saya memiliki tabel tempat data baru sering dimasukkan. Saya perlu mendapatkan ID terakhir dari tabel. Bagaimana saya bisa melakukan ini?

Apakah itu mirip dengan SELECT MAX(id) FROM table?


1
ya, Anda kueri ini akan mengembalikan id terakhir dari tabel. Tetapi satu syarat adalah bahwa ID harus menjadi kunci utama. Agar Anda dapat menghindari pertobatan.
sathish

7
@ sathish: Masalah utama dari metode itu adalah konkurensi .
Christian C. SalvadĂł

3
Untuk menguraikan: Masalahnya adalah jika orang lain memasukkan sesuatu ke dalam tabel antara Anda INSERTdan kueri untuk MAX(id), Anda mungkin mendapatkan id yang bukan id terakhir Anda .
menipu

3
@Jocelyn pertanyaan itu diajukan setahun kemudian dengan ribuan penayangan lebih sedikit daripada pertanyaan ini.
Naftali alias Neal

3
@Neal, kamu benar. Pertanyaan lain harus ditutup sebagai duplikat dari pertanyaan ini.
Jocelyn

Jawaban:


133

Jika Anda menggunakan PDO, gunakan PDO::lastInsertId.

Jika Anda menggunakan Mysqli, gunakan mysqli::$insert_id.

Jika Anda masih menggunakan Mysql:

Tolong, jangan gunakan mysql_*fungsi dalam kode baru . Mereka tidak lagi dipertahankan dan secara resmi tidak digunakan lagi . Lihat kotak merah ? Pelajari tentang pernyataan yang disiapkan , dan gunakan PDO atau MySQLi - artikel ini akan membantu Anda memutuskan yang mana. Jika Anda memilih PDO, berikut adalah tutorial yang bagus .

Tetapi jika harus, gunakan mysql_insert_id.


Masalah dengan yang satu ini adalah jika Anda mengalami banyak penyisipan (mis. Database Anda juga mencatat sesuatu), Anda bisa mendapatkan ID yang salah.
Mike

@Mike Tidak jika Anda menggunakan mysql_insert_id tepat setelah Anda mysql_query. Jika tentu saja Anda menjalankan beberapa kueri lain pada koneksi yang sama di antaranya, yah, tidak ada yang dapat membantu Anda di sana.
menipu

7
Untuk menjamin Anda TIDAK PERNAH mendapatkan id yang salah, bungkus kode Anda dengan TRANSACTION .
Marcelo Assis

28
mysql memastikan ini adalah id terakhir OF THE CURRENT CONNECTION, jadi tidak akan ada masalah jika Anda meletakkan pernyataan ini tepat setelah kueri penyisipan. Tidak perlu khawatir tentang proses lain yang melakukan penyisipan. Tidak perlu memasukkan ini ke dalam transaksi. Manual mysql mengatakan: "ID yang dibuat disimpan di server pada setiap koneksi. Ini berarti bahwa nilai yang dikembalikan oleh fungsi ke klien tertentu adalah nilai AUTO_INCREMENT pertama yang dihasilkan untuk pernyataan terbaru yang mempengaruhi kolom AUTO_INCREMENT oleh klien itu . Inilah alasan Anda tidak boleh menggunakan pilih MAX (ID)
woens

1
@deceze, Ada apa dengan PDObias ini yang kita lihat di mana-mana? Mari kita lihat lagi perbandingan fiturnya . Jelas itulah mysqlipemenangnya ketika Anda perlu mengotori tangan Anda dengan barang-barang level rendah. Dengan kata lain, bahkan jika seseorang memilih PDO, pada akhirnya dia harus mysqlitetap menggunakannya .
Pacerier

53

ada fungsi untuk mengetahui apa yang terakhir dimasukkan ke dalam koneksi saat ini

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

ditambah menggunakan max adalah ide yang buruk karena dapat menyebabkan masalah jika kode Anda digunakan pada waktu yang sama dalam dua sesi yang berbeda.

Fungsi itu disebut mysql_insert_id


2
mysql _ (...) tidak digunakan lagi di PHP> = versi 5.5.
Iago

Ya, saya hanya mengingatnya. :)
Iago



8

Apa yang Anda tulis akan memberi Anda idasumsi terbesar bahwa mereka unik dan bertambah otomatis yang akan baik-baik saja dengan asumsi Anda baik-baik saja dengan mengundang masalah konkurensi.
Karena Anda menggunakan MySQL sebagai database Anda, ada fungsi spesifiknyaLAST_INSERT_ID() yang hanya berfungsi pada koneksi saat ini yang melakukan penyisipan.
PHP menawarkan fungsi khusus untuk itu juga disebut mysql_insert_id.


6

Coba ini harus bekerja dengan baik:

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

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

echo mysqli_insert_id($link);

1
Terima kasih telah memperhatikan. Saya telah mengedit kodenya, sebenarnya itu adalah $ link (variabel yang menahan koneksi)
Sandhu

3

Anda bisa mendapatkan id terbaru yang dimasukkan dengan fungsi php bawaan mysql_insert_id();

$id = mysql_insert_id();

Anda juga mendapatkan id terbaru dengan

$id = last_insert_id();

4
Selain itu, ini salah karena menyarankan untuk menggunakan perpustakaan yang sudah tidak digunakan lagi. Sungguh, hapus ini
STT LCU

@STTLCU Potongan manakah di sini yang tidak digunakan lagi?
TheBlackBenzKid

@TheBlackBenzKid keduanya, karena mereka didasarkan pada fungsi mysql_ *
STT LCU

@Rahul $ id = last_insert_id (); tidak berfungsi karena mungkin sudah usang.
Esha

3

Untuk mendapatkan id yang terakhir dimasukkan ke dalam codeigniter Setelah menjalankan query insert cukup gunakan satu fungsi yang disebut insert_id() pada database, itu akan mengembalikan id yang terakhir dimasukkan

Ex:

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

dalam satu baris

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

3

Tidak apa-apa untuk digunakan mysql_insert_id(), tetapi ada satu catatan khusus tentang penggunaannya, Anda harus memanggilnya setelah kueri INSERT dieksekusi, artinya dalam sesi skrip yang sama. Jika Anda menggunakannya, itu tidak akan berfungsi dengan benar.


2

Bersih dan Sederhana -

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

1

CATATAN: jika Anda melakukan beberapa penyisipan dengan satu pernyataan mysqli :: insert_id tidak akan benar.

Meja:

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

Sekarang jika Anda melakukannya:

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

Mysqli :: insert_id akan menjadi 1 bukan 3.

Untuk mendapatkan nilai yang benar lakukan:

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

Ini telah menjadi dokumen tetapi agak tidak jelas.


1

Saya lebih suka menggunakan sintaks MySQL murni untuk mendapatkan id auto_increment terakhir dari tabel yang saya inginkan.

php mysql_insert_id () dan mysql last_insert_id () hanya memberikan ID transaksi terakhir.

Jika Anda menginginkan ID auto_incremented terakhir dari tabel mana pun dalam skema Anda (tidak hanya satu transaksi terakhir), Anda dapat menggunakan kueri ini

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

Itu dia.


saya ragu tentang ini, karena SQL ini salah dalam konteks pertanyaan .... Juga metode ini terasa rentan terhadap kemungkinan kondisi balapan ketika dua atau lebih klien mengeksekusi SQL ini di sekitar waktu yang sama ... saya tidak yakin seberapa cepat data kolom ini diperbarui setelah disisipkan yang membuat saya ragu ... Fungsi PHP yang bisa mendapatkan id terakhir didasarkan pada tingkat koneksi / sesi (kurang lebih sama dengan MySQL LAST_INSERT_ID () ) yang membuatnya aman dalam kondisi balapan
Raymond Nijland

1

Sedih tidak melihat jawaban dengan contoh.

Menggunakan 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

Menggunakan PDO :: lastInsertId :

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

0

Menggunakan MySQLitransaksi terkadang saya tidak bisa mendapatkan mysqli::$insert_id, karena mengembalikan 0. Apalagi jika saya menggunakan prosedur tersimpan, yang mengeksekusi INSERTs. Jadi ada cara lain dalam bertransaksi:

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

?>

0

Gunakan mysqli karena mysql merendahkan

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

0

Saya mencoba

mysqli_insert_id ($ dbConnectionObj)

Ini mengembalikan id koneksi yang dimasukkan terakhir jadi jika Anda mengelola koneksi Anda dengan benar ini harus bekerja. Setidaknya bekerja untuk saya.


0

Silakan gunakan PDP dan kemudian coba ini

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


-1

Dari semua pembahasan ini saya berasumsi bahwa alasan untuk mengecek max id adalah untuk mengetahui apa id selanjutnya .. (jika max id saya adalah 5 maka selanjutnya akan menjadi 5 + 1 = 6).

>> Jika ini bukan alasannya, mohon maaf yang terbaik

Kasus jika orang lain INSERT informasi antara CHECK dan INSERT akan memberikan ID yang salah.

Jadi bisa diatasi jika Anda akan membuat hash yang bisa menyertakan timestamp atau nilai unik lainnya.

Kemudian di fungsi yang sama Anda dapat memasukkan informasi Anda dengan nilai kosong dan hash Anda. Itu akan membuat ID jika Anda memilih AUTO_INCRECEMENT.

Kemudian dalam fungsi yang sama Anda masih memiliki hash dan Anda dapat mencari id dengan hash yang sama. Dan kemudian Anda dapat menyelesaikan mengisi nilai-nilai kosong dengan mysql UPDATE.

Ini termasuk sedikit lebih banyak koneksi, tetapi ini masih cara untuk melakukannya ...

Semoga berhasil menyelesaikannya.


-2

Jika tabel Anda memiliki kolom AUTO INCREMENT seperti UserID, Emp_ID, .. maka Anda dapat menggunakan query ini untuk mendapatkan record terakhir yang dimasukkan SELECT * FROM table_name dimana UserID = (pilih MAX (UserID) dari table_name) Dalam kode PHP:

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

Kemudian Anda dapat menggunakan data yang diambil sebagai kebutuhan Anda


Jangan mengenkripsi password , ketika penyerang mendapatkan DB dia juga akan mendapatkan kunci enkripsi.
zaf

-3
mysql_query("INSERT INTO mytable (product) values ('kossu')");

printf("Last inserted record has id %d\n", ***mysql_insert_id()***);
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.