php MYSQLI - WHERE IN数组[重复]

jvidinwx  于 2023-03-16  发布在  PHP
关注(0)|答案(2)|浏览(124)

此问题在此处已有答案

How can I bind an array of strings with a mysqli prepared statement?(7个答案)
六年前关闭了。
我在网上到处寻找这个问题的答案,出现了预准备语句和绑定参数(我不知道那是什么东西)
基本上,我有一个逗号分隔的列表

$list = 'food, drink, cooking';

好了,现在我想在数据库的一列中搜索这些项中的每一项......听起来很简单,对吧?

$query = "SELECT * FROM table WHERE stuff IN ('$list')";
$runquery = mysqli_query($connection, $query);
while($row = mysqli_fetch_array($runquery,MYSQLI_ASSOC)){
    $variable = $row;
}

后来,

var_dump($variable);

未定义变量
为什么?我看不出代码有什么问题。如果我输入一个特定的值,它就可以工作,而且我已经用WHERE stuff=$item测试过了-它工作得很好。
所以不是变量/数据库的问题,而是IN语句的错误,我不明白为什么它不起作用。

sqserrrh

sqserrrh1#

先在数组中分解

$list = explode(', ', 'food, drink, cooking');

然后使用单独的占位符将每个元素绑定到查询中。

$in    = str_repeat('?,', count($list) - 1) . '?'; // placeholders
$sql   = "SELECT * FROM table WHERE stuff IN ($in)"; // sql
$stmt  = $mysqli->prepare($sql); // prepare
$types = str_repeat('s', count($array)); //types
$stmt->bind_param($types, ...$array); // bind array at once
$stmt->execute();
$result = $stmt->get_result(); // get the mysqli result
$data = $result->fetch_all(MYSQLI_ASSOC); // fetch the data
7xllpg7q

7xllpg7q2#

我怀疑,任何时候查询没有返回一行,你就会得到那个未定义的变量,我们看不到变量是在任何地方定义/初始化的,除非在获取一行之后。
至于查询不返回行的原因,您的查询等效于

... WHERE stuff = 'food, drink, cooking'

这是单个字符串文字。查询只返回列填充值等于该字符串的行。字符串中的逗号只是值的一部分。如果要查找填充值包含任何值的行,则查询需要采用以下形式:

... WHERE stuff IN ('food','drink','cooking')

请注意,这是三个单独的字符串文字,用逗号分隔。逗号是SQL语句的一部分,而不是值的一部分。这将返回列内容包含“food”、“drink”或“cooking”的行。
这就是为什么你的查询“不起作用”。

相关问题