【问题标题】:Get data from database inside classes in PHP从 PHP 类中的数据库中获取数据
【发布时间】:2019-05-25 11:26:11
【问题描述】:

如何从类中的数据库中获取数据?

我的数据库中有一个users 表,我想以面向对象的方式访问这些数据。这意味着我不想一直在我的代码中编写查询,而是想通过让我们说$Users->getUserById(2)->getName();

来获取这些数据

但问题是我无法在这些类中建立数据库连接。

$pdo = new PDO("mysql:host=ipofdatabase;dbname=nameofdatabase", "username", "password", array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"));

class Users {
    public function usersList() {
        $db_users = $pdo->query("SELECT id, username, mail FROM users");
        $users = array();

        foreach ($db_users as $u) {
            $users[] = array(
                'id' => $u['id'],
                'username' => $u['username'],
                'mail' => $u['mail']
            );
        }
    }

    public function getUserById($id) {
        return new User($id);
    }
}

我希望$Users->usersList() 输出一个包含所有数据的数组,但我得到一个错误,即第 3 行中的变量 $pdo 未定义。

注意:未定义变量:第 6 行 C:\apache\docs\Users.php 中的 pdo

我应该在每个班级都建立数据库连接吗?这不会影响性能吗?

【问题讨论】:

  • 你忘记将$pdo 作为参数传递给usersList(),如果这就是你的意思的话。

标签: php mysql class oop pdo


【解决方案1】:

我会做这样的事情。创建一个模型来存储“用户”数据。然后 UserHandler 可以加载并跟踪这些模型。

此外,可以将对 DH 的引用传递给 UserHandler 构造,以保留与脚本另一部分的连接。

<?php 

class User{
    public $id;
    public $username;
    public $mail;

    public function __construct( $sArg_Id = "", $sArg_UserName = "", $sArg_Mail = "" ) {        
        $this->id = (int)$sArg_Id;
        $this->username = $sArg_UserName;
        $this->mail = $sArg_Mail;
    }
}


class UserHandler {

    // hold references to our user objects
    public $aUsers = array();

    // hold a ref to DataHandler     
    public $oDH = null;
    private $bDHInit = false;


    public function __construct( &$oArg_DH = null ) {

        // if reference passed, and if not already init
        if($oArg_DH && !$this->bDHInit){
            $this->oDH = $oArg_DH;
            $this->bDHInit = true;
        }
    }

    public function usersList() {

        $this->InitDH();

        $db_users = $this->oDH->query("SELECT id, username, mail FROM users");

        // add a new user object to aUsers array
        foreach ($db_users as $u) {
            $this->aUsers[$u['id']] = new User($u['id'], $u['username'], $u['mail']);
        }
    }

    public function getUserById($id) {

        if(isset($this->aUsers[$id])){
            return $this->aUsers[$id];
        }else{

            // load user id, or return new user object with id
            // return new User($id);
        }

        return false;
    }

    public function InitDH(){
        // I would also create a DataHandler class to wrap some of the PDO methods
        if(!$this->bDHInit){

            $this->oDH = new PDO(
                "mysql:host=ipofdatabase;dbname=nameofdatabase", 
                "username", 
                "password", 
                array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"));

            $this->bDHInit = true;
        }
    }
}

【讨论】:

    【解决方案2】:

    您需要创建一个__construct 函数才能访问 PDO。您在类的outside 声明$pdo 变量。该类可以访问其内部的内容。

    class Foo
    {
        protected $pdo; # here we define PDO as part of the class scope.
    
        public function __construct()
        {
            # we then assign $pdo to be a PDO instance
            $this->pdo = new \PDO('mysql:hostname=localhost;dbname=foobar', 'user', 'pass');
        }
    
        public function doSomething()
        {
            # we then use the $pdo var using $this->pdo
            $this->pdo->prepare('SELECT * FROM `table`');
            # etc.
        }
    }
    

    【讨论】:

    • 这很有效且易于理解,谢谢!但这是性能上的打击吗?据我了解,数据库连接仅在我编写$Users= new Users(); 时才开始建立,因此不会对性能造成影响。这是正确的吗?
    • @K.Miller 是的,它们几乎不会出现性能问题。如果您愿意,您可以创建一个特定于 DB 的类并将其注入到构造函数中,但是,如果您的代码库不大,请不要担心
    猜你喜欢
    • 1970-01-01
    • 2016-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多