在php中从类内的数据库获取数据

qxsslcnc  于 2021-06-17  发布在  Mysql
关注(0)|答案(2)|浏览(389)

如何从类内的数据库中获取数据?
我有一个 users 我希望以面向对象的方式访问这些数据。这意味着我不想一直在我的代码中编写查询,相反,我想通过let say获取这些数据 $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
我应该在每个类中建立数据库连接吗?这不是一个性能的打击吗?

vatpfxk5

vatpfxk51#

我会这样做。创建一个模型来存储“用户”数据。然后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;
        }
    }
}
ruyhziif

ruyhziif2#

你需要创建一个 __construct 函数以到达pdo。你宣布 $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.
    }
}

相关问题