PHP / MySQL satır ekleme sonra 'id' olsun


192

Bir satır eklediğimde, tablonun 'id' alanı otomatik olarak artıyor. Bir satır eklemek ve daha sonra bu kimliği almak istiyorum.

Ben de söylediğim gibi yapardım, ama satır ekleme ve id alma arasındaki zaman hakkında endişelenmeden yapabileceğim bir yolu var mı?

Girilen bilgilerle eşleşen satır için veritabanını sorgulayabileceğimi biliyorum, ancak tek fark id olmak üzere, yinelenen olacak yüksek bir değişiklik var.

Yanıtlar:


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

Bkz mysqli_insert_id().

Ne yaparsanız yapın eklemeyin ve sonra " SELECT MAX(id) FROM mytable" yapmayın . Dediğiniz gibi, bu bir yarış koşulu ve gerek yok. mysqli_insert_id()zaten bu işlevselliğe sahip.


58
PDO eşdeğeri PDO :: lastInsertId'dir ( us3.php.net/manual/en/pdo.lastinsertid.php ).
Matthew Flaschen

11
Aynı anda 10000 asenkron kesici uç olacaksa hala çalışıyor mu?
zie1ony

16
@ zie1ony Evet, MySQL ACID uyumlu olduğu için bir milyon asenkron ek için işe yarayacaktır. Birçok zaman uyumsuz ekler gelen Her birey insert kendi içinde izole kimlik Eğer PHP (veya MySQL LAST_INSERT_ID ()) den mysql_insert_id () çağırdığınızda nereden geldiğini olan oturumun
rodrigo-silveira

7
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.
Doktorda

7
şimdiye kadar yazdığım her şeyi yeniden
yazmanız gerekiyor

39

MySQL işlevi LAST_INSERT_ID()tam ihtiyacınız olanı yapar: bu oturum sırasında eklenmiş olan kimliği alır . Bu nedenle, aynı tabloya değerler ekleyen başka işlemler (örneğin, aynı komut dosyasını çağıran diğer kişiler) olsa bile kullanmak güvenlidir.

PHP işlevi ile mysql_insert_id()çağrı yapmakla aynı şeyi yapar .SELECT LAST_INSERT_ID()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()'); İkincisi 600'i mysql_insert_id()yansıtmıyor, nerede mysql_query('SELECT LAST_INSERT_ID()')olacak. Almak için mysql_insert_id()öncelikle bir ekleme ya da (0 satır etkileyebilir) bir güncelleme yapmak zorunda değişikliği yansıtmak için. Şu son paragrafa bakınız: http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id
Cliffordlife

28

PHP'nin web sitesine gelince, mysql_insert_id artık kullanımdan kaldırıldı ve PDO kullanmalıyız. Bunu PDO ile yapmak için aşağıdakileri yapın:

$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
PDO veya MySQLi'yi kullanma seçeneğimiz var (burada başka bir cevapta tarif ediyorum). İyi bir karşılaştırma: code.tutsplus.com/tutorials/…
Luke

20

@NaturalBornCamper dediği gibi, mysql_insert_id artık önerilmemektedir ve gerektiği değil kullanılmalıdır. Seçenekler şimdi PDO veya mysqli kullanmak içindir. NaturalBornCamper cevabında PDO açıkladı, bu yüzden mysqli_insert_id kullanarak MySQLi ( MySQL Geliştirilmiş ) ile nasıl yapılacağını göstereceğim .

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

Daha fazla örnek için PHP belgelerine bakın: http://php.net/manual/en/mysqli.insert-id.php


Yakaladığınız için teşekkürler. Gerçekten PHP'nin ok gösterimi üzerinde Javascript nokta gösterimini tercih ederim. : /
Luke

7

Sadece küçük bir ayrıntı eklemek istiyorum lastInsertId();

Aynı anda birden fazla satır girildiğinde, son Kimlik değil, son eklemeler koleksiyonunun ilk Kimliği döndürülür .

Aşağıdaki örneği düşünün

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

Burada olan my_tableiki yeni sıraya girmem. Tablonun kimliği otomatik artımdır. Burada, aynı kullanıcı için farklı bir iki satır ekliyorum varNumb.

Sondaki yankı değeri satırın kimliğine eşit olacaktır; varNumb=1bu, son satırın kimliği değil, son istekte eklenen ilk satırın kimliği anlamına gelir .


Her seferinde bir operasyona sadık
kalın

1

Bir örnek.

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

Kod satırı $course_id = $query_new->insert_id;, son eklenen satırın kimliğini görüntüler. Bu yardımcı olur umarım.


1

Bu şekilde deneyin cevabı alabilirsiniz:

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

Aşağıdaki bağlantılara bir göz atın:

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

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

Ayrıca lütfen bu eklentinin PHP 5.5'te kullanımdan kaldırıldığını ve PHP 7.0'da kaldırıldığını unutmayın.



0

Bunu dene ... benim için çalıştı!

$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

Başka bir olası cevap:

Tabloyu tanımladığınızda sütunları ve verileriyle birlikte olur. Sütun kimliği AUTO_INCREMENT özelliğine sahip olabilir .

Bu yöntemle, kimlik hakkında endişelenmenize gerek yoktur , otomatik olarak yapılacaktır .

Örneğin ( w3schools'tan alınmıştır )

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

Umarım bu birisi için faydalı olacaktır.

Düzenle: Bu, yalnızca otomatik bir kimlik oluşturmayı, oluşturduktan sonra elde etmek için nasıl tanımlayacağınız, önceki yanıtların doğru olduğu kısımdır.


bu olası bir cevap değildir, OP zaten otomatik artış (otomatik artışlar) kullandıklarını belirtmektedir. OP otomatik olarak oluşturulan kimliği almak istiyor.
RozzA

Tamam, tekrar okuduktan sonra sorunun sadece kimliği üretmediğini fark ettim, OP de bu kimliği almak istiyorum. Tanımı için teşekkürler: D
neoSmith
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.