代替 ”?”带有数组数据[重复]
Posted
技术标签:
【中文标题】代替 ”?”带有数组数据[重复]【英文标题】:Replace "?" with array data [duplicate] 【发布时间】:2017-09-05 14:32:03 【问题描述】:我正在使用使用 PDO 进行请求的软件。数据库请求是这样的:
$query = "SELECT * FROM res_attachments WHERE res_id = ? AND status = ?";
$data = array('152', 'DEL');
我的问题是,如何使用“?”获取整个请求替换为 $data 元素?我在查询后得到这个信息($query 和 $data),我只需要“合并”它。我必须做一个动态的东西,才能处理带有 2 个 arg 或 10 个 args 的请求。
我想要的结果必须是这样的:
"SELECT * FROM res_attachments WHERE res_id = '152' AND status = 'DEL'"
解决方案
对于那些有类似问题的人,这是我提出的解决方案:
$query = "SELECT * FROM res_attachments WHERE res_id = ? AND status = ?";
$data = array('152', 'DEL');
$tab = explode("?",$query);
for($i =0; $i < count($tab); $i++)
$Request .= $tab[$i] . "'" . $data[$i] . "'";
$finalRequest = str_replace('\'\'', '', $Request); // delete the double quote at the end
var_dump($finalRequest);
【问题讨论】:
阅读更多 php.net/manual/en/pdo.prepare.php 声明必须准备好将值绑定到它。query
用于执行没有绑定参数的查询。您将在文档中找到所有内容。
您的问题不清楚。请编辑并解释您所说的“没有”?
@SloanThrasher 我已经编辑了我的问题 :)
我不认为给出答案的人(到目前为止)完全理解这个问题。
是的@Fred-ii-,我已经更新了我的初始问题,尽可能清楚
【参考方案1】:
你要找的是prepare()
然后执行而不是query()
query()
运行标准 SQL 语句,并要求您正确转义所有数据以避免 SQL 注入和其他问题。
这就是你想要的:
<?php
$query = "SELECT * FROM res_attachments WHERE res_id = ? AND status = ?";
$data = array($res_id, $status);
$stmt = $db->prepare($query);
if($stmt->execute($data))
//fetch your results
?>
或:
<?php
$query = "SELECT * FROM res_attachments WHERE res_id = :id AND status = :status";
$stmt = $db->prepare($query);
if ($stmt->execute(array(
':id' => $res_id,
':status' => $status
)))
//fetch results
?>
更新:
我想要的结果应该是这样的:
SELECT * FROM res_attachments WHERE res_id = '152' AND status = 'DEL'
然后您可以简单地使用debugDumpParams()
,它将准备好的语句包含的信息直接转储到输出中。它将提供正在使用的SQL查询,使用的参数个数(Params),
<?php
$query = "SELECT * FROM res_attachments WHERE res_id = ? AND status = ?";
$data = array($res_id, $status);
$stmt = $db->prepare($query);
if($stmt->execute($data))
$stmt->debugDumpParams();
?>
【讨论】:
这不是我真正想要的。我已经更新了我最初的问题,可能还不够清楚:/ 我重新更新我最初的问题,因为我无法修改查询的执行,我只是将请求和参数放在一个数组中 @Nathan30 更新了我的答案 是的,我明白了,谢谢。但是当我使用 debugDumpParams() 时,我有 arg 的数量,但没有值。而且我不能使用准备然后执行。请求使用查询,我只有字符串请求和参数数组【参考方案2】:如果你的代码 sn-p 中的 $db 是 PDO 的一个实例,那么你可以使用 debugDumpParams() 来查看 SQL
【讨论】:
【参考方案3】:希望对你有帮助,试试这个
$sth = $db->prepare('SELECT * FROM res_attachments WHERE res_id = ? AND status = ?');
$sth->bindParam(1, $res_id, PDO::PARAM_INT);
$sth->bindParam(2, $status, PDO::PARAM_STR);
$sth->execute();
或
$q = $db -> prepare('SELECT * FROM res_attachments WHERE res_id = ? AND status = ?');
$q->execute(array($res_id,$status));
【讨论】:
这不是我真正想要的。我已经更新了我最初的问题,可能还不够清楚:/ 这个怎么样? $q = $db -> prepare('SELECT * FROM res_attachments WHERE res_id = ? AND status = ?'); $q->执行(数组($res_id,$status)); 我重新更新我最初的问题,因为我无法修改查询的执行,我只是将请求和参数放在一个数组中【参考方案4】:试试这个,我用的方法preg_replace_callback
:
$index = -1;
echo preg_replace_callback(
'/\?/',
function () use ($data, &$index)
$index++;
return "'$data[$index]'";
,
$query);
【讨论】:
以上是关于代替 ”?”带有数组数据[重复]的主要内容,如果未能解决你的问题,请参考以下文章