You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动