PHP PDO、SQL更新与函数“冲突”;lastInsertd();
下面是我的代码,但它有一个问题:如果我调用函数'updateData()','getLastId()'函数返回零。注意:函数'insertData()'和'updateData()'中传递的参数仅用于测试 loggedin.phpPHP 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
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";