You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将数组传入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:52:32