gpt4 book ai didi

php - PDO 参数未传递,但 sprintf 已传递

转载 作者:行者123 更新时间:2023-11-29 12:35:17 25 4
gpt4 key购买 nike

除非我遗漏了一些非常明显的东西,否则我希望 $data1 和 $data2 的值相同?但由于某种原因,当我运行此场景两次(每个函数调用运行一次,因此我调用该函数两次)时,它会产生不同的结果。

调用 1:PDO = 空白,Sprintf = 返回 3 行

调用 2:PDO = 1 行,Sprintf = 4 行(包括 PDO 行)

有人可以告诉我我错过了什么或者为什么这些可能会返回不同的结果吗?

$sql = "SELECT smacc.account as Smid,sappr.*,CONCAT('$domain/',filepath,new_filename) as Image
FROM `{$dp}table`.`territories` pt
JOIN `{$dp}table`.`approvals` sappr ON pt.approvalID = sappr.ID
JOIN `{$dp}table`.`sm_accounts` smacc ON pt.ID = smacc.posted_territory_id
LEFT JOIN `{$dp}table`.`uploaded_images` upimg ON pt.imageID = upimg.ID
WHERE postID = %s AND countryID = %s AND smacc.account IN (%s) AND languageID = %s";

echo sprintf($sql,$postID,$countryID,implode(',',$accs),$langID);

$qry1 = $db->prepare(str_replace('%s','?',$sql));
$qry1->execute(array($postID,$countryID,implode(',',$accs),$langID));
$data1 = $qry1->fetchAll();

print'<pre><h1>PDO</h1>';print_r($data1);print'</pre>';

$qry2 = $db->query(sprintf($sql,$postID,$countryID,implode(',',$accs),$langID));
$data2 = $qry2->fetchAll();

print'<pre><h1>Sprintf</h1>';print_r($data2);print'</pre><hr />';

最佳答案

问题的根源是 implode(',',$accs) 函数。

当您使用sprintf()时,它将生成一个逗号分隔的列表,并且该列表将被注入(inject)到查询字符串中。

结果将是这样的:

smacc.account IN (1,2,3,4,5)

当您使用 PDO 绑定(bind)同一列表时,它会将其作为一个值(字符串:'1,2,3,4,5')处理。 “结果”将是这样的:

smacc.account IN ('1,2,3,4,5')

注意撇号! -> 查询不相同。

简而言之,当您使用 PDO 和绑定(bind)参数时,您必须单独绑定(bind)每个值(不能将列表作为字符串传递)。

您可以根据输入数组生成查询,如下所示:

$query = ... 'IN (?' . str_repeat(', ?', count($accs)-1) .  ')' ...

// or

$query = ... 'IN (' . substr(str_repeat('?,', count($accs)), 0, -1) . ')'

这将为数组中的每个输入值添加一个可绑定(bind)参数位置。现在您可以单独绑定(bind)参数。

$params = array_merge(array($postID, $countryID), $accs, array($langID));
$qry1->execute($params);

关于php - PDO 参数未传递,但 sprintf 已传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26883286/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com