PHP报错:Cannot use object of type mysqli_result as array 求助
问题原因分析
你遇到的这个致命错误,核心问题出在把mysqli_result查询结果对象当成普通数组来操作了。看你代码里的这段逻辑:
$location_result=$conn->query($all_location); while($row=mysqli_fetch_assoc($location_result)){ $location_result[] = $row['pg_address']; // 这里是错误根源! }
$location_result是query()方法返回的结果集对象,它不是普通的PHP数组,你不能直接用[]语法往里面追加元素——这就触发了"Cannot use object of type mysqli_result as array"的错误。
修正方案
你需要新建一个独立的数组来存储循环中取出的地址数据,不能复用结果集对象。另外还要注意:你当前直接把用户提交的POST值拼进SQL语句的做法存在严重的SQL注入风险,建议改用预处理语句来规避这个安全问题。
修正后的完整代码如下:
if(isset($_POST['list'])){ // 处理POST提交的值 $location_type = trim($_POST['list']); $arr = explode(' ', $location_type); $listing = $arr[0]; // 使用预处理语句避免SQL注入 $all_location = "select * from tbl_master_property where pg_address like ?"; // 拼接LIKE查询需要的通配符 $search_term = "%{$listing}%"; // 初始化预处理语句并绑定参数 $stmt = $conn->prepare($all_location); $stmt->bind_param("s", $search_term); // 绑定字符串类型的参数 $stmt->execute(); $location_result = $stmt->get_result(); // 新建数组存储查询到的地址 $address_list = []; while($row = mysqli_fetch_assoc($location_result)){ $address_list[] = $row['pg_address']; } echo "<pre>"; print_r($address_list); die; }
额外注意事项
- SQL注入防护:直接拼接用户输入到SQL语句中,恶意用户可以构造特殊输入篡改SQL逻辑,甚至删除数据库表。预处理语句通过参数绑定把用户输入作为纯数据处理,彻底避免了这个风险。
- 代码健壮性:可以增加对
$location_type的非空校验,比如如果用户提交了空值,直接跳过查询;另外如果$arr为空(比如用户提交的内容全是空格),也要做容错处理,避免$arr[0]报错。
内容的提问来源于stack exchange,提问作者Raj
相关产品推荐
相关产品推荐

