Sık sık yeni verilerin eklendiği bir tablom var. Tablonun son kimliğini almam gerekiyor. Bunu nasıl yapabilirim?
Benzer SELECT MAX(id) FROM tablemi?
Sık sık yeni verilerin eklendiği bir tablom var. Tablonun son kimliğini almam gerekiyor. Bunu nasıl yapabilirim?
Benzer SELECT MAX(id) FROM tablemi?
INSERTve sorgunuzun arasına başka biri tabloya bir şey eklerse , son kimliğiniz MAX(id)olmayan bir kimlik elde edebilirsiniz .
Yanıtlar:
PDO kullanıyorsanız, kullanın PDO::lastInsertId.
Mysqli kullanıyorsanız, kullanın mysqli::$insert_id.
Hala Mysql kullanıyorsanız:
Lütfen
mysql_*yeni kodda işlev kullanmayın . Artık korunmuyorlar ve resmi olarak kullanımdan kaldırılıyorlar . Bkz kırmızı kutuyu ? Bunun yerine hazırlanmış ifadeler hakkında bilgi edininve PDO veya MySQLi kullanın - bu makale hangisi olduğuna karar vermenize yardımcı olacaktır. PDO'yu seçerseniz, işte size iyi bir eğitim .
Ama mecbursan kullan mysql_insert_id.
mysql_insert_id hemen sonra SİZİN mysql_query. Elbette, aynı bağlantı üzerinden birkaç başka sorgu yürütürseniz, orada size yardımcı olabilecek hiçbir şey yoktur.
PDOher yerde gördüğümüz bu önyargı nedir ? Özellik karşılaştırmasına tekrar bakalım . mysqliEllerinizi düşük seviyeli şeylerle kirletmeniz gerektiğinde kazananın olduğu açıktır . Başka bir deyişle, PDO seçilse bile, sonundamysqli yine de kullanması gerekecektir.
mevcut bağlantıya eklenen son kimliğin ne olduğunu bilmek için bir işlev var
mysql_query('INSERT INTO FOO(a) VALUES(\'b\')');
$id = mysql_insert_id();
artı kullanarak max bir olan kötü bir fikir o yol açabilir, çünkü sorunların kodunuzu iki farklı oturumlarda aynı anda kullanılması durumunda.
Bu işleve mysql_insert_id denir
Tamam. Ayrıca LAST_INSERT_ID () kullanabilirsiniz
select max(id)from table?
İle PDO :
$pdo->lastInsertId();
İle MySQLi :
$mysqli->insert_id;
Lütfen mysql_*yeni kodda işlev kullanmayın . Artık korunmuyorlar ve resmi olarak kullanımdan kaldırılıyorlar . Bkz kırmızı kutuyu ? Bunun yerine hazırlanmış ifadeler hakkında bilgi edininve PDO veya MySQLi kullanın - bu makale hangisi olduğuna karar vermenize yardımcı olacaktır. PDO'yu seçerseniz, işte size iyi bir eğitim .
Yazdıklarınız id, benzersiz olduklarını ve otomatik olarak artırıldıklarını varsayarsak size en iyisini verirdi; bu, davet eşzamanlılık sorunlarında sorun olmadığını varsayarsak iyi olur.
Veritabanınız olarak MySQL kullandığınız için, LAST_INSERT_ID()yalnızca eklemeyi yapan mevcut bağlantıda çalışan belirli bir işlev vardır.
PHP, çağrılanlar için özel bir işlev sunar mysql_insert_id.
Bunu deneyin iyi çalışmalı:
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
$query = "INSERT blah blah blah...";
$result = mysqli_query($link, $query);
echo mysqli_insert_id($link);
Kod işaretleyiciye en son eklenen kimliği almak için Ekleme sorgusunu çalıştırdıktan sonra insert_id(), veritabanında çağrılan bir işlevi kullanın , son eklenen kimliği döndürür
Ör:
$this->db->insert('mytable',$data);
echo $this->db->insert_id(); //returns last inserted id
tek satırda
echo $this->db->insert('mytable',$data)->insert_id();
Dahili php işlevi ile en son eklenen kimliği alabilirsiniz mysql_insert_id();
$id = mysql_insert_id();
ayrıca en son kimliği de alırsınız
$id = last_insert_id();
Kullanmakta sorun yok mysql_insert_id(), ancak kullanımıyla ilgili belirli bir not var, INSERT sorgusunu çalıştırdıktan sonra çağırmalısınız, yani aynı komut dosyası oturumunda. Aksi takdirde kullanırsanız düzgün çalışmayacaktır.
NOT: tek bir deyimle birden çok ekleme yaparsanız, mysqli :: insert_id doğru olmayacaktır.
Tablo:
create table xyz (id int(11) auto_increment, name varchar(255), primary key(id));
Şimdi yaparsan:
insert into xyz (name) values('one'),('two'),('three');
Mysqli :: insert_id 3 değil 1 olacaktır.
Doğru değeri elde etmek için şunları yapın:
mysqli::insert_id + mysqli::affected_rows) - 1
Bu bir belgeydi ama biraz belirsiz.
İstediğim tablonun son auto_increment kimliğini almak için saf bir MySQL sözdizimi kullanmayı tercih ederim.
php mysql_insert_id () ve mysql last_insert_id () yalnızca son işlem kimliğini verir.
Şemanızdaki herhangi bir tablonun son otomatik_artımlı kimliğini istiyorsanız (yalnızca son işlemi değil), bu sorguyu kullanabilirsiniz
SELECT AUTO_INCREMENT FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'my_database'
AND TABLE_NAME = 'my_table_name';
Bu kadar.
Örnekle herhangi bir cevap görmemek üzücü.
Mysqli :: $ insert_id kullanarak :
$sql="INSERT INTO table (col1, col2, col3) VALUES (val1, val2, val3)";
$mysqli->query($sql);
$last_inserted_id=$mysqli->insert_id; // returns last ID
PDO :: lastInsertId kullanarak :
$sql="INSERT INTO table (col1, col2, col3) VALUES (val1, val2, val3)";
$database->query($sql);
$last_inserted_id=$database->lastInsertId(); // returns last ID
MySQLiİşlemi kullanarak bazen mysqli::$insert_id0 döndürdüğü için alamadım. Özellikle saklı yordamları kullanıyor olsaydım, o yürütüldü INSERT. Yani işlem içinde başka bir yol var:
<?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;
}
?>
Kullanım mysqli olarak MySQL depricating olduğunu
<?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();
?>
denedim
mysqli_insert_id($dbConnectionObj)
Bu, mevcut bağlantının en son eklenen kimliğini döndürür, bu nedenle bağlantılarınızı düzgün bir şekilde yönetiyorsanız bu çalışmalıdır. En azından benim için çalıştı.