Error fatal: llamada a una consulta de función miembro () en un objeto no

Estoy usando pdo y he configurado la cadena de conexión en un archivo de configuración como

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

Tengo esta consulta en una clase, en un método / función

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

y cuando ejecuto mi sitio, obtengo ese error. ¿Es posible que el objeto $ db no sea global?

No es una gran manera de hacer esto, pero debería ser capaz de hacerlo funcionar agregando global a su método / función:

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

Al trabajar con globales, debe tener mucho cuidado de no sobreescribir la variable en ningún momento.

Si declaró / instaló $db en el ámbito global (o cualquier ámbito que no sea la función / método) y trató de usarlo en una función / método, no funcionará. Lee esto

Si su objeto PDO no pudo crear instancias o no se configuró antes de la llamada al método, también puede recibir este error. Pruebe var_dump(is_object($db)); y / o var_dump($db); verificar.

Debe hacer una de las siguientes cosas:


Crea una instancia del objeto PDO dentro del método (probablemente no sea la práctica o la mejor opción):

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

Cree una instancia del objeto PDO en el ámbito global y use la palabra clave global para importarlo en el método:

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

Cree una instancia del objeto PDO en el ámbito global y use la matriz superglobal $GLOBALS para acceder a él.

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

Cree una instancia del objeto PDO en el ámbito global y páselo como un parámetro a su método.

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

Cree una instancia del objeto PDO en el ámbito global y pase a su objeto como una propiedad.

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

Recomiendo usar un buen patrón llamado Registro . Y una implementación simple en 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); } } 

Uso:

 $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'");