Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Migración de una clase que gestiona las conexiones a BD de mysql a mysqli

Estas en el tema de Migración de una clase que gestiona las conexiones a BD de mysql a mysqli en el foro de PHP en Foros del Web. Buenas. Hasta ahora siempre he utilizado una clase que encontré por internet que gestionaba las conexiones con la bd haciendo uso de mysql. Quiero migrar ...
  #1 (permalink)  
Antiguo 25/01/2014, 07:37
 
Fecha de Ingreso: junio-2012
Mensajes: 147
Antigüedad: 11 años, 9 meses
Puntos: 1
Migración de una clase que gestiona las conexiones a BD de mysql a mysqli

Buenas. Hasta ahora siempre he utilizado una clase que encontré por internet que gestionaba las conexiones con la bd haciendo uso de mysql. Quiero migrar a mysqli manteniendo la clase, para así no tener que tocar todo el código. He intentado modificarla yo sólo pero me es imposible, así que si alguien pudiera ayudarme se lo agradecería, porque sólo de pensar en modificar cada script que accede a la BD me entran sudores fríos

Mil gracias!

Esta es la clase:
Código PHP:
Ver original
  1. <?php
  2. /* Clase encargada de gestionar las conexiones a la base de datos */
  3. Class DB {
  4.     private $servidor='localhost';
  5.     private $usuario='root';
  6.     private $password='';
  7.     private $base_datos='dbname';
  8.     private $link;
  9.     private $stmt;
  10.     private $array;
  11.    
  12.     static $_instance;
  13.    
  14.     /* La función construct es privada para evitar que el objeto pueda ser creado mediante new */
  15.     private function __construct() {
  16.         $this->conectar();
  17.     }
  18.    
  19.     /* Evitamos el clonaje del objeto. Patrón Singleton */
  20.     private function __clone(){ }
  21.    
  22.     /* Función encargada de crear, si es necesario, el objeto. Esta es la función que debemos llamar desde fuera de la clase para instanciar el objeto, y así, poder utilizar sus métodos */
  23.     public static function getInstance() {
  24.         if (!(self::$_instance instanceof self)) {
  25.             self::$_instance=new self();
  26.         }
  27.         return self::$_instance;
  28.     }
  29.    
  30.     /* Realiza la conexión a la base de datos */
  31.     private function conectar() {
  32.         $this->link=mysql_connect($this->servidor, $this->usuario, $this->password);
  33.         mysql_select_db($this->base_datos,$this->link);
  34.         @mysql_query("SET NAMES 'utf8'");
  35.     }
  36.    
  37.     /* Realiza la desconexión de la base de datos */
  38.     public function desconectar() {
  39.         mysql_close($this->link);
  40.     }
  41.    
  42.     /* Método para ejecutar una sentencia sql */
  43.     public function ejecutar($sql) {
  44.         $this->stmt=mysql_query($sql,$this->link);
  45.         return $this->stmt;
  46.     }
  47.    
  48.     /* Método para obtener una fila de resultados de la sentencia sql */
  49.     public function obtener_fila($stmt,$fila){
  50.         if ($fila==0) {
  51.             $this->array=mysql_fetch_array($stmt);
  52.         }
  53.         else {
  54.             mysql_data_seek($stmt,$fila);
  55.             $this->array=mysql_fetch_array($stmt);
  56.         }
  57.         return $this->array;
  58.     }
  59.    
  60.     // Devuelve el último id del insert introducido
  61.     public function lastID() {
  62.         return mysql_insert_id($this->link);
  63.     }
  64. }
  65. ?>

Y era muy fácil de usar. Por ejemplo, para conectar, simplemente:

Código PHP:
Ver original
  1. $bd=DB::getInstance();
  2. if(!$bd) { // error en la conexion }

Para hacer una consulta simple:
Código PHP:
Ver original
  1. $sql = "SELECT nombre, apellidos FROM tbl_user WHERE iduser = 1";
  2. $stmt = $bd->ejecutar($sql);
  3. if (!$stmt) {// error en la consulta}

Para recoger los resultados:
Código PHP:
Ver original
  1. if (mysql_num_rows($stmt) > 0) {
  2.     while ($row=$bd->obtener_fila($stmt,0)) {
  3.         echo $row['nombre'] . " " . $row['apellidos'];
  4.     }
  5. }
  #2 (permalink)  
Antiguo 25/01/2014, 08:28
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Migración de una clase que gestiona las conexiones a BD de mysql a mysqli

Los cambios que vas a tener que realizar, no son tan significativos, sobretodo porque tu clase no es muy grande. En el manual oficial indican la manera de cómo implementar la extensión MySQLi, te dejo los enlaces:

- mysqli_connect: http://www.php.net/manual/es/mysqli.construct.php
- mysqli_query: http://www.php.net/manual/es/mysqli.query.php
- mysqli_fetch_array: http://www.php.net/manual/es/mysqli-...etch-array.php
- mysqli_data_seek: http://www.php.net/manual/es/mysqli-....data-seek.php
- mysqli_insert_id: https://www.php.net/manual/es/mysqli.insert-id.php
- mysqli_num_rows: http://www.php.net/manual/es/mysqli-result.num-rows.php

Recuerda que con la extensión MySQLi, tienes la posibilidad de trabajar de la forma orientada a objetos, te sugiero poner atención a eso en la explicación del manual, hay ejemplos.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #3 (permalink)  
Antiguo 25/01/2014, 08:34
 
Fecha de Ingreso: junio-2012
Mensajes: 147
Antigüedad: 11 años, 9 meses
Puntos: 1
Respuesta: Migración de una clase que gestiona las conexiones a BD de mysql a mysqli

Ya ví los cambios que tendría que hacer, en principio simplemente cambiar las funciones mysql por mysqli, pero no funciona haciendo esto.
Sé que se puede usar poo ahora, y lo usaría si empezara un proyecto nuevo, pero no quiero usarlo en este porque tendría que cambiar todos los scripts donde se usa esta clase, por eso prefiero usar el modo procedimental.
Gracias igualmente.
  #4 (permalink)  
Antiguo 25/01/2014, 08:53
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Migración de una clase que gestiona las conexiones a BD de mysql a mysqli

Ojo que no solamente se trata de cambiar nombres, fíjate bien en los parámetros que se le pasa a cada función y el orden de las mismas.
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #5 (permalink)  
Antiguo 25/01/2014, 09:51
 
Fecha de Ingreso: junio-2012
Mensajes: 147
Antigüedad: 11 años, 9 meses
Puntos: 1
Respuesta: Migración de una clase que gestiona las conexiones a BD de mysql a mysqli

Joer tienes razón, era por eso!! Muchas gracias. Ya funciona!

Por cierto, repasando el manual he visto que en esa clase no hay una función para cerrar la conexión ni para liberar la memoria. ¿Es muy malo que no lo haya? He probado esto y no da ningún warning ni error. Es suficiente así no?

Código PHP:
Ver original
  1. public function close() {
  2.     mysqli_free_result($this->stmt);
  3.     return mysqli_close($this->link);
  4. }
  #6 (permalink)  
Antiguo 25/01/2014, 09:55
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Migración de una clase que gestiona las conexiones a BD de mysql a mysqli

La extensión MySQLi sí tiene lo que buscas:

- mysqli_free_result: http://www.php.net/manual/es/mysqli-result.free.php
- mysqli_close: http://www.php.net/manual/es/mysqli.close.php

Nuevamente, te insto a que leas bien lo que indica el manual, la manera en como se trabaja con respecto a la extensión MySQL es similar, pero no igual.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #7 (permalink)  
Antiguo 25/01/2014, 12:19
 
Fecha de Ingreso: junio-2012
Mensajes: 147
Antigüedad: 11 años, 9 meses
Puntos: 1
Respuesta: Migración de una clase que gestiona las conexiones a BD de mysql a mysqli

Ya había leído la documentación, de hecho de ella saqué esas 2 líneas de código, sólo quería confirmar que lo estaba haciendo bien, puesto que parece que sabes de esto.
Gracias igualmente
  #8 (permalink)  
Antiguo 25/01/2014, 12:43
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Migración de una clase que gestiona las conexiones a BD de mysql a mysqli

Bueno, yo uso mysqli_free_result cuando ya no voy a darle uso a los resultados de una consulta a la BD, el cierre de la conexión es otra cosa.

Un modelo básico:

Código PHP:
Ver original
  1. $conexion = mysqli_connect("servidor", "usuario", "password", "bd");
  2.  
  3.     exit ("No se pudo realizar la conexión");
  4.  
  5. $consulta = mysqli_query($conexion, "SELECT * FROM tabla");
  6.  
  7. if (mysqli_num_rows($consulta)) {
  8.     while ($datos = mysqli_fetch_array($consulta)) {
  9.         echo "Dato 1: " . $datos[0] . "<br />";
  10.         echo "Dato 2: " . $datos[1] . "<br />";
  11.         echo "Dato 3: " . $datos[2] . "<br /><br />";
  12.     }
  13.     mysqli_free_result($consulta);
  14. }
  15. else {
  16.     echo "No se encontraron datos en la consulta";
  17. }
  18.  
  19. mysqli_close($conexion);

Adáptalo a tus necesidades, saludos.
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #9 (permalink)  
Antiguo 26/01/2014, 04:20
 
Fecha de Ingreso: junio-2012
Mensajes: 147
Antigüedad: 11 años, 9 meses
Puntos: 1
Respuesta: Migración de una clase que gestiona las conexiones a BD de mysql a mysqli

Ok, lo haré como indicas.

Muchas gracias por tu ayuda.

Saludos.

Etiquetas: mysql, mysqli, poo
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 09:33.