PHP使用mysqli执行多条MySQL SELECT查询报num_rows非对象错误如何解决
问题原因
mysqli::query()默认不支持一次性执行多条SQL语句,你将两条SELECT语句拼接在同一个字符串中传入该方法时,方法执行失败返回了false而非mysqli_result对象,因此尝试访问false的num_rows属性就触发了非对象属性访问的Notice报错。
解决方案
提供两种可选实现方式,优先推荐方案1:
方案1:合并为单条SQL查询(性能更高,逻辑更简单)
你的两条查询逻辑一致、仅查询的IP值不同,可以直接合并为单条SQL执行,无需使用多查询逻辑:
<?php require('configuration.php'); // 创建连接 $conn = new mysqli($db_host, $db_username, $db_password, $db_name); // 检查连接 if ($conn->connect_error) { die("连接失败: " . $conn->connect_error); } // 合并查询,IN匹配多个IP值 $query = "SELECT * FROM `table` WHERE `ip` IN ('1.1.1.1', '2.2.2.2')"; $result = $conn->query($query); // 先判断查询返回结果是否为合法对象再操作 if ($result && $result->num_rows > 0) { // 输出每行数据 while($row = $result->fetch_assoc()) { echo "ID: " . $row["id"]. "<br>IP:" . $row["dedicatedip"]. "<br><br>"; } } else { echo "0 结果"; } $conn->close();
如果需要保留LIKE模糊匹配逻辑,将WHERE条件改为WHERE ipLIKE '1.1.1.1' ORip LIKE '2.2.2.2'即可。
方案2:使用mysqli::multi_query()执行多条查询
如果确实需要分开执行多条独立的SQL语句,可以使用mysqli专门的多查询方法,逐次获取每一条语句的结果集:
<?php require('configuration.php'); // 创建连接 $conn = new mysqli($db_host, $db_username, $db_password, $db_name); // 检查连接 if ($conn->connect_error) { die("连接失败: " . $conn->connect_error); } $query = "SELECT * FROM `table` WHERE `ip` LIKE '1.1.1.1';"; $query .= "SELECT * FROM `table` WHERE `ip` LIKE '2.2.2.2'"; // 执行多查询 if ($conn->multi_query($query)) { do { // 获取当前查询的结果集 if ($result = $conn->store_result()) { if ($result->num_rows > 0) { while ($row = $result->fetch_assoc()) { echo "ID: " . $row["id"]. "<br>IP:" . $row["dedicatedip"]. "<br><br>"; } } else { echo "当前查询无结果<br><br>"; } $result->free(); } // 检查是否存在下一个结果集 } while ($conn->more_results() && $conn->next_result()); } else { echo "查询执行失败:" . $conn->error; } $conn->close();
注意:如果SQL中的查询值来自用户输入,必须使用预处理语句做参数绑定,禁止直接拼接字符串到SQL语句中,避免SQL注入风险。
内容的提问来源于stack exchange,提问作者Saeed
相关产品推荐
相关产品推荐

