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.

Hintswen
sumber

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.

cletus
sumber
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().

soulmerge
sumber
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();
NaturalBornCamper
sumber
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

Luke
sumber
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.

leMoisela
sumber
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.

pengguna1012181
sumber
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

Murali
sumber
1

Saya menemukan jawaban di tautan di atas http://php.net/manual/en/function.mysql-insert-id.php

Jawabannya adalah:

mysql_query("INSERT INTO tablename (columnname) values ('$value')");        
echo $Id=mysql_insert_id();
Yaseen Ahmed
sumber
mysqljawaban tidak aman , tidak pernah menggunakannya.
RozzA
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);
    }
uriateho
sumber
-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.

neoSmith
sumber
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