此问题已经在这里有了答案:
我使用PDO debugDumpParams()来获取我的最后一个查询,因此输出为字符串形式,例如:
SQL: [36] SELECT * FROM terminals WHERE id=:id Sent SQL: [36] SELECT * FROM terminals WHERE id='5' Params: 1 Key: Name: [3] :id paramno=-1 name=[3] ":id" is_param=1 param_type=2
并且我正在寻找一种仅提取完整的SQL查询的明智方法:
SELECT * FROM terminals WHERE id='5'
当前我使用这个:
function pdo_debug($stmt) {
ob_start();
$stmt->debugDumpParams();
$debug = ob_get_contents();
$from = "Sent SQL: ";
$to = "Params: ";
$result1 = strpos($debug, $from) + strlen($from);
$result2 = strpos($debug, $to) - $result1;
$result3 = substr($debug, $result1, $result2);
$result = substr($result3, strpos($result3, " "));
ob_end_clean();
return trim($result);
}
而且我想我们所有人都可以同意它的解决方案不是很不错:)
您能提出更好的解决方案吗?
编辑:甚至更好的是,我正在寻找的是将该字符串拆分为包含所有值(SQL,Sent SQL,Params,Key,Name)的数组-等等,我并不真正地完全理解这个字符串的真实性组装。
我在这里将preg_match
用于正则表达式选项:
$input = "SQL: [36] SELECT * FROM terminals WHERE id=:id Sent SQL: [36] SELECT * FROM terminals WHERE id='5' Params: 1 Key: Name: [3] :id paramno=-1 name=[3] \":id\" is_param=1 param_type=2";
preg_match('/Sent SQL: \[\d+\] (.*?) Params:/', $input, $matches);
echo $matches[1];
此打印:
SELECT * FROM terminals WHERE id='5'
这里的策略是捕获标记Sent SQL:
和Params:
之间的所有内容。