如何将数组传入MySQLi查询?及当前查询仅返回单行问题排查
解决MySQLi查询中数组传入及结果只返回一行的问题
首先看你当前的SQL语句,这里有个明显的逻辑错误:WHERE ownerid = 1 IN(...) 这种写法不对,应该把ownerid = 1和itemid IN(...)用AND连接起来,不然数据库会把ownerid = 1的结果当成IN子句的判断条件,导致结果不符合预期。另外,你用fetch_assoc()只拿到第一行是因为这个方法每次只能获取一行数据,需要循环遍历结果集才能拿到所有行。
下面分两种情况给你解决方案:
一、修正原关联查询(从两个表匹配itemid)
你的需求看起来是要获取ownerid=1的用户库存中,存在于items表的所有itemid,可以用更简洁高效的写法:
方式1:优化子查询
// 修正后的SQL语句 $sql = "SELECT a.itemid FROM inventories AS a WHERE a.ownerid = 1 AND a.itemid IN (SELECT itemid FROM items)"; $result = $mysqli->query($sql); // 循环遍历所有结果 if ($result->num_rows > 0) { while ($row = $result->fetch_assoc()) { echo "itemid: " . $row["itemid"] . "<br>"; } } else { echo "没有匹配的结果"; } // 释放结果集资源 $result->free();
方式2:用JOIN替代子查询(性能更优)
如果数据量较大,JOIN的执行效率通常比子查询更高:
$sql = "SELECT DISTINCT a.itemid FROM inventories AS a JOIN items AS b ON a.itemid = b.itemid WHERE a.ownerid = 1"; $result = $mysqli->query($sql); // 同样循环获取所有行 while ($row = $result->fetch_assoc()) { echo "itemid: " . $row["itemid"] . "<br>"; } $result->free();
二、如果需要传入外部数组到IN子句
假设你有一个外部的itemid数组,要传入查询中,一定要用预处理语句避免SQL注入,示例代码如下:
// 示例数组 $targetItemIds = [101, 102, 103]; // 创建与数组长度匹配的占位符(?) $placeholders = implode(',', array_fill(0, count($targetItemIds), '?')); // 构建预处理SQL $sql = "SELECT itemid FROM inventories WHERE ownerid = 1 AND itemid IN ($placeholders)"; // 初始化预处理语句 $stmt = $mysqli->prepare($sql); // 绑定参数:这里假设itemid是整数,用'i'表示;如果是字符串则用's' $paramTypes = str_repeat('i', count($targetItemIds)); // PHP 5.6+支持展开运算符(...) $stmt->bind_param($paramTypes, ...$targetItemIds); // 执行查询 $stmt->execute(); // 获取结果集 $result = $stmt->get_result(); // 遍历结果 while ($row = $result->fetch_assoc()) { echo "itemid: " . $row["itemid"] . "<br>"; } // 关闭语句 $stmt->close();
最后提醒一下:每次用完结果集后记得调用free()释放资源,避免内存浪费;如果是预处理语句,要记得关闭语句对象。
内容的提问来源于stack exchange,提问作者J. Dawe
相关产品推荐
相关产品推荐

