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

Problema con herencia

Estas en el tema de Problema con herencia en el foro de Frameworks y PHP orientado a objetos en Foros del Web. hello folks, estaba pensando en crear una clase para manerjar la conexion a mi base datos especifica, y en vez de crear un envoltorio para ...
  #1 (permalink)  
Antiguo 02/02/2009, 07:29
Avatar de anlhp  
Fecha de Ingreso: agosto-2008
Mensajes: 121
Antigüedad: 15 años, 8 meses
Puntos: 1
Exclamación Problema con herencia

hello folks, estaba pensando en crear una clase para manerjar la conexion a mi base datos especifica, y en vez de crear un envoltorio para la clase mysqli con otra clase, pense en utilizar la herencia que pa eso existe, entonces, he aqui mi clase hasta ahora
Código PHP:
class MySQLdbAdmin extends mysqli{
    private 
$success;
    private 
$stmt;

    public function 
connect($_server 'localhost'$_serverUser 'root'$_serverPwd null$_serverDB null){
        
parent::__construct($_server$_serverUser$_serverPwd$_serverDB) or 
        die(
'<h2>There was an error connecting to the database.</h2>');
        
$this->success true;
    }
    
    private function 
authenticateUsers($un$pwd){
        
$query "select * from admin where un=? and password=? and password_secure=?";
        if(
$this->stmt $this->prepare($query)){
            
$this->stmt->bind_param('ss'$unmd5($pwd), sha1($pwd));
            
$this->stmt->execute();
            if(
$this->stmt->fetch()){
                
$this->stmt->close();
                return 
true;
            }
            
            return 
false;
        }
    }
    
    public function 
ensureCredentials($un$pwd$location 'admin/admin.php'){
        if(
$this->authenticateUsers($un$pwd)){
            
setcookie('admin_credentials''granted'0);
            
header("location: $location");
        }else{
            
setcookie('admin_credentials''revoke'0);
        }
        return 
0;
    }
    
    public function 
__destruct(){
        
parent::destruct;
    }

el problema esta en que invocando a mysqli(parametros) funciona pero por alguna razon no me esta funcionando dentro de la clase parent::__construct(parametros) esta sentecia no funciona y no se por que?
  #2 (permalink)  
Antiguo 02/02/2009, 08:46
Avatar de chitoso  
Fecha de Ingreso: mayo-2008
Ubicación: Montevideo, Uruguay
Mensajes: 205
Antigüedad: 15 años, 11 meses
Puntos: 5
Respuesta: Problema con herencia

La documentación de PHP en constructores dice:

Cita:
Para poder ejecutar el constructor de la clase padre, se debe hacer una llamada a parent::__construct() dentro del constructor de la clase hijo.
Por lo que supongo que tenes que llamarlo dentro del constructor de la clase hija. Así:

Código PHP:
class MySQLdbAdmin extends mysqli{
   function 
__construct() {
       
parent::__construct();
       ... ... ...
   }

De todas maneras, sería mucho mas facil sabiendo qué error te da.
__________________
Pasión por la Música
  #3 (permalink)  
Antiguo 02/02/2009, 08:51
Avatar de anlhp  
Fecha de Ingreso: agosto-2008
Mensajes: 121
Antigüedad: 15 años, 8 meses
Puntos: 1
Respuesta: Problema con herencia

asi es como lo puse en primera instancia y tampoco me funciona :s

public function __construct($_server = 'localhost', $_serverUser = 'root', $_serverPwd = null, $_serverDB = 'catalog2009'){
parent::__construct($_server, $_serverUser, $_serverPwd, $_serverDB) or die('<h2>There was an error connecting to the database.</h2>');
$this->success = true;
}
  #4 (permalink)  
Antiguo 02/02/2009, 08:55
Avatar de chitoso  
Fecha de Ingreso: mayo-2008
Ubicación: Montevideo, Uruguay
Mensajes: 205
Antigüedad: 15 años, 11 meses
Puntos: 5
Respuesta: Problema con herencia

¿Qué error te da?
Si no te despliega nada activá todos los errores error_reporting(E_ALL);
__________________
Pasión por la Música
  #5 (permalink)  
Antiguo 02/02/2009, 08:59
Avatar de anlhp  
Fecha de Ingreso: agosto-2008
Mensajes: 121
Antigüedad: 15 años, 8 meses
Puntos: 1
Respuesta: Problema con herencia

pues me saca el die() ese qe le puse, pero no obstante, logre que funcione pero eliminando el constructor de mi clase y es que claro, el unico fin por el que puse un constructor fue poder controlar que la conexion funcionase o si no parar el script y asi esconder del usuario todos los warnings y errors esos qe saldrian
  #6 (permalink)  
Antiguo 02/02/2009, 09:32
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: Problema con herencia

Mmmm no creo que puedas usar el or die() en ese contexto, ya que el constructor, no te regresa nada (void), más bien tienes que construir el objeto y checar la propiedad connect_error de la clase MySQLi, para ver si hay un error en la construcción del objeto.

Saludos
  #7 (permalink)  
Antiguo 02/02/2009, 09:40
Avatar de anlhp  
Fecha de Ingreso: agosto-2008
Mensajes: 121
Antigüedad: 15 años, 8 meses
Puntos: 1
Respuesta: Problema con herencia

pues al final, ha quedado asi para poder lograr la funcionalidad que quiero, y que es quitar del cliente todos los warnings y demas

Código PHP:
public function __construct($_server 'localhost'$_serverUser 'root'$_serverPwd null$_serverDB 'catalog2009') {
@
parent::__construct($_server$_serverUser$_serverPwd$_serverDB);
if (
mysqli_connect_errno()) {
die(
'<h2>There was an error connecting to the database.Please, contact system administrator.</h2>');
}
$this->success true;

;)
  #8 (permalink)  
Antiguo 02/02/2009, 10:59
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: Problema con herencia

No te recomiendo usar la @ para "suprimir" el error es mejor hacer algo así:
Código php:
Ver original
  1. public function __construct($_server = 'localhost', $_serverUser = 'root', $_serverPwd = null, $_serverDB = 'catalog2009') {
  2.        parent::__construct($_server, $_serverUser, $_serverPwd, $_serverDB);
  3.        if ($this->connect_error) {
  4.                 die('<h2>There was an error connecting to the database.Please, contact system administrator.</h2>');
  5.        }
  6.        $this->success = true;
  7. }

Saludos
  #9 (permalink)  
Antiguo 02/02/2009, 12:01
Avatar de anlhp  
Fecha de Ingreso: agosto-2008
Mensajes: 121
Antigüedad: 15 años, 8 meses
Puntos: 1
Respuesta: Problema con herencia

joderrrrr, es que yo no se que pasa con la orientacion a objetos cada vez que instalo xampp, wampp o lo que sea aqui en mi pc :(, me explico, lo siguiente:
Código PHP:
public function __construct($_server 'localhost'$_serverUser 'root'$_serverPwd null$_serverDB 'catalog2009') {
    
parent::__construct($_server$_serverUser$_serverPwd$_serverDB);
    if (
$this->connect_error) {
        
$private_error 'mysqli: there was an error trying to create the object:'
                        
.'<li>errorno: '.$this->errno.'</li>'
                        
.'<li>error: '.$this->error.'</li>';
        
error_log($private_error0);
        die(
'<h2>There was an error connecting to the database.Please, contact system administrator.</h2>');
    }
    
$this->success true;
    } 
deberia funcionar no? y mostrarme en firefox solo la respuesta de die(), pues bien, a mi ademas de la respuesta me salen todos y cada uno de los warnings y bla bla bla, y encima las propiedades $this->error, $this->connect_error, etc etc estan vacias! por ejemplo, el if del die() da falso aunque ocurra un error si utilizo $this->connect_error en lugar de mysqli_connect_errno, vamos, que es lo mismo que me pasaba antes con el d¡DOM XML y que yo pensaba que era el xampp e instale wamp ahora, que es como si la orientacion a objetos se me quedase a 'medias'
  #10 (permalink)  
Antiguo 02/02/2009, 12:13
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: Problema con herencia

Para eso esta la directiva error_reporting, tu puedes poner especificamente que errores quieres que te muestre, en un servidor de desarrollo deben de ser todos los errores, en producción esta directiva debe de estar en 0.

Por otro lado, tienes razón es mejor usar mysqli_connect_error(), debido a que si hay un fallo en la conexión el link es nulo, revisa los comentarios en el Manual: http://www.php.net/manual/en/mysqli.connect-error.php

Saludos
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:58.