PHP MySQL查询无结果无报错问题及数组化查询最优方案咨询
咱们先来拆解你遇到的两个核心问题:代码无反馈的原因,以及如何优雅地把查询结果存入数组。
一、代码无输出/无反馈的原因及修复
你的代码连接数据库成功,但后续没有任何提示,主要是这几个问题导致的:
1. 函数名拼写错误
你写的mysqli_queri($conn, $que)是拼写失误,正确的函数名是mysqli_query。这个错误会直接触发PHP致命错误,导致脚本终止执行,所以你看不到后续的成功/失败提示。2. 全局数据库连接无法在类方法中访问
你在类外部初始化了$conn,但PHP类方法默认无法直接访问全局变量。直接在方法里用$conn会导致变量未定义的错误,同样会中断脚本。解决这个问题更规范的方式是把数据库连接注入到类中(符合面向对象的封装原则),或者在方法内显式声明global $conn。3. 查询结果判断逻辑有漏洞
如果mysqli_query执行失败会返回false,你直接把false传给mysqli_num_rows会触发错误,导致脚本中断。正确的逻辑应该是先检查查询是否成功,再判断结果行数。
二、将查询结果存入数组的最佳实践
关于把查询结果存入数组,推荐这两种方案,同时一定要注意安全:
优先使用预处理语句防止SQL注入
你现在直接把$class拼进SQL的写法存在严重的SQL注入风险,用mysqli预处理语句可以彻底解决这个问题,同时代码也更健壮。根据结果集大小选择数组存储方式
- 如果结果集不大:用
fetch_all(MYSQLI_ASSOC)一次性获取所有行的关联数组,代码简洁高效; - 如果结果集很大:用
while循环配合fetch_assoc()逐行读取,避免占用过多内存。
- 如果结果集不大:用
三、完整修复后的代码示例
下面是修复并优化后的代码,标注了关键修改点:
<?php $servername = "localhost"; $username = "root"; $password = "indicadls02"; $database = "segmentor"; $conn = new mysqli($servername, $username, $password, $database); if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } echo "Connected successfully <br>"; error_reporting(-1); ini_set('display_errors', 1); // 强制显示错误,方便调试 class gang { private $operators = []; private $conn; // 新增:把数据库连接作为类属性 // 新增:构造函数注入数据库连接,解决作用域问题 public function __construct($dbConn) { $this->conn = $dbConn; } public function fetchOperators() { $class = get_class($this); echo "$class <br>"; $class = "PushCrew"; // 修改:用预处理语句的占位符替代直接拼接变量 $que = "select * from Operators where Tag = ? "; // 执行预处理查询 $stmt = $this->conn->prepare($que); $stmt->bind_param("s", $class); // 绑定字符串类型的参数 $stmt->execute(); $result = $stmt->get_result(); // 修改:先判断查询是否成功,再处理结果 if($result && $result->num_rows > 0) { echo "query is true <br>"; // 最佳实践:一次性获取关联数组 $this->operators = $result->fetch_all(MYSQLI_ASSOC); print_r($this->operators); } else { echo "select query failed or no rows found <br>"; } return $this->operators; } public function getOperators() { $this->operators = $this->fetchOperators(); if(get_parent_class($this)) { echo "parent exists <br>"; echo count($this->operators) . " OPS <br>"; $parent = get_parent_class($this); $temp = new $parent($this->conn); // 修改:创建父类对象时传入连接 $operatorsInherited = $temp->getOperators(); echo count($operatorsInherited) . " inherited<br>"; // 修改:用array_merge安全合并数组,避免键名覆盖 $this->operators = array_merge($this->operators, $operatorsInherited); } else { echo "tree finished <br>"; } return $this->operators; } } class bang extends gang{ private $operators = []; }; $ob2 = new bang($conn); // 修改:创建对象时传入数据库连接 $ob2->fetchOperators(); //$arr = $ob2->getOperators(); //print_r($arr); ?>
内容的提问来源于stack exchange,提问作者Aviral Srivastava
相关产品推荐
相关产品推荐

