这是以类方式还是OOP访问mysql的正确方法?

时间:2016-03-23 19:27:59

标签: php html mysql

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);

2 个答案:

答案 0 :(得分:1)

嗯,这取决于。如果你问这是否是一个好的做法:它会起作用,但是这个代码存在问题会使其难以维护。 您的数据库类应该只处理连接,运行查询,获取插入的ID以及帮助方法,例如格式化这些查询的结果等。 您的用户类应该调用数据库类来运行查询并获取用户信息。 您可能还需要考虑将数据库凭据移动到配置文件中。将它们声明为常量,因此您只需使用_DB_SERVER _,_ DB_USER_等。

答案 1 :(得分:0)

我个人尝试在数据库中的表之后对我的类进行建模,并使用单独的数据库类来完成繁重的工作。有时我会静态地执行它,如果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();