如何修复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
相关产品推荐
相关产品推荐

