使用MySQL IN()的PHP PDO bindValue?

时间:2012-11-21 07:38:37

标签: php mysql pdo

我的这个查询什么都不返回。它不会引发任何错误。在这个网站上找不到解决方案。这有什么不对?

$query = "SELECT * FROM `votes` WHERE `tags` IN (:tags)";
$stmt = $dbh->prepare($query);
$stmt->bindValue(':tags', 'one, two, three');
$stmt->execute();
// 0 results, should be more

3 个答案:

答案 0 :(得分:3)

无论你使用bindParam()还是bindValue(),这都不会做你想要的。

SQL查询参数仅取代一个值。您不能绑定包含逗号的字符串,并将其解释为多个值。您需要为列表中的每个不同值添加一个参数占位符。

此外,您根本不需要使用PDO绑定参数值。您可以将数组传递给execute()。在这种情况下,我使用位置参数而不是命名参数。 PDO支持两者,但不要在一个查询中混合它们。

$query = "SELECT * FROM `votes` WHERE `tags` IN (?, ?, ?)";
$stmt = $dbh->prepare($query);
$params = explode(', ', 'one, two, three');
$stmt->execute($params);

答案 1 :(得分:1)

您的绑定值有错误。

$stmt->bindValue(':tags', 'one, two, three');

应该是

$stmt->bindValue(':tags', "'one', 'two', 'three'");

答案 2 :(得分:-3)

尝试使用PDO :: bindParam代替。

$query = "SELECT * FROM `votes` WHERE `tags` IN (:tags)";
$stmt = $dbh->prepare($query);
$stmt->bindParam(':tags', implode(",", array('one, two, three')));
$stmt->execute();

虽然使用implode有点击败了bind的最初目的,但是stringified数组被绑定而不是原始数组。