gpt4 book ai didi

php - 如何在使用 PHP-PDO 记录查询时获取最后一个插入 ID

转载 作者:行者123 更新时间:2023-11-29 00:20:17 24 4
gpt4 key购买 nike

最近我一直在创建一个函数来记录数据库中的每个更改,只是将它记录到一个表中。

表备份日志:backupTableName、backupLastUpdate、backupLastupload

因此,每次更改时,它都会将日期记录到“backup_log”。它运行良好,但当我需要最后插入 ID 时遇到问题,我使用 $orderid = $dbh->lastInsertId('orderId'); 获取“最后插入 ID”,但它返回“0”。我发现当我放置运行另一个查询的 querylog() 函数时问题就来了,而 query() 函数仍在运行。因为它使用相同的 PDO 对象。那么,对于在运行 querylog() 时能够获得“最后插入 ID”的任何建议?

这是我的代码:

//$dbh is object of PDO connection

$sql = query("INSER INTO orders ...");
$orderid = $dbh->lastInsertId('orderId'); // table "orders"

function query($sql){
#this function is not the full version, just for example
global $dbh;
$query=$dbh->exec($sql);

querylog($sql); // Log every insert, delete and update query
}

function querylog($sql){
global $dbh; // PDO object
global $now;

//Table backup_log: backupTable, backupLastUpdate, backupLastupload

###### Log: for insert and update ########
#if the query too long, cut for 200 chars and convert them to array
$sql_clean_space=str_replace(array(" ",'`'),array(" ",''),$sql); //change double space to single space
if(strlen($sql_clean_space) > 200){
$sql_clean_space = substr($sql_clean_space, 0, 200); // get only 200 char
}

$sql_array=explode(" ", $sql_clean_space); //convert to array to get the command name, insert or update
$now_date=$now;

#save log
if(strtolower($sql_array[0])=='insert' or strtolower($sql_array[0])=='delete'){
#check whether the query is insert or update
$sqlx = "SELECT * FROM backup_log WHERE backupTable='".$sql_array[2]."'";
$query=$dbh->query($sqlx);
$check_row=$query->rowCount($query);

if($check_row){
$sql_log="UPDATE backup_log SET backupLastUpdate='$now' WHERE backupTable='". $sql_array[2] . "'";
}else{
$sql_log="INSERT INTO backup_log VALUES('".$sql_array[2]."', '$now_date','$now_date')";
}
}elseif(strtolower($sql_array[0])=='update'){
$sqlx = "SELECT * FROM backup_log WHERE backupTable='".$sql_array[1]."'";
$query=$dbh->query($sqlx);
$check_row=$query->rowCount($query);

if($check_row){
$sql_log="UPDATE backup_log SET backupLastUpdate='$now' WHERE backupTable='". $sql_array[1] . "'";
}else{
$sql_log="INSERT INTO backup_log VALUES('".$sql_array[1]."', '$now_date','$now_date')";
}
}
$query_log=$dbh->exec($sql_log);
####### End of log ######################
}

最佳答案

也许你可以在查询函数中分配最后插入的 id,它可以在查询执行时被保留。请参阅下面的代码;

$sql = query("INSER INTO orders ...", 'orderId'); //$sql is equal to last insert id 
$orderid = $sql

function query($sql, $specific_id_column){
#this function is not the full version, just for example
global $dbh;
$query=$dbh->exec($sql);
$last_id = $dbh->lastInsertId($specific_id_column);
querylog($sql); // Log every insert, delete and update query
return $last_id;
}

关于php - 如何在使用 PHP-PDO 记录查询时获取最后一个插入 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21301687/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com