这是以类方式或OOP访问mysql的正确方式吗


Is this a correct way of accessing mysql in class fashion or OOP?

class DBAcess{
    private $_mysql_connection;
    function db_access(){
        $this->_mysql_connection = mysqli_connect('localhost', 'root', 'aaaaa', 'test') or die('cant connect to the db server');
    }
    function display_user($user_id){
        $sql = "SELECT * FROM email WHERE id = '$user_id'";
        $db_handle = mysqli_query($this->_mysql_connection, $sql) or die('cant query db');
        $num_count = mysqli_num_rows($db_handle);
        if($num_count != 1){
            echo 'no record';
        }else{
            while($row = mysqli_fetch_array($db_handle)){
            echo $row['email'];
        }       
        }
    }
}

    $db_operation = new DBAcess();
    $db_operation->db_access();
    $db_operation->display_user(1);

这取决于情况。如果你问这是否是一种好的做法:它会起作用,但这段代码存在一些问题,很难维护。数据库类应该只处理连接、运行查询、获取插入的id以及辅助方法,如格式化这些查询的结果等。您的用户类应该调用数据库类来运行查询并获取用户信息。您可能还需要考虑将数据库凭据移动到配置文件中。将它们声明为常量,这样您就可以使用_DB_SERVER_、_DB_USER_等。

就我个人而言,我试图根据数据库中的表来建模我的类,并使用一个单独的数据库类来完成繁重的工作。有时,如果DB类只执行按需查询,而不关心句柄是否保存,我会静态地执行,其他时候我会实例化一个DB类来运行多个查询。下面的示例是使用静态调用DB来保存代码,但我相信您将能够做到这一点,因为它适合您的应用程序。

我还强烈建议您使用PDO库来处理数据库内容。大多数情况下,您可以对所有驱动程序使用相同的代码,尽管在行为上确实存在一些例外。如果您准备如图所示的查询,它还消除了对来自数据库或web的输入的任何谨慎需要。因此,SQL注入不是问题。

我还没有试过运行这个,但总体情况是至少

<?php
class User {
    // Don't know your fields, these are examples
    private $first_name;
    private $last_name;
    private $email;
    private $id;
    public function __construct($user_id = NULL){
        if( !empty($user_id) ){
            $this->loadFromDB($user_id);
        }
    }
    public function loadFromDB($id){
        $sql = 'SELECT * FROM email WHERE id = :id';
        $result = Database::query($sql,[':id'=>$id]);
        if( sizeof($result) !== 1){
            throw new Exception("Failed to load user or user not found");
        }
        $this->first_name = $result[0]["first_name"];
        $this->last_name = $result[0]["lastname"];
        $this->email = $result[0]["email"];
        $this->id = $id;

    }
    public function display(){
        echo $this->email;
    }
}
class Database {
    public static function query($sql, $params){
        try{
            $db = new PDO('mysql:dbname=test;host=127.0.0.1;charset=UTF8','root','aaaa');
        }
        catch(PDOException $e){
            echo 'Connection failed: ' . $e->getMessage();
        }
        $stmt = $db->prepare($sql);
        $stmt->execute($params);
        $result = $stmt->fetchAll();
        return $result;
    }
}
$user = new User(1);
$user->display();