匹配SQL查询中的绑定参数

时间:2012-01-13 14:30:21

标签: php sql regex

我使用参数化查询,如下所示:

SELECT * FROM foo WHERE bar = :p0 AND baz = :p1

我的参数名称采用以下形式:

^:[a-z]\d+$

我正在扩展PDOStatement以提供转储完全构造的查询的方法,因为PDOStatement::queryString没有替换绑定参数值。

将查询中的这些参数与正则表达式进行匹配的最准确方法是什么?

不太准确的初始尝试:

$sql = "SELECT * FROM foo WHERE bar = 'bar:a0bar :u2 barbar :w4' AND baz = :q2 AND boz IN (:z6, :yy1, :q, :r22, :b7)";
$matches = array();
preg_match_all('/(:[a-z]\d+)\b/', $sql, $matches);
$params = $matches[1];

这会失败,因为字符串中的参数是匹配的,但我不确定是否可以避免这种情况。

请记住,我完全知道没有方法会100%准确,这只是为了将构造的查询转储到日志文件以帮助调试,因此生成的查询将不会被发送到执行数据库。

2 个答案:

答案 0 :(得分:0)

我相信我目前使用的解决方案可能是最实用的。除此之外的任何事情似乎都会增加不必要的复杂性。

答案 1 :(得分:-1)

当我使用PDO时,我传递了一个绑定参数数组,然后我可以将SQL语句和数组一起记录下来。

如果您尝试将参数替换为SQL语句,结果将不会考虑任何转义PDO将对您的参数执行的操作。