Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] conexion mysqli

Estas en el tema de conexion mysqli en el foro de PHP en Foros del Web. Hola: Intento realizar pruebas de conexión usando POO con mysqli, trabajo en ubuntu 12.04 lts, php 5.5 en la configuración de php tengo habilitado el ...
  #1 (permalink)  
Antiguo 24/04/2014, 19:01
 
Fecha de Ingreso: enero-2010
Mensajes: 491
Antigüedad: 14 años, 3 meses
Puntos: 12
conexion mysqli

Hola:

Intento realizar pruebas de conexión usando POO con mysqli, trabajo en ubuntu 12.04 lts, php 5.5 en la configuración de php tengo habilitado el mysqli asi:
Cita:
MysqlI Support enabled
Client API library version 5.5.37
Active Persistent Links 0
Inactive Persistent Links 0
Active Links 0
Client API header version 5.5.35
MYSQLI_SOCKET /var/run/mysqld/mysqld.sock

Directive Local Value Master Value
mysqli.allow_local_infile On On
mysqli.allow_persistent On On
mysqli.default_host no value no value
mysqli.default_port 3306 3306
mysqli.default_pw no value no value
mysqli.default_socket /var/run/mysqld/mysqld.sock /var/run/mysqld/mysqld.sock
mysqli.default_user no value no value
mysqli.max_links Unlimited Unlimited
mysqli.max_persistent Unlimited Unlimited
mysqli.reconnect Off Off
en una primera prueba me sale la conexión excelente:
Código PHP:
<?php
$mysqli 
mysqli_connect('localhost''root''12345678''mvc');

/* Comprueba la conexión */
if (mysqli_connect_errno()) {
    
printf("Connect failed: %s\n"mysqli_connect_error());
    exit();
}


/* Selecciona todas las filas */
$result $mysqli->query("SELECT * FROM usuarios");
printf("Affected rows (SELECT): %d<br>"$mysqli->affected_rows);

$result->close();

mysqli_close($mysqli);
?>
pero al probar esta clase:
Código PHP:
<?php
abstract class DBAbstractModel{
    private static 
$db_host 'localhost';
    private static 
$db_user 'root';
    private static 
$db_pass '12345678';
    protected 
$db_name 'mvc';
    protected 
$query;
    protected 
$rows = array();
    private 
$conn;

    
# metodos abstractos para ABM de clases que hereden
    
abstract protected function get();
    abstract protected function 
set();
    abstract protected function 
edit();
    abstract protected function 
delete();

    
#Los siguientes metodos pueden definirse con exactitud y no son abstractos
    #Conectar a la base de datos
    
private function open_connection(){
        
$this->conn = new mysqli(self::$db_hostself::$db_userself::$db_pass$this->db_name);
    }

    
#Desconectar la base de datos
    
private function close_connection(){
        
$this->conn->close();
    }

    
#Ejecutar un query simple de tipo INSERT, DELETE UPDATE
    
protected function execute_simple_query(){
        
$this->open_connection();
        
$this->conn->query$this->query );
        
$this->close_connection();
    }

    
#traer resultados de una consulta en un array
    
protected function get_results_from_query(){
        
$this->open_connection();
        
$result $this->conn->query($this->query);

        while (
$this->rows[] = $result->fetch_assoc()) {
            
$result->close;
            
$this->close_connection();
        }

        
array_pop($this->rows);
    }
}
?>
me arroja este erroe en el log:

[Thu Apr 24 20:56:45.444868 2014] [:error] [pid 31440] [client 127.0.0.1:35325] PHP Warning: mysqli::close(): Couldn't fetch mysqli in /var/www/pruebas/poo/db_abstract_model.php on line 25, referer: http://localhost/pruebas/poo/
  #2 (permalink)  
Antiguo 25/04/2014, 01:40
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: conexion mysqli

¿Con esa clase abstracta pretendes conectar a la BD directamente?

Porque si es así tengo malas noticias para ti:

1) Las clases abstractas solamente sirven para imponer su estructura a las clases hijas.

2) Las clases abstractas no pueden ser instanciadas directamente.

Tal vez lo que te conviene son los traits de PHP.

Saludos.
__________________
Ayúdame a hacerlo por mi mismo.
  #3 (permalink)  
Antiguo 25/04/2014, 06:50
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: conexion mysqli

Prueba

Código PHP:
Ver original
  1. $result::close();

en vez de..

Código PHP:
Ver original
  1. $result->close();

Segun el manual close() es un metodo estatico de los objetos resultados.

---
PHP se va a ir al caño otra vez...... ahora aconsejan usar mixins para cualquier cosa ?

De donde sacastes que intento instanciar la clase abstracta ? el error no dice eso xD
__________________
Salu2!

Última edición por Italico76; 25/04/2014 a las 07:00
  #4 (permalink)  
Antiguo 25/04/2014, 07:30
 
Fecha de Ingreso: enero-2010
Mensajes: 491
Antigüedad: 14 años, 3 meses
Puntos: 12
Respuesta: conexion mysqli

gracias por las respuestas considerando mi ejemplo cambié el código de la siguiente manera:

Código PHP:
Ver original
  1. #Desconectar la base de datos
  2.     private function close_connection(){
  3.         $this->conn::close();
  4.     }

pero obtengo este error:

syntax error, unexpected '::' (T_PAAMAYIM_NEKUDOTAYIM)
  #5 (permalink)  
Antiguo 25/04/2014, 08:00
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: conexion mysqli

Creo lo cambiaste en el lugar que no te habia dicho..... :\

Código PHP:
Ver original
  1. <?php
  2. $mysqli = mysqli_connect('localhost', 'root', '12345678', 'mvc');
  3.  
  4. /* Comprueba la conexión */
  5.     printf("Connect failed: %s\n", mysqli_connect_error());
  6.     exit();
  7. }
  8.  
  9.  
  10. /* Selecciona todas las filas */
  11. $result = $mysqli->query("SELECT * FROM usuarios");
  12. printf("Affected rows (SELECT): %d<br>", $mysqli->affected_rows);
  13.  
  14. $result::close();  ##### AQUI ES <<<<<<<<<<<<<<
  15.  
  16. mysqli_close($mysqli);
  17. ?>

Tenias que liberar la memoria del resultado pero ahora me pregunto..... ¿ vas a cerrar la conexion con la clase o desde tu programa principal ? porque ahi veo:

Código PHP:
Ver original
  1. mysqli_close($mysqli);

Esa forma o mysqli::close() son ambas validas
__________________
Salu2!

Última edición por Italico76; 25/04/2014 a las 08:15
  #6 (permalink)  
Antiguo 25/04/2014, 09:04
 
Fecha de Ingreso: enero-2010
Mensajes: 491
Antigüedad: 14 años, 3 meses
Puntos: 12
Respuesta: conexion mysqli

Gracias por su ayuda, mi problema no era mysqli, la idea de usarlo es probar la conexion usndo clases y POO, para quienes estén interesados las clases que uso ademas de la ya expuesta arriba son:
Código PHP:
Ver original
  1. <?php
  2. require_once('db_abstract_model.php');
  3. /**
  4. *
  5. */
  6. class Usuario extends DBAbstractModel
  7. {
  8.    
  9.     public $nombre;
  10.     public $apellido;
  11.     public $email;
  12.     private $clave;
  13.     protected $id;
  14.  
  15.     function __construct()
  16.     {
  17.         $this->db_name = 'mvc';
  18.     }
  19.  
  20.     public function get($user_email=''){
  21.         if($user_email != ''):
  22.             $this->query = "select * from usuarios where email = '$user_email'";
  23.         endif;
  24.  
  25.         $this->get_results_from_query();
  26.  
  27.         if ( count( $this->rows ) == 1  ):
  28.             foreach ($this->rows[0] as $propiedad => $valor) :
  29.                 $this->$propiedad = $valor;
  30.             endforeach;
  31.         endif;
  32.  
  33.     }
  34.  
  35.     public function set( $user_data = array() ){
  36.  
  37.         if ( array_key_exists( 'email', $user_data ) ) :
  38.             $this->get( $user_data['email'] );
  39.             echo $user_data['email'].' dato importante<br>';
  40.  
  41.             if( $user_data['email'] != $this->email ) :
  42.                 foreach ( $user_data as $campo => $valor) :
  43.                     $$campo = $valor;
  44.                 endforeach;
  45.                 $insert = "INSERT INTO usuarios (nombre,apellido,email,clave) VALUES ('$nombre','$apellido','$email','$clave')";
  46.                 // echo $insert;
  47.                 $this->query = $insert;
  48.                 $this->execute_simple_query();
  49.             endif;
  50.         endif;
  51.     }
  52.  
  53.     public function edit( $user_data = array() ){
  54.         foreach ($user_data as $campo => $valor) {
  55.             $$campo = $valor;
  56.         }
  57.  
  58.         $this->query = "UDPATE usuarios SET nombre = '$nombre', apellido = '$apellido', clave = '$clave' WHERE email = '$email'";
  59.         $this->execute_simple_query();
  60.     }
  61.  
  62.     public function delete ( $user_email = '' ) {
  63.         $this->query = "DELETE FROM usuarios WHERE email = '$user_email'";
  64.         $this->execute_simple_query();
  65.     }
  66.  
  67.     function __destruct(){
  68.         unset($this);
  69.     }
  70. }
  71. ?>

y

Código PHP:
Ver original
  1. <?php
  2. require_once('usuarios_model.php');
  3.  
  4. #Crear un nuevo usuario
  5. $new_user_data = array ('nombre' => 'Alberto', 'apellido' => 'López', 'email' => '[email protected]', 'clave' => '12345678');
  6.  
  7. $usuario2 = new Usuario();
  8. $usuario2->set($new_user_data);
  9. $usuario2->get($new_user_data['email']);
  10. print $usuario2->nombre . ' ' . $usuario2->apellido . ' existe<br>';
  11. ?>

la clase principal si es abstracta, lo que intento hacer es que el sistema pueda trabajar usando diferentes BD, mediante las subclases.

Muchas gracias y saludos.

Etiquetas: conexion, mysql, mysqli, select, sql, usuarios
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 23:12.