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

Я использую 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 не является глобальным?

Related of "Неустранимая ошибка: вызов функции-функции-члена () для не-объекта в"

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

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

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

Если вы объявили / активировали $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); 

Я рекомендую использовать хороший шаблон под названием 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'");