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

时间:2012-05-18 19:50:29

标签: php pdo

在查询成功执行后,我需要使用填充值获取完整查询,(基本上我希望删除查询中带有问号的查询字符串并替换为相应的值)这样我就可以用它来进行事务记录。

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

$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最后执行的ROW。我知道我们可以获得ID但是 我们也得到完整的行?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

如果你使用的是MySQL,你可以在那里登录,他们(很可能)会拥有完整的SQL语句。这是因为默认情况下PDO模拟准备并实际将完整构建的SQL字符串发送到MySQL服务器。来自manual's PDO::setAttribute page

  

PDO :: ATTR_EMULATE_PREPARES 启用或禁用已准备好的模拟   声明。某些驱动程序不支持本机预处理语句或   对他们的支持有限。使用此设置可以强制PDO   始终模拟预准备语句(如果为TRUE),或尝试使用本机语句   准备好的陈述(如果为FALSE)。它将永远回归模仿   准备好的声明,如果司机不能成功准备   当前查询。

PHP开发团队表示,其原因在于仿真在相对较旧的MySQL版本上运行得更快,这些版本仍然在大多数LAMP堆栈安装中。随着越来越多的人使用较新版本的MySQL +本机驱动程序,此默认行为将立即更改。

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