如何在使用 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 查询中获取分组记录的第一条和最后一条记录?

单击添加新按钮并使用php-pdo将数据插入数据库时​​如何生成2个新输入字段[关闭]

获取查询集中的最后一条记录

如何从 sql 查询中获取第一条和最后一条记录?

sql查询获取已删除记录

如果同时插入两条记录,如何获取最后一个ID