PHP7中数据库类函数失效求助——PHP5迁移后的代码故障排查
问题排查与修复方案
嘿,我帮你梳理下PHP5迁移到PHP7后这段代码的问题,主要是几个小细节和作用域的坑导致view_chart没法正常工作:
1. 数据库连接变量的作用域问题
你在构造函数里定义的$conn是局部变量,只能在构造函数内部使用,view_chart方法根本找不到这个变量,自然没法执行查询。得把它改成类的成员属性,让整个类的方法都能访问到。
2. 方法调用的拼写错误
你最后一行写的foreach($db->view_char...是笔误,应该是view_chart(少了个t),这也会直接导致调用失败。
3. 未初始化的变量问题
view_chart里的$hasil没提前初始化,如果查询结果为空,PHP7会直接抛出未定义变量的警告(PHP5可能只是静默忽略,但PHP7对这类错误管控更严),所以得先把它初始化为空数组。
4. 缺少错误处理(建议加上)
PHP7对错误的容忍度更低,加上连接、查询的错误捕获,能帮你更快定位问题,比如连接失败、表不存在这类情况。
修正后的完整代码
class database { // 把连接句柄改成类的私有属性,确保只有类内部能访问 private $conn; public function __construct () { // 连接数据库,赋值给类属性 $this->conn = mysqli_connect("localhost", "root", ""); if (!$this->conn) { die("数据库连接失败: " . mysqli_connect_error()); } // 选择数据库并检查是否成功 if (!mysqli_select_db($this->conn, 'crm')) { die("选择数据库失败: " . mysqli_error($this->conn)); } } public function view_chart(){ // 先初始化结果数组,避免空查询时报错 $hasil = []; // 使用类属性里的连接句柄执行查询 $data = mysqli_query($this->conn, "select * from t_chart"); // 检查查询是否成功 if ($data) { while($d = mysqli_fetch_array($data)){ $hasil[] = $d; } } else { die("查询失败: " . mysqli_error($this->conn)); } return $hasil; } } // 实例化数据库类 $db = new database(); // 正确调用方法,注意拼写是view_chart foreach($db->view_chart() as $item) { // 这里可以处理数据,比如打印出来看看 print_r($item); }
额外小建议
如果可以的话,推荐用mysqli的面向对象写法,代码会更简洁易读,比如把mysqli_connect换成new mysqli(),mysqli_query换成$this->conn->query($sql),这样更符合PHP的面向对象风格,维护起来也更方便。
内容的提问来源于stack exchange,提问作者M Kahfi Kresnotutuko




