Php 未传递PDO参数,但sprintf为

Php 未传递PDO参数,但sprintf为,php,mysql,pdo,Php,Mysql,Pdo,除非我遗漏了一些非常明显的东西,否则我希望$data1和$data2的值是相同的??但是由于某种原因,当我运行这个场景两次(每次函数调用它运行一次,所以我调用函数两次)时,它会产生不同的结果 调用1:PDO=Blank,Sprintf=3行返回 调用2:PDO=1行,Sprintf=4行(包括PDO行) 有人能告诉我我遗漏了什么,或者为什么这些可能会返回不同的结果吗 $sql = "SELECT smacc.account as Smid,sappr.*,CONCAT('$domain/',fi

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

调用1:PDO=Blank,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 />';
$sql=“选择smac.account作为Smid,sapr.*,CONCAT(“$domain/”,filepath,new_filename)作为映像
从`{$dp}表`.`Territions`pt
连接`{$dp}表`.`approvals`sapr ON pt.approvalID=sapr.ID
加入`{$dp}表`.`sm_accounts`smac ON pt.ID=smac.posted_territory_ID
左联接`{$dp}表`.`upload_images`upimg ON pt.imageID=upimg.ID
其中postID=%s和countryID=%s以及smac.account IN(%s)和languageID=%s”;
echo sprintf($sql、$postID、$countryID、内爆(“,”、$accs)、$langID);
$qry1=$db->prepare(str_replace('%s','?',$sql));
$qry1->execute(数组($postID,$countryID,内爆(',',$accs,$langID));
$data1=$qry1->fetchAll();
打印“PDO”;打印(数据1美元);打印“”;
$qry2=$db->query(sprintf($sql,$postID,$countryID,introde(“,”,$accs),$langID));
$data2=$qry2->fetchAll();
打印“Sprintf”;打印(数据2美元);打印“
”;
是的,因为Kris在查询中提到了这方面的问题。以下链接上的示例5有助于解决此问题:。我尝试使用bindParam(),但似乎不起作用,因此将使用示例5。

问题的根源是
内爆(',',$accs)
函数

当您使用
sprintf()
时,它将生成一个分隔列表,该列表将被注入查询字符串中

结果会是这样的:

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

// or

$query = ... 'IN (' . substr(str_repeat('?,', count($accs)), 0, -1) . ')'
$params = array_merge(array($postID, $countryID), $accs, array($langID));
$qry1->execute($params);
使用PDO绑定同一列表时,它将其作为一个值(字符串:“1,2,3,4,5”)处理。“结果”是这样的:

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

// or

$query = ... 'IN (' . substr(str_repeat('?,', count($accs)), 0, -1) . ')'
$params = array_merge(array($postID, $countryID), $accs, array($langID));
$qry1->execute($params);
注意撇号!->这些查询不完全相同

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

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

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

// or

$query = ... 'IN (' . substr(str_repeat('?,', count($accs)), 0, -1) . ')'
$params = array_merge(array($postID, $countryID), $accs, array($langID));
$qry1->execute($params);
这将为数组中的每个输入值添加一个可绑定的参数位置。现在可以单独绑定参数


您需要为in子句中的每个元素绑定单独的参数