在 PHP + PDO 中获取上次执行的查询的详细信息,或使用相应的条目填充查询中的问号


In PHP + PDO fetch the details of the query last executed or fill the question marks in query with corresponding entries

查询成功执行后,我需要获取带有填充值的完整查询(基本上我希望删除查询中带有问号的查询字符串并替换为相应的值(,以便我可以将其用于事务日志记录。

以下是我正在使用的代码行

$stmt1 = $dbh->prepare("INSERT INTO announcements(id,routeID,ServiceAdvisoryID,ServiceAdvisoryDetailsId) 
VALUES (?,?,?,?)");
        $stmt1->execute(array($aid,$route,$anctype,$announcementid));

用于事务日志记录的查询是

    $transactionText = "INSERT INTO announcements(id,routeID,ServiceAdvisoryID,ServiceAdvisoryDetailsId) VALUES (?,?,?,?)";
$stmt2 = $dbh->prepare("insert into transactionLog_tbl(userName,transactionTypeId,transactionTime,transactionText)values(?,?,?,?)");
            $stmt2->execute(array($_SESSION['username'],1,date("y.d.m"),$transactionText));

我希望交易文本中填充相应的值的问号。

否则

我可以获取 PDO 上次执行的行吗?我知道我们可以得到身份证,但是凸轮我们也得到完整的行?

任何帮助将不胜感激。

如果你使用的是MySQL,你可以在那里登录,他们(很可能(会有完整的SQL语句。这是因为PDO默认模拟准备并实际将完全构建的SQL字符串发送到MySQL服务器。从手册的PDO::setAttribute页面:

PDO::ATTR_EMULATE_PREPARES 启用或禁用已准备好的模拟 语句。某些驱动程序不支持本机预准备语句或 对他们的支持有限。使用此设置可强制 PDO 执行任一操作 始终模拟预准备语句(如果为 TRUE(,或尝试使用本机语句 预准备语句(如果为 FALSE(。它将始终回退到模拟 准备好的语句(如果驱动程序无法成功准备 当前查询。

PHP开发团队指出,这样做的原因是仿真在相对较旧的MySQL版本上执行得更快,这些版本仍在大多数LAMP堆栈安装上。此默认行为设置为随着更多人使用较新版本的 MySQL + 本机驱动程序而立即更改。

否则,您可以自己构造完整的 SQL,因为您已经同时拥有语句和参数。