MYSQLI - 数组中的位置[重复]

问题描述 投票:0回答:2

我在网上到处寻找这个问题的答案,然后出现了准备好的语句和绑定参数(我不知道那是什么东西)

基本上,我有一个逗号分隔的列表

$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语句的错误。我不明白为什么它不起作用。

php mysql mysqli where-clause
2个回答
7
投票

先在数组中展开

$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   

2
投票

我怀疑只要查询不返回行,你就会得到那个未定义的变量。我们没有看到变量在任何地方定义/初始化,除了在获取一行之后。

至于查询不返回行的原因,您的查询等同于

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

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

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

请注意,这是三个单独的字符串文字,以逗号分隔。逗号是 SQL 语句的一部分,而不是值的一部分。这将返回列内容包含“食物”的行。或“喝”。或“烹饪”。

这就是为什么您的查询“不起作用”。

© www.soinside.com 2019 - 2024. All rights reserved.