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

如何修复mysqli_store_result()期望参数1为mysqli却传入对象的错误?

问题分析与修复方案

嘿,我看了你的代码,发现几个核心问题,这应该就是你搞不定参数、拿不到正确结果的原因,咱们一个个来解决:

主要问题点

  • 严重的SQL注入风险:直接把$_GET['id']拼进SQL语句里,这是非常危险的操作,恶意用户可以轻松篡改你的数据库查询。
  • mysqli_stmt_num_rows使用错误:你用mysqli_query()返回的是mysqli_result结果集对象,而mysqli_stmt_num_rows()是给预处理语句对象用的,这里应该用mysqli_num_rows()。不过更推荐用预处理语句来处理查询,这样更安全也更规范。
  • 重复执行数据库选择:mysqli_connect()的第四个参数已经指定了要连接的数据库first_db,后面的mysqli_select_db()完全是多余的,可以删掉。
  • 会话未初始化:使用$_SESSION变量之前必须调用session_start(),否则会话变量根本不会生效,$_SESSION['id']也就存不进去。
  • 缺少错误处理:没有检查数据库连接是否成功、查询是否执行成功,出问题了你也看不到具体的错误信息,很难排查。

修正后的代码

// 初始化会话
session_start();

// 获取并处理参数
$id = isset($_GET['id']) ? $_GET['id'] : '';
$_SESSION['id'] = $id;

// 数据库连接
$link = mysqli_connect("localhost", "root", "", "first_db");
// 检查连接是否成功
if (!$link) {
    die("数据库连接失败: " . mysqli_connect_error());
}

// 使用预处理语句(彻底避免SQL注入)
$query = mysqli_prepare($link, "SELECT * FROM list WHERE id = ?");
// 绑定参数:"i"表示整数类型,若id是字符串则用"s"
mysqli_stmt_bind_param($query, "i", $id);
mysqli_stmt_execute($query);
// 存储结果后才能获取行数
mysqli_stmt_store_result($query);
$count = mysqli_stmt_num_rows($query);

// 可选:获取查询到的具体数据
mysqli_stmt_bind_result($query, $id_col, $other_col...); // 替换为你表中的实际列名
while (mysqli_stmt_fetch($query)) {
    // 处理每行数据,比如输出或存储
    echo "ID: $id_col";
}

// 关闭资源
mysqli_stmt_close($query);
mysqli_close($link);

额外建议

  • 开发环境下开启错误提示,方便快速排查问题:
error_reporting(E_ALL);
ini_set('display_errors', 1);
  • 永远不要信任用户输入的任何数据,预处理语句是防止SQL注入的最佳实践,一定要养成这个习惯。

内容的提问来源于stack exchange,提问作者Saige

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:11:45