簡體   English   中英

PHP PDO,SQL更新與函數“ lastInsertd()”沖突

[英]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()函數的本機行為不同,后者在后續的UPDATESELECT語句之后繼續返回最近插入的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM