использование глобальной переменной БД внутри классов в PHP - PullRequest
3 голосов
/ 16 декабря 2010

Как я могу использовать глобальную переменную БД внутри класса?Допустим, у меня есть это в моем config.php

$dbh = new PDO("mysql:host=localhost;dbname=mydb", "root", "");

, и я хочу использовать этот $ dbh внутри класса следующим образом (MyClass.php)

class MyClass
{
   public function DoSomething($plogin_id)
   {
        $sql = "SELECT * FROM mytable WHERE login_id = :login_id";      
        $stmt = $dbh->prepare($sql);    //line 14
        $stmt->bindParam(':login_id', $plogin_id, PDO::PARAM_STR);
   }
}

И внутри моего индекса.PHP-файл Я использую этот MyClass следующим образом:

include "config.php";
$MyObject = new MyClass();
$login_result = $MyObject->DoSomething("admin");

Это дает мне ошибку:

Неустранимая ошибка: вызов функции-члена prepare () для необъектав C: \ xampp \ htdocs \ MyProject \ admin \ includes \ classes \ MyClass.php в строке 14

Ответы [ 3 ]

7 голосов
/ 16 декабря 2010

Вы должны как-то передать объект $dbh в MyClass. Поскольку вы не хотите использовать глобальные переменные, я предлагаю вам передать его конструктору MyClass.

Ваш MyClass и index.php могут выглядеть примерно так:

class MyClass
{
   protected $dbh = null;

   public function __construct ( PDO $Pdh )
   {
      $this->dbh = $Pdh;
   }

   public function DoSomething($plogin_id)
   {
        $sql = "SELECT * FROM mytable WHERE login_id = :login_id";      
        $stmt = $this->dbh->prepare($sql);    //line 14
        $stmt->bindParam(':login_id', $plogin_id, PDO::PARAM_STR);
   }
}

// in your index.php
$MyObject = new MyClass ( $dbh );

Это в основном шаблон, называемый внедрением зависимостей. См. этот превосходный учебник для получения дополнительной информации о том, что это такое.

1 голос
/ 16 декабря 2010

Вы можете ввести его в свою функцию, используя:

global $dbh;

Однако было бы лучше добавить его в класс, например:

class MyClass
{
    private $dbh;

    public function __construct($dbh) {
        $this->dbh = $dbh;
    }

    public function DoSomething($plogin_id)
    {
        $sql = "SELECT * FROM mytable WHERE login_id = :login_id";      
        $stmt = $this->dbh->prepare($sql);    //line 14
        $stmt->bindParam(':login_id', $plogin_id, PDO::PARAM_STR);
    }
}

и затем:

include "config.php";
$MyObject = new MyClass($dbh); // I'm assuming $dbh is created in config.php
$login_result = $MyObject->DoSomething("admin");

Или введите его в свою функцию во время вызова:

class MyClass
{
    public function DoSomething($plogin_id, $dbh)
    {
        $sql = "SELECT * FROM mytable WHERE login_id = :login_id";      
        $stmt = $dbh->prepare($sql);    //line 14
        $stmt->bindParam(':login_id', $plogin_id, PDO::PARAM_STR);
    }
}

А потом:

include "config.php";
$MyObject = new MyClass($dbh); // I'm assuming $dbh is created in config.php
$login_result = $MyObject->DoSomething("admin", $dbh);
0 голосов
/ 16 декабря 2010

Это наиболее распространенный метод:

public function DoSomething($plogin_id){
    global $dbh;
    ...

Альтернативный подход:

Создание singleton для подключения к базе данных.И вы используете это вместо глобальной переменной:

$stmt = MyDBConn::getInstance()->prepare($sql);
...