Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP PDO、SQL更新与函数“冲突”;lastInsertd();_Php_Sql_Pdo - Fatal编程技术网

PHP PDO、SQL更新与函数“冲突”;lastInsertd();

PHP PDO、SQL更新与函数“冲突”;lastInsertd();,php,sql,pdo,Php,Sql,Pdo,下面是我的代码,但它有一个问题:如果我调用函数'updateData()','getLastId()'函数返回零。注意:函数'insertData()'和'updateData()'中传递的参数仅用于测试 loggedin.php else { $dataBase = new DB($db); $dataBase->insertData('name'); //$dataBase->updateData('email', $dataBase->getLa

下面是我的代码,但它有一个问题:如果我调用函数'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>';
        ?>
根据我的测试,PDO的
lastInsertId()
方法显然不会从任何后续语句之后的最新
INSERT
语句返回相同的值。虽然对于事务性查询,类似的行为已经被很好地理解,但这种行为并没有文档记录

例如,以下内容显示,即使在中间
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\u INSERT\u 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";

(您说过它们只用于测试,但别忘了在
$updateData
中用适当的
参数替换
$mail
变量)是的,我有ATTR::ERR。。。除此之外,我已经使用和'updateData($mail,$last')以及'insertData()'对其进行了测试,它们工作得很好。谢谢@Michael Berkowski,我会这么做的,等等,当你说如果我调用函数'updateData()'时,'getLastId()'函数返回零,你指的是
echo'访问次数:'.$dataBase->getLastId()。

'行?这是意料之中的
lastInsertID()
在执行另一个查询(更新查询)后将不会返回有用的值,这是您的问题不清楚的地方,您在该查询中注释掉了
updateData()
调用。您不应该期望
getLastId()
在调用更新后返回值。如果需要再次使用,则需要将其值存储在
insertData()
之后的变量中。因此,我应该在insert函数中返回它(lastInsertId)?Hello@Michael,很抱歉打扰您。现在的问题是,我正在调用另一个文件(index.php)中的函数,getLastId()在这里工作,但我希望getLastId()仍显示在loggedin.php上,现在它返回0always@Miguel如果您已经移动到另一个脚本,那么您现在就处于一个新的数据库连接上,甚至是本地的
PDO::lastInsertId()
不会返回值,也不会将上次插入ID()直接返回到MySQL。如果您需要在不同的脚本上使用该值,则需要将其存储到
$\u SESSION
中,或者构建一个查询来查找该值。会话更容易、更快。在每页顶部调用
session\u start()
,并分配值
$\u session['last\u id']=$last\u id
$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";