[英]PHP PDO, SQL update conflicting with the function “lastInsertd()”
我在下面有此代碼,但是有一個問題:如果我調用函數“ updateData()”,則“ getLastId()”函數將返回零。 注意:在函數“ insertData()”和“ updateData()”內部傳遞的參數僅用於測試。
loggedin.php
else {
$dataBase = new DB($db);
$dataBase->insertData('name');
//$dataBase->updateData('email', $dataBase->getLastId());
if (isset($_POST['deleteAll'])) {
$dataBase->deleteAll();
header('Location: loggedin.php');
}
else if (isset($_POST['id'])) {
$id = $_POST['id'];
$dataBase->deleteData($id);
header('Location: loggedin.php');
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
....
</form>
</h5>
<?php
echo 'Number of visits: ' .$dataBase->getLastId().'<br><br>';
echo 'Relevant data: ' .$dataBase->fetch_row_count().'<br><br>';
?>
db.php中
class DB {
protected $_db;
public function __construct(PDO $db) {
$this->_db = $db;
}
function insertData($firstName) {
$insertUser = $this->_db->prepare("INSERT INTO `people` (first_name, created) VALUES (?, NOW())");
$insertUser->bindValue(1, $firstName);
$insertUser->execute();
}
function updateData($mail, $last) {
$updateData = $this->_db->prepare("UPDATE `people` SET `mail` = ? WHERE `id` = ?");
$updateData->bindValue(1, $mail);
$updateData->bindValue(2, $last);
$updateData->execute();
}
public function getLastId() {
$last = $this->_db->lastInsertId();
return $last;
}
}
根據我的測試,PDO的lastInsertId()
方法顯然不會在任何后續語句之后的最新INSERT
語句中返回相同的值。 盡管對於事務查詢已經很好地理解了類似的行為,但是在lastInsertId()
手冊中沒有記錄這種行為。
例如,以下內容顯示,即使在執行中間SELECT
語句之后,PDO對象也將不再返回插入的ID:
$p = new PDO('mysql:host=localhost;dbname=test', '', '');
$p->query("INSERT INTO t (id) VALUES (null)");
echo $p-lastInsertId();
// prints 1
$p->query("SELECT * FROM t");
echo $p-lastInsertId();
// prints 0
這與MySQL的LAST_INSERT_ID()
函數的本機行為不同,后者在后續的UPDATE
或SELECT
語句之后將繼續返回最近插入的ID。
插入一行:
MariaDB [test]> INSERT INTO t3 VALUES (null);
Query OK, 1 row affected (0.00 sec)
MariaDB [test]> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
| 6 |
+------------------+
1 row in set (0.00 sec)
執行中介聲明:
MariaDB [test]> SELECT * FROM t3;
+----+
| id |
+----+
| 3 |
| 6 |
+----+
6 rows in set (0.00 sec)
該值仍然可用:
MariaDB [test]> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
| 6 |
+------------------+
1 row in set (0.00 sec)
要解決您的問題,請在回顯先前的ID后更改操作順序以調用updateData()
方法,或將其存儲到變量中以供重用。
$dataBase->insertData('name');
// Store the id into a variable
$last_id = $dataBase->getLastId();
// Use the variable in the update method call
$dataBase->updateData('email', $last_id);
// Later use the variable for output:
echo "Number of visits: $last_id";
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.