我在网上到处寻找这个问题的答案,然后出现了准备好的语句和绑定参数(我不知道那是什么东西)
基本上,我有一个逗号分隔的列表
$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语句的错误。我不明白为什么它不起作用。
先在数组中展开
$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
我怀疑只要查询不返回行,你就会得到那个未定义的变量。我们没有看到变量在任何地方定义/初始化,除了在获取一行之后。
至于查询不返回行的原因,您的查询等同于
... WHERE stuff = 'food, drink, cooking'
这是一个单一的字符串文字。如果列内容等于该字符串,查询只会返回行。该字符串中的逗号只是值的一部分。如果您想查找 stuff 包含任何值的行,您的查询需要采用以下形式:
... WHERE stuff IN ('food','drink','cooking')
请注意,这是三个单独的字符串文字,以逗号分隔。逗号是 SQL 语句的一部分,而不是值的一部分。这将返回列内容包含“食物”的行。或“喝”。或“烹饪”。
这就是为什么您的查询“不起作用”。