如何在使用 PHP-PDO 记录查询时获取最后一个插入 ID
Posted
技术标签:
【中文标题】如何在使用 PHP-PDO 记录查询时获取最后一个插入 ID【英文标题】:How to get last Insert Id while logging the query using PHP-PDO 【发布时间】:2014-01-23 07:14:15 【问题描述】:最近我一直在创建一个函数来记录数据库中的每一个变化,我只是将它记录到一个表中。
表备份日志:backupTableName、backupLastUpdate、backupLastupload
因此,每次更改时,都会将日期记录到“backup_log”中。
它运行良好,但是当我需要 Last Insert Id 时出现问题,我使用 $orderid = $dbh->lastInsertId('orderId');
来获取“last insert 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 ######################
【问题讨论】:
你为什么不使用 mysqli_insert_id ? @HüseyinBABAL 他已经说过他正在使用 PDO,所以没有。此外,mysql_* 函数已被弃用,不应使用,即使它们当前可能工作(在这种情况下 mysql_insert_id 不会) 啊好吧,我误解了上下文 我认为,与其在运行 query() 之后使用 lastInsertId(),不如将 lastInsertId 放在 query() 函数中,并且它会在运行 INSERT 查询时返回 lastInsertId 的结果。多谢你们。哈哈:D. 你已经描述了我的答案:) 【参考方案1】:也许您可以在查询函数中分配最后一个插入 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-PDO 记录查询时获取最后一个插入 ID的主要内容,如果未能解决你的问题,请参考以下文章
如何使用聚合函数在 MySQL 查询中获取分组记录的第一条和最后一条记录?