gpt4 book ai didi

php - MySQL IN 子句 - 字符串和 INT 比较

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

我有一个存储过程,它接受单个字符串参数 - 传递到该参数的值是来自 PHP 的逗号分隔的 ID 列表 - 类似于 2,3,4,5

`DECLARE tags_in            VARCHAR(255);`

在存储过程中,我想选择具有与参数中的 id 相对应的 id 的行 - 查询如下

`SELECT * from tags WHERE tag_id IN (tags_in)`

我使用以下语句将值从 PHP 传递到 MySQL

`$stmt->bindParam(':tags', '2,3,4', PDO::PARAM_STR);`

问题 - MySQL 执行的实际查询如下 - 传入的参数被视为一个字符串

`SELECT * from tags WHERE tag_id IN ('2,3,4')`

当我要执行的查询如下时,参数被视为单独的整数

`SELECT * from tags WHERE tag_id IN (2,3,4)`

对我能完成这个任务有什么建议吗?

最佳答案

SQL 占位符只能表示单个值。如果您传入一些逗号分隔的值,它们不会被视为带有逗号的多个单独值,它们只会被视为一个整体字符串。

例如

... WHERE foo IN (:bar)
... WHERE foo = :bar

就 SQL 解析器而言,它们在功能上是相同的,并且不会允许传入 CSV 值。两者都会以相同的方式执行:

... WHERE foo IN ('1,2,3')
... WHERE foo = '1,2,3'

您要么必须将自己限制为占位符的值,要么动态构建 SQL 并为您尝试放入 IN 中的每个单独值放入一个占位符> 条款。

例如

$placeholders = array_fill(0, count($values_to_check) -1, '?');
$in_clause = implode(',', $placeholders);
/// builds ?,?,?,?,?,....?

$sql = "SELECT ... WHERE foo IN ($in_clause)";
$stmt = $dbh->prepare($sql);
$stmt->execute($values_to_check);

这是准备好的语句一败涂地的地方,你必须回到古老的“动态构建一些sql”。

关于php - MySQL IN 子句 - 字符串和 INT 比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26512902/

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