【发布时间】:2012-02-09 17:53:46
【问题描述】:
我使用参数化查询,如下所示:
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% 准确的,这只是为了将构造的查询转储到日志文件以帮助调试,所以 生成的查询不会发送到执行数据库。
【问题讨论】: