Foros del Web » Programando para Internet » PHP »

PHP OO Conexión a BD no funciona

Estas en el tema de Conexión a BD no funciona en el foro de PHP en Foros del Web. Estoy trabajando sobre una opción de una web app que sirve para limitar el uso de la web si el usuario se ha conectado y ...
  #1 (permalink)  
Antiguo 20/02/2014, 13:57
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 12 años
Puntos: 84
Conexión a BD no funciona

Estoy trabajando sobre una opción de una web app que sirve para limitar el uso de la web si el usuario se ha conectado y realizado preguntas en la última hora.

He creado un método llamado compareDatesHours dentro de la clase UsersDateTime_SetGetDrop();

Llegado a un punto del método la conexión a la BD da error

Cita:
Warning: mysqli_query() expects parameter 1 to be mysqli, null given in /var/www/vhosts/miweb.com/httpdocs/models/Connect.php on line 38 Warning: mysqli_error() expects parameter 1 to be mysqli, null given in /var/www/vhosts/miweb.com/httpdocs/models/Connect.php on line 39
Esta es la parte del método donde me da error, lo indico en el código

Código PHP:
Ver original
  1. <?php
  2.         //recupera la ultima conexion del usuario al servidor
  3.         //para compararla con la fecha y hora local actual
  4.        
  5.         $this->sql              =   "SELECT date_time,
  6.                                         TIMESTAMPDIFF(YEAR,     date_time, '".$this->local_date_time."') as diff_year,
  7.                                         TIMESTAMPDIFF(MONTH,    date_time, '".$this->local_date_time."') as diff_month,
  8.                                         TIMESTAMPDIFF(DAY,      date_time, '".$this->local_date_time."') as diff_day,
  9.                                         TIMESTAMPDIFF(HOUR,     date_time, '".$this->local_date_time."') as diff_hour,
  10.                                         TIMESTAMPDIFF(MINUTE,   date_time, '".$this->local_date_time."') as diff_minute,
  11.                                         TIMESTAMPDIFF(SECOND,   date_time, '".$this->local_date_time."') as diff_second
  12.                                    FROM activity_date_time
  13.                                    WHERE id_twitter=$id_twitter ORDER BY id_date_time DESC LIMIT 1";
  14.     //hasta aquí el código no da problemas, toda la consulta está bien 
  15.         $this->result_conexion  =   $this->connect($this->sql);
  16.         //aquí da error
  17.         $this->result_conexion  =   mysqli_fetch_array($this->result_conexion);
  18. ?>

Connect.php contiene lo siguiente, indico la línea donde me dice que está el error

Código PHP:
Ver original
  1. <?php
  2. /*
  3. CLASE PARA CONECTAR Y REALIZAR OPERACIONES EN LA BASE DE DATOS
  4. */
  5. class Connect
  6. {
  7.     private $IDConexion;
  8.     private $Escape;
  9.     private $IDQuery;
  10.    
  11.     public function __construct()
  12.     {
  13.         //establezco los datos de autenticación para acceder a la base de datos
  14.         $conexion = mysqli_connect("localhost", "usuario" , "password" , "BD_name");
  15.        
  16.         //establezco el conjunto de caracteres a nivel de servidor en tiempo de ejecucion
  17.         mysqli_set_charset( $conexion, "utf8" );
  18.        
  19.         $this->IDQuery = $conexion;
  20.        
  21.         return $this->IDQuery;
  22.     }
  23.    
  24.     public function escape( $string_escapar )
  25.     {
  26.         //escapo caracteres para evitar sql injection
  27.         $string_escapar = trim( $string_escapar );
  28.         $escape = mysqli_real_escape_string( $this->IDQuery, $string_escapar );
  29.        
  30.          $this->Escape = $escape;
  31.        
  32.         return $this->Escape;
  33.     }
  34.    
  35.     public function connect ( $string_consulta )
  36.     {
  37.         //conecto a la base de datos
  38.         $this->IDConsulta = mysqli_query($this->IDQuery , $string_consulta) //linea 38 del código
  39.         OR die (mysqli_error($this->IDQuery)); //linea 39 del código
  40.        
  41.         return $this->IDConsulta;
  42.     }
  43.     public function go_out ()
  44.     {
  45.         mysqli_close($this->IDQuery);
  46.     }
  47. }
  48. ?>

No entiendo qué está pasando, la clase Connect funciona con todo lo demás excepto aquí, lo sé porque previamente he creado otro código que comprueba si el usuario existe para no registrar sus datos por duplicado y funciona perfectamente :S hace la comprobación.

¿Alguien puede ayudarme con este problema?

He revisado los datos de conexión y están bien. Si es necesario mostrar más código lo muestro, no hay problema por eso.
__________________
Ayúdame a hacerlo por mi mismo.
  #2 (permalink)  
Antiguo 20/02/2014, 14:29
 
Fecha de Ingreso: mayo-2009
Mensajes: 200
Antigüedad: 15 años, 6 meses
Puntos: 7
Respuesta: Conexión a BD no funciona

es necesario enviar por pantalla lo que te sale de error
  #3 (permalink)  
Antiguo 20/02/2014, 15:33
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 12 años
Puntos: 84
Respuesta: Conexión a BD no funciona

Cita:
Iniciado por arcanisgk1 Ver Mensaje
es necesario enviar por pantalla lo que te sale de error
Gracias por contestar. Los errores los puse al principio del post.
__________________
Ayúdame a hacerlo por mi mismo.
  #4 (permalink)  
Antiguo 20/02/2014, 15:42
 
Fecha de Ingreso: mayo-2009
Mensajes: 200
Antigüedad: 15 años, 6 meses
Puntos: 7
Respuesta: Conexión a BD no funciona

orientado a objeto:

Código PHP:
Ver original
  1. $this->conexion = new mysqli($servidor, $usuario, $clave, $basedatos);
  2.         if ($this->conexion->connect_error)
  3.             exit ("Problema de la Conexion a la Base de Datos: " . $this->conexion->connect_error);
  4.         $this->conexion->query("SET NAMES 'utf8'");
  5.     return $this->conexion;
  #5 (permalink)  
Antiguo 20/02/2014, 15:48
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 12 años
Puntos: 84
Respuesta: Conexión a BD no funciona

no entiendo lo que me quieres decir :S sé que eso es para trabajar con mysqli y que el if significa que en caso de que la conexión devuelva error muestre el error, pero no entiendo lo que quieres que haga con eso
__________________
Ayúdame a hacerlo por mi mismo.
  #6 (permalink)  
Antiguo 20/02/2014, 15:53
 
Fecha de Ingreso: mayo-2009
Mensajes: 200
Antigüedad: 15 años, 6 meses
Puntos: 7
Respuesta: Conexión a BD no funciona

compara y estudia tu código... el error debe estar hay...

mira el problema esta en que cuando estas corriendo el query no esta agarrando la conexión a la base de datos... por que no esta recibiendo lo parámetros de conexión.

Última edición por arcanisgk1; 20/02/2014 a las 16:01
  #7 (permalink)  
Antiguo 20/02/2014, 16:27
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 12 años
Puntos: 84
Respuesta: Conexión a BD no funciona

Cita:
Iniciado por arcanisgk1 Ver Mensaje
compara y estudia tu código... el error debe estar hay...

mira el problema esta en que cuando estas corriendo el query no esta agarrando la conexión a la base de datos... por que no esta recibiendo lo parámetros de conexión.
En un principio así pensé yo también, pero otras conexiones a la BD a través de esa misma clase funcionan perfectamente.

Acabo de volver a utilizar esa clase y funciona todo fenomenal, por eso puse el post, no sé dónde puede estar el error :S
__________________
Ayúdame a hacerlo por mi mismo.
  #8 (permalink)  
Antiguo 20/02/2014, 16:33
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 12 años
Puntos: 84
Respuesta: Conexión a BD no funciona

¿Tiene algo que ver que en el método compareDatesHours establezca la zona horaria con date_default_timezone_set('Europe/Madrid') y en la clase connect defina mysqli_set_charset($conexion, 'utf8')?
__________________
Ayúdame a hacerlo por mi mismo.
  #9 (permalink)  
Antiguo 20/02/2014, 16:40
 
Fecha de Ingreso: mayo-2009
Mensajes: 200
Antigüedad: 15 años, 6 meses
Puntos: 7
Respuesta: Conexión a BD no funciona

entonces algo esta mal puede ser que la variable que envias con el string este vacia prueba imprimir la variable por pantalla antes de usarla en la coneccion a ver que te sale.
  #10 (permalink)  
Antiguo 20/02/2014, 16:41
 
Fecha de Ingreso: mayo-2009
Mensajes: 200
Antigüedad: 15 años, 6 meses
Puntos: 7
Respuesta: Conexión a BD no funciona

te mandaria otro tipo de error, el error que te esta mandando es de datos faltantes
  #11 (permalink)  
Antiguo 20/02/2014, 16:51
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 12 años
Puntos: 84
Respuesta: Conexión a BD no funciona

Sí, eso también lo comprobé antes y el string está bien, esta es la salida que me acaba de dar ahora mismo
(quito el id_twitter por cuestiones de seguridad, pero lo he comprobado y también está bien) ¿pongo más código?

Código SQL:
Ver original
  1. SELECT date_time,
  2.                                         TIMESTAMPDIFF(YEAR,     date_time, '2014-02-20 23:50:45') AS diff_year,
  3.                                         TIMESTAMPDIFF(MONTH,    date_time, '2014-02-20 23:50:45') AS diff_month,
  4.                                         TIMESTAMPDIFF(DAY,      date_time, '2014-02-20 23:50:45') AS diff_day,
  5.                                         TIMESTAMPDIFF(HOUR,     date_time, '2014-02-20 23:50:45') AS diff_hour,
  6.                                         TIMESTAMPDIFF(MINUTE,   date_time, '2014-02-20 23:50:45') AS diff_minute,
  7.                                         TIMESTAMPDIFF(SECOND,   date_time, '2014-02-20 23:50:45') AS diff_second
  8.                                     FROM activity_date_time
  9.                                     WHERE id_twitter=id_twitter ORDER BY id_date_time DESC LIMIT 1

Soy incapaz de encontrar el problema, he filtrado todos los return hasta que he encontrado dónde era, pero ahora falta saber por qué y no encuentro nada que de motivo para que falle la consulta :S

Y aún estando el string vacío diría que lo que falla es el argumento 2 por ser null, no el argumento 1 que se ejecuta siempre que se inicia una nueva conexión por estar en el __construct()
__________________
Ayúdame a hacerlo por mi mismo.
  #12 (permalink)  
Antiguo 20/02/2014, 19:00
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 16 años, 3 meses
Puntos: 2237
Respuesta: Conexión a BD no funciona

Si para cada consulta vas a establecer una conexión a base de datos, me parece lógico que llegará el momento en que no te queden conexiones disponibles.

Para saberlo, adapta tu código para funcionar como el ejemplo del manual de PHP:

Código PHP:
Ver original
  1. $enlace = mysqli_connect('localhost', 'mi_usuario', 'mi_contraseña', 'mi_bd');
  2.  
  3. if (!$enlace) {
  4.     die('Error de Conexión (' . mysqli_connect_errno() . ') '
  5.             . mysqli_connect_error());
  6. }
__________________
- León, Guanajuato
- GV-Foto
  #13 (permalink)  
Antiguo 21/02/2014, 04:53
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 12 años
Puntos: 84
Respuesta: Conexión a BD no funciona

Hola Triby, muchas gracias por tu respuesta! :D

He revisado las conexiones a la BD, las conexiones que hay en este proceso son las siguientes:

(callback.php es el documento php al que twitter redirige y que va a recoger las credenciales de Twitter para autentificar al usuario por GET)

1) Desde el callback.php se instancia a la clase Users_SetGetDrop(), esta clase a su vez ya instancia a Connect.php y a UsersDatetime_SetGetDrop() que también instancia a Connect.php.

2) Obtengo los datos del usuario según su id_twitter (para saber si el usuario existe o no).
-Del callback.php utilizo la instancia anterior para utilizar el método getUser() que extrae los datos de un usuario específico.

3) Si el usuario no existe se guardan sus datos en la BD.
-Para ello reutilizo la instancia anterior y solo utilizo otro método (setUser()) de la clase Users_SetGetDrop().

4) Si el usuario existe, entonces utilizo otro método (compareDatas()) de la clase anterior para comparar los datos de la BD con los de twitter.

5) Compruebo si el usuario no está bloqueado por el admin o por límite de tiempo del sistema para hacer uso de la web app. Para realizar esto utilizo otro método de la clase anterior (checkUserState($id_twitter) que es la vía por donde me devuelve el error) que a su vez utiliza dos métodos:

-El método compareDatesHours() de la clase UsersDatetime_SetGetDrop() que sirve para saber si el usuario ha esperado el tiempo suficiente para volver a utilizar la web app.

-El método getUser() de la primera clase (Users_SetGetDrop()).

¿He realizado demasiadas conexiones a la BD?

En el proceso he contado dos instancias a Connect.php = 2 conexiones a la BD.

Si son demasiadas, cómo podría optimizar para poder dejarlo en una sola conexión.

Solo me queda pasar todo el código que interviene en este proceso, no me importaría si con ello aprendo a solucionar este y futuros problemas.

Un saludo! :D
__________________
Ayúdame a hacerlo por mi mismo.
  #14 (permalink)  
Antiguo 21/02/2014, 17:37
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 16 años, 3 meses
Puntos: 2237
Respuesta: Conexión a BD no funciona

Trabaja todos tus modelos con una misma conexión instancia de acceso a base de datos que puedes pasar por parámetro, o bien, aunque algunos dicen que es mala práctica, también podrías optar por singleton.
__________________
- León, Guanajuato
- GV-Foto
  #15 (permalink)  
Antiguo 21/02/2014, 19:53
Avatar de xSkArx  
Fecha de Ingreso: marzo-2008
Ubicación: Chile
Mensajes: 945
Antigüedad: 16 años, 8 meses
Puntos: 96
Respuesta: Conexión a BD no funciona

Por que no pones pedazo de codigo donde si te funciona la conexion a la bd, lo otro es que no se para que poner un return en el constructor
__________________
Busca, lee y practica todo lo que puedas.
Usa siempre el buscador antes de postear.
Si posteas código, utiliza el HIGHLIGHT correcto.

Etiquetas: bd, fecha, mysql, select, sql
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 14:13.