我希望这是非常明显的:我正在寻找用给定数组中的元素替换字符串中的重复元素的最快方法,例如:用于SQL查询和参数替换。
$query = "SELECT * FROM a WHERE b = ? AND c = ?";
$params = array('bee', 'see');
这里我想替换实例?使用相应的有序数组元素,如下所示:
SELECT * FROM a WHERE b = 'bee' and c = 'see'
我看到这可能是使用preg_replace_callback
完成的,但这是最快的方式还是我错过了一些明显的东西?
编辑:我已经在使用准备好的语句来实现上述目标。我正在寻找一种方法来将原始查询恢复为调试输出的一部分。
答案 0 :(得分:2)
您在寻找prepared statements吗?
<?php
$stmt = $dbh->prepare("SELECT * FROM REGISTRY where name = ?");
if ($stmt->execute(array($_GET['name']))) {
while ($row = $stmt->fetch()) {
print_r($row);
}
}
?>
答案 1 :(得分:1)
使用PDO to do your SQL queries。它执行参数化查询,因此您无需滚动自己的方法。
有关更通用的方法,请参阅sprintf()
(它不会转义数据以使其安全,因此请勿将其用于数据库访问)。
答案 2 :(得分:1)
我还建议使用PDO,因为@David Dorward已经建议。然后:
$stmt = $dbh->prepare('SELECT * FROM a WHERE b = ? AND c = ?');
$stmt->execute(array('bee', 'see'));
答案 3 :(得分:0)
我曾经在继承的代码库中找到以下内容,我认为这是进行这些替换的一种很好的方式:
function do_substitution($query, $params) {
$params = array_unshift($params, $query);
$query = call_user_func_array('sprintf', $params);
return $query;
}
当然,你用%s代替%s,%d等标记。
答案 4 :(得分:0)
被问到后这几年发现了。对于其他任何寻找和不满意其他答案的人。这就是我最终做到的方式:
echo preg_replace(array_fill(0,count($params),'/\?/'),$params,$query,1);
注意:这完全用于调试,不进行数据清理。
如果你知道每个参数的预期数据类型,可以扩展它,以便在值周围添加任何引号。这些是在使用sqlsrv_query($ conn,$ query,$ params)之类的东西时自动创建的;