代替 ”?”带有数组数据[重复]

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);

【讨论】:

以上是关于代替 ”?”带有数组数据[重复]的主要内容,如果未能解决你的问题,请参考以下文章

有啥可以代替多维数组?

两个带有json键的数组[重复]

如何将带有数组的字符串转换为数组[重复]

带有php数组的Mysql SELECT语句[重复]

带有php数组的Mysql SELECT语句[重复]

将数据数组转换为具有属性的对象[重复]