Получить данные из базы данных внутри классов в PHP - PullRequest
0 голосов
/ 27 декабря 2018

Как я могу получить данные из моей базы данных внутри классов?

У меня есть таблица 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() выводил массив со всеми данными, но вместо этого я получаю ошибку, что переменная $ pdo в строке 3 не определена.

Примечание: неопределенная переменная: pdo в C: \ apache \ docs \ Users.php в строке 6

Должен ли я устанавливать соединение с базой данных в каждом отдельном классе?Не станет ли это ударом по производительности?

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Я бы сделал что-то подобное.Создайте модель для хранения данных пользователя.Затем 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;
        }
    }
}
0 голосов
/ 27 декабря 2018

Вам нужно создать функцию __construct, чтобы попасть в PDO.Вы объявляете $pdo переменную вне класса.Класс имеет доступ к тому, что внутри it.

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.
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...