Alternatif "PDO :: lastInsertId" için

6 Cevap php

Ben her zaman "lastInsertId" (veya mysql_insert_id () Eğer PDO kullanarak değilseniz) kullanarak kötü olduğunu duydum. Bu tamamen sizin INSERT oluşturulan son kimliği değil bir şey dönmek çünkü tetikler durumda açıkça vardır.

$DB->exec("INSERT INTO example (column1) VALUES ('test')");
// Usually returns your newly created ID.
// However when a TRIGGER inserts into another table with auto-increment:
// -> Returns newly created ID of trigger's INSERT
$id = $DB->lastInsertId();

Alternatif nedir?

6 Cevap

Eğer ADOdb rota giderseniz (http://adodb.sourceforge.net/), daha sonra ekleme ID oluşturabilirsiniz before hand ve açıkça özel kimlik takarken. Bu (ADOdb ... farklı veritabanları bir ton destekler) ve doğru uç kimliğini kullanarak konum garanti portably uygulanabilir.

PostgreSQL SERİ veri türü per-table/per-sequence olduğunu, size bu isteği için son uç kimliğini istediğiniz tablo / sırasını belirtmek haricinde benzerdir.

Neredeyse başka SQL veritabanı (varsa) o var çünkü sadece "kötü" olarak kabul edilir IMHO.

Şahsen ben inanılmaz yararlı ve ben diğer sistemlerde diğer daha karmaşık yöntemlere başvurmak zorunda olmadığını diliyorum.

Bir alternatif yerine dizilerini kullanmaktır, böylece ekleme yapmadan önce numarası kendiniz oluşturmak.

Ne yazık ki onlar MySQL desteklenmez ama adodb gibi kütüphaneler başka bir tablo kullanarak onları taklit edebilirsiniz. Ben öykünme kendisi lastInsertId () veya eşdeğer kullanacağını, ancak sanırım ... ama en azından sadece bir dizi için kullanılan bir tabloda bir tetikleyici olması daha az olasıdır

Ben bu ya gerçekten sanat eseri değil sanırım ama ben gerçekten son eklenen kimliği almak emin olmak için yazma kilitleri kullanın.

Bu sofistike değil ve verimli değil, ama Eklediğiniz veri benzersiz alanlar eklerseniz, daha sonra bir SELECT belli sonra ne konum elde edebilirsiniz.

Örneğin:

INSERT INTO example (column1) VALUES ('test');
SELECT id FROM example WHERE column1 = 'test';

Bu deneyebilirsiniz:

$sql = "SELECT id FROM files ORDER BY id DESC LIMIT 1";
$PS = $DB -> prepare($sql);
$PS -> execute();
$result = $PS -> fetch();