PDO将数组绑定到Where IN


PDO bind array to Where IN

我想将字符串数组绑定到SQL命令的WHERE IN部分,然后在SQL Server上运行该命令。问题可能是我试图绑定字符串数组,而不是整数数组。

$totalCount = 
"SELECT referral, COUNT(username) AS cnt FROM accounts
WHERE referral IN ($refIdsPartial) GROUP BY referral";
$ps_totalCounts = $dbh->prepare($totalCount);
$ps_totalCounts->execute();
//loop over total counts
foreach($ps_totalCounts as $row){
    echo "Test<br>";
}

我为你回复了$refIdsPartial,所以你知道这是什么:

54469c27c687b332339627,54469ba0dec3e703865612,54469c77945c7091266617

它只是一个内爆的字符串/varchars数组。我用Managementstudio测试了SQL命令,只要我对每个String/Varghar使用引号,我就可以确保这个SQL命令有效。示例:

SELECT referral, COUNT(username) AS cnt FROM accounts
WHERE referral IN ('54469c27c687b332339627','54469ba0dec3e703865612') GROUP BY referral

我的问题:

在上面的代码中,它从未进入foreach,因此Query的结果似乎是空的。哪里出了问题(当然我只测试了应该有结果的查询)?

您可以使用一些字符串操作。

您可以使用str_repeat("?", count(explode(",", $refIdsPartial))) count所需的?数量。这将创建占位符。

$totalCount = 
"SELECT referral, COUNT(username) AS cnt FROM accounts
WHERE referral IN (". str_repeat("?,", count(explode(",", $refIdsPartial))-1) . "?) GROUP BY referral";

现在占位符已经就位,您可以从字符串中分解,并执行

$ps_totalCounts->execute( explode(",", $refIdsPartial) );

以下是我在尝试用数组实现IN语句时使用的片段。

这是动态工作的,所以无论您有一个2或200的数组,它都应该按预期执行。

$ids = array(1,2,3);
$in  = str_repeat('?,', count($ids) - 1) . '?';
$sql = "SELECT * FROM table WHERE column IN ($in)";
$stm = $db->prepare($sql);
$stm->execute($ids);
$data = $stm->fetchAll();

你的代码看起来是这样的:

$refIdsPartial = array('54469c27c687b332339627','54469ba0dec3e703865612','54469c77945c7091266617');
$in  = str_repeat('?,', count($refIdsPartial ) - 1) . '?';
$totalCount = "SELECT referral, COUNT(username) AS cnt FROM accounts WHERE referral IN ($in) GROUP BY referral";
$ps_totalCounts = $dbh->prepare($totalCount);
$ps_totalCounts->execute();
//loop over total counts
foreach($ps_totalCounts as $row)
{
    echo "Test<br>";
}

我遇到了类似的问题,需要绑定相当大的数组。我没有跳过绑定并直接注入整个数组进行查询,也没有通过动态生成多个唯一占位符来绑定数组的每个记录来解决问题,而是使用了find_in_set-mysql函数。点击此处阅读更多信息。

在您的情况下,它将是:

$totalCount = 
"SELECT referral, COUNT(username) AS cnt FROM accounts
WHERE find_in_set(referral,$refIdsPartial) GROUP BY referral";