Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

PHP OO Error fatal usando MySQLi

Estas en el tema de Error fatal usando MySQLi en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola a todos, Estoy tratando de implementar un script, sin embargo tengo un error fatal que no se como solucionar, mas que nada porque la ...
  #1 (permalink)  
Antiguo 28/03/2012, 09:01
 
Fecha de Ingreso: junio-2010
Ubicación: Charlotte, NC
Mensajes: 611
Antigüedad: 13 años, 10 meses
Puntos: 95
Error fatal usando MySQLi

Hola a todos,
Estoy tratando de implementar un script, sin embargo tengo un error fatal que no se como solucionar, mas que nada porque la variable $mysqli no se encuentra definida.

Ese es el error:
Fatal error: Call to a member function prepare() on a non-object in C:\xampp\htdocs\crgvsys\classes\class.acl.php on line 55

La linea de codigo es la siguiente:
Código PHP:
Ver original
  1. function getUserRoles()
  2.     {
  3.         $strSQL = "SELECT `userID` FROM `user_roles` WHERE `userID` = ? ORDER BY `addDate` ASC";
  4.         if(!($query = $mysqli->prepare($strSQL))) {
  5.             die("Statement wasn't  prepared");
  6.         }
  7.         if(!($query->bind_param("i",$userID))) {
  8.             die("Parameters weren't binded");
  9.         }
  10.         if(!($query->execute())) {
  11.             die("ERROR = ".$query->errno);
  12.         }
  13.         if(!($query->bind_result($userID))) {
  14.             die("Results weren't  binded");
  15.         }
  16.         $resp = array();
  17.         while($query->fetch()) {
  18.             $resp[] = $userID;
  19.         }
  20.         $query->close();
  21.         return $resp;
  22.     }

Esta clase, la estoy instanciando en el archivo, index.php
cuyo contenido es:
Código PHP:
Ver original
  1. <?php
  2. include_once('../includes/connection.php');
  3. require('../classes/class.acl.php');
  4. $acl = new ACL();
  5. if ($acl->hasPermission('access_admin' != true)) { header("location:../index.php");}
  6. ?>

Y mi conexión a la base de datos (connection.php) es:
Código PHP:
Ver original
  1. <?php
  2. require('config.inc');
  3. $mysqli = new MySQLi($hostname, $username, $password, $database);
  4. $amIConnected = ($mysqli->connect_errno) ? FALSE: TRUE;
  5. ?>

Alguna idea de que estoy haciendo mal?
Tengo poca experiencia usando PHP orientado a objetos, conviene declarar la conexion a la base de datos como singleton ?
  #2 (permalink)  
Antiguo 28/03/2012, 10:25
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 8 meses
Puntos: 1532
Respuesta: Error fatal usando MySQLi

si $mysqli no es superglobal, para usarlo en la función debes de usar dentro de la misma

Código PHP:
Ver original
  1. function () {
  2.  global $mysqli;
  3. }

pero claro eso porque veo que mezclas POO con estructurada, en cambio si la variable $mysqli fuera miembro de la clase sería:

$this->mysqli

todo depende de como implementaras el código, además para tener una experiencia POO plena usa PDO
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #3 (permalink)  
Antiguo 28/03/2012, 10:30
 
Fecha de Ingreso: junio-2010
Ubicación: Charlotte, NC
Mensajes: 611
Antigüedad: 13 años, 10 meses
Puntos: 95
Respuesta: Error fatal usando MySQLi

Me imaginé que el problema era ese,
Estaba viendo un tutorial que hace precisamente lo que yo intentaba hacer, y copie el codigo, y cambie sus conexiones a MySQL con el nuevo modulo MySQLi por todas las ventajas que su uso representa.

Sin embargo, no tengo mucha experiencia trabajando con PHP OO especificamente, sin embargo mi experiencia trabajando con POO en otros lenguajes, me decia que posiblemente era algo relacionado con el scope de las variables, y que probablemente el scope de $mysqli estaba fuera del scope de la clase.

Tambien pensé en hacerla super global, pero la documentación que vi en PHP.NET no lo dejo claro,
intenté utilizar
$GLOBALS['mysqli'] = new MySQLi(...);

pero no funcionó, no pude solucionar mi error.


Podrias extenderte un poco mas, a que te refieres con "tener una experiencia OO plena" es mejor utilizar PDO? Había visto que utilizar PDO tiene muchas ventajas sobre el modulo mysql, como los prepared statements, (que notaras que hago uso de ellos); sin embargo tambien lei que con la nueva extension mysqli, el uso de PDO ya no es tan necesario, porque viene a cubrir las mismas areas (quizá este equivocado)

Muchas gracias!
  #4 (permalink)  
Antiguo 28/03/2012, 10:52
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Error fatal usando MySQLi

Lee sobre variables globales, aunque si estas usando PHP OO es mejor que pases el mysqli a tu clase y lo uses dentro de tu clase:
Código PHP:
Ver original
  1. class Foo {
  2.       private $bar;
  3.       public function __construct($var)
  4.       {
  5.               $this->bar = $var;
  6.       }
  7.  
  8.       public function doSomething()
  9.      {
  10.               echo $this->bar;
  11.       }
  12. }

Saludos.
  #5 (permalink)  
Antiguo 28/03/2012, 11:13
 
Fecha de Ingreso: junio-2010
Ubicación: Charlotte, NC
Mensajes: 611
Antigüedad: 13 años, 10 meses
Puntos: 95
Respuesta: Error fatal usando MySQLi

Perfecto, ahorita ya me tengo que ir de mi trabajo, pero voy a pasar la conexión MySQLi al constructor de la clase.
Aunque tengo la vaga idea de que ya había intentado eso y no funcionó.
  #6 (permalink)  
Antiguo 29/03/2012, 09:58
 
Fecha de Ingreso: junio-2010
Ubicación: Charlotte, NC
Mensajes: 611
Antigüedad: 13 años, 10 meses
Puntos: 95
Respuesta: Error fatal usando MySQLi

A final de cuentas, termine utilizando
globals $mysqli dentro de cada metodo....
Me quedo inconforme con esta solucion, supongo que tendre que escribir una clase ORM para la conexion mysqli, e instanciar la clase dentro de class.acl.php

Muchas gracias por sus respuestas!
  #7 (permalink)  
Antiguo 04/04/2012, 15:59
Avatar de unreal4u  
Fecha de Ingreso: octubre-2008
Mensajes: 72
Antigüedad: 15 años, 5 meses
Puntos: 10
Respuesta: Error fatal usando MySQLi

Concuerdo con GatorV, en tu caso creo que sería la manera más elegante de hacerlo.

También podrías extender tu conexión, de esa forma simplemente heredas todos los métodos.

Y no te lo han respondido todavía, pero sí, conviene MUCHO declarar la conexión a la db como singleton, establecer la conexión es una de las cosas más pesadas que hay, si vas a extender tu class entonces no querrás establecer 20 conexiones distintas cuando te sirve una sola.

También te sugiero trabajar con PDO, por la simple razón de que si el día de mañana decides cambiar de base de datos (ejemplo, de MySQL a PostGreSQL) el cambio no es tan notorio y la gran mayoría de tu código será fácil de modificar. Si lo haces con MySQLi y después te cambias a PDO, tienes que escribir el 90% del código de nuevo. Me pasó a mi xD

Saludos.
  #8 (permalink)  
Antiguo 04/04/2012, 17:41
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Error fatal usando MySQLi

Pues vas contra la corriente unreal4u, el consenso es que es una mala idea utilizar Singleton y peor aun para la bbdd, te sugiero que busques info en el foro(se ha hablado bastante del tema) o san google, ademas Singleton no es la única forma de tener una única instancia a lo largo de la aplicación, puede utilizar Registry o mejor aun DI y para el ejemplo concreto que mencionas con tener una propiedad estática en la clase base que guarde la conexión es suficiente.

+1 a PDO.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)

Última edición por masterpuppet; 05/04/2012 a las 03:45
  #9 (permalink)  
Antiguo 11/04/2012, 17:33
Avatar de unreal4u  
Fecha de Ingreso: octubre-2008
Mensajes: 72
Antigüedad: 15 años, 5 meses
Puntos: 10
Respuesta: Error fatal usando MySQLi

por qué es peor para la DB usar singleton? Sólo para asegurarnos de que estamos hablando de lo mismo ... singleton es ocupar una misma instancia de una class múltiples veces, cosa de no crearla de nuevo cada vez que la inicializamos. (AKA se crea UNA conexión a la base de datos por request en vez de X si instanciamos X veces nuestra class).

Totalmente de acuerdo en que no es la única forma, pero fue lo primero que se me vino a la mente y además, se parecen tanto el registry como la singleton clásica que es casi lo mismo :P Dependency Inyection tampoco está excenta de problemas y personalmente, si se trata de sólo una class que necesita ser "Singletonizada", no veo el punto de matar la mosca con un tanque ;)

Saludos.
  #10 (permalink)  
Antiguo 11/04/2012, 17:44
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Error fatal usando MySQLi

Busca en el foro es un tema ya tratado tantas, pero tantas veces... El problema es simple: "Que pasa sí necesitas conectarte a 2 o más bases de datos" o necesitas que un DAO use una Base y otro DAO la otra, lo mejor por eso es siempre usar DI, y en el peor de los casos un registry.

Saludos.

Etiquetas: fatal, mysql, mysqli, sql, variables
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:09.