Неустранимая ошибка: вызов функции-члена query () для необъекта в - PullRequest
0 голосов
/ 31 августа 2011

Я использую pdo, и я установил строку подключения в файле конфигурации, например

$db = new PDO("mysql:host=localhost;dbname=mydbname", 'root', 'pass');

У меня есть этот запрос в классе, в методе / функции

$query = $db->query("select aUsername,aPassword,aOnline,aLastlogin from tbl_admins where aUsername = '$username'");

и когда я запускаю свой сайт, я получаю эту ошибку. Возможно ли, что объект $ db не является глобальным?

Ответы [ 3 ]

2 голосов
/ 31 августа 2011

Если вы объявили / установили $db в глобальной области (или в любой области, кроме функции / метода) и попытались использовать ее в функции / методе, она не будет работать. Читать это .

Если объект PDO не был создан или не был установлен до вызова метода, вы также можете получить эту ошибку. Попробуйте var_dump(is_object($db)); и / или var_dump($db); проверить.

Вам необходимо выполнить одно из следующих действий:


Создание объекта PDO внутри метода (возможно, не практичный или лучший вариант):

function foo () {
  $db = new PDO( ... );
  ...
  $query = $db->query( ... );   
}

Создание объекта PDO в глобальной области и использование ключевого слова global для его импорта в метод:

$db = new PDO( ... );

function foo () {
  global $db;
  $query = $db->query( ... );   
}

Создание объекта PDO в глобальной области и использование суперглобального массива $GLOBALS для доступа к нему.

$db = new PDO( ... );

function foo () {
  $query = $GLOBALS['db']->query( ... );   
}

Создайте экземпляр объекта PDO в глобальной области и передайте его в качестве параметра вашему методу.

$db = new PDO( ... );

function foo ($db) {
  $query = $db->query( ... );   
}

foo($db);

Создайте объект PDO в глобальной области видимости и передайте его в качестве свойства.

$db = new PDO( ... );

class foo {

  public $db;

  public function bar ($db) {
    $query = $this->db->query( ... );   
  }

}

$foo = new foo;
$foo->db = $db;
$foo->bar($db);
2 голосов
/ 31 августа 2011

Я рекомендую использовать хороший шаблон под названием Registry .И простая реализация в PHP:

abstract class Registry {

    private static $_tools = array();

    public static function set($name, $value) {
        self::$_tools[$name] = $value;
    }

    public static function get($name) {
        return (isset(self::$_tools[$name]) ? self::$_tools[$name] : null);
    }

}

Использование:

$db = new PDO("mysql:host=localhost;dbname=mydbname", 'root', 'pass');
Registry::set('db', $db);

//In some other part of code
$query = Registry::get('db')->query("select aUsername,aPassword,aOnline,aLastlogin from tbl_admins where aUsername = '$username'");
2 голосов
/ 31 августа 2011

Не лучший способ сделать это, но вы должны иметь возможность заставить его работать, добавив global к вашему методу / функции:

function get_user($username) {
    global $db;
    $query = $db->query("select aUsername,aPassword,aOnline,aLastlogin from tbl_admins where aUsername = '$username'");
    ...
}

Работая с глобальными переменными таким образом, вы должны быть очень осторожны, чтобы не перезаписать переменную ни в какой точке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...