【问题标题】:How to use PDO prepared statements with IN clause? [duplicate]如何使用带有 IN 子句的 PDO 准备语句? [复制]
【发布时间】:2016-10-16 02:10:42
【问题描述】:

我在 MySQL 内部的一个字段中存储了一些数据,格式如下:1,5,9,4
我将此字段命名为相关。现在我想在带有 PDOIN 子句 中使用这个字段。我将该字段内容存储在$related variabe 中。这是我的下一个代码:

$sql = "SELECT id,title,pic1 FROM tbl_products WHERE id IN (?) LIMIT 4";
$q = $db->prepare($sql);
$q->execute(array($related));
echo $q->rowCount();

但执行此代码后,我只能获取一条记录,而我必须获取 4 条记录(1、5、9、4)。我做错了什么?

【问题讨论】:

标签: php mysql pdo prepared-statement in-clause


【解决方案1】:

您需要与“IN”值一样多的? 占位符。

所以:

$related = array(1,2,3); // your "IN" values

$sql = "SELECT id,title,pic1 FROM tbl_products WHERE id IN (";

$questionmarks = "";
for($i=0;$i<count($related);$i++)
{
    $questionmarks .= "?,";
}

$sql .= trim($questionmarks,",");
$sql .= ") LIMIT 3;";

// echo $sql; // outputs: SELECT id,title,pic1 FROM tbl_products WHERE id IN (?,?,?) LIMIT 3;

$q = $db->prepare($sql);
$q->execute($related); // edited this line no need to array($related), since $related is already an array
echo $q->rowCount();

https://3v4l.org/No4h1

(如果您希望返回 4 条记录,请去掉 LIMIT 3

您可以更优雅地使用str_repeat 来附加您的占位符,如下所示:

$related = array(1,2,3); // your "IN" values

$sql = "SELECT id,title,pic1 FROM tbl_products WHERE id IN (";
$sql .= trim(str_repeat("?,",count($related)),",");
$sql .= ") LIMIT 3;";

// echo $sql; // outputs: SELECT id,title,pic1 FROM tbl_products WHERE id IN (?,?,?) LIMIT 3;

$q = $db->prepare($sql);
$q->execute($related); // edited this line no need to array($related), since $related is already an array
echo $q->rowCount();

https://3v4l.org/qot2k

另外,通过再次阅读您的问题,我可以猜测您的$related 变量只是一个string,其值以逗号分隔,例如1,40,6,99。如果是这种情况,您需要将其设为array。做:$related = explode($related,","); 使其成为一个数字数组。然后在您的execute 方法中按原样传递$related

【讨论】:

    【解决方案2】:

    使用命名占位符

    $values = array(":val1"=>"value1", ":val2"=>"value2", ":val2"=>"$value3");
    $statement = 'SELECT * FROM table WHERE `column` in(:'.implode(', :',array_keys($values)).')';
    

    使用 ??

    $values = array("value1", "value2", "$value3");
    $statement = 'SELECT * FROM table WHERE `column` in('.trim(str_repeat(', ?', count($values)), ', ').')';
    

    【讨论】:

    • 当然帮助了我!!我不知道为什么它被否决了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-16
    • 2012-11-29
    • 1970-01-01
    • 2016-12-16
    • 1970-01-01
    相关资源
    最近更新 更多