0

Posee una clase llamada estudiante y otra llamada conexion, creo un objeto de conexion atraves del uso de un autoload, cuando trato de realizar consultas a la base de datos, a pesar de estar bien los atributos del objeto este no regresa ningun resultado

Clase Conexion:

<?php namespace Models;

    use PDO;
    class Conexion 
    {
        private $_host;
        private $_user;
        private $_pass;
        private $_dbname;
        private $_charset;

        private $_conexion; // Conexion a la base de Datos
        private $_consulta; // Consultas
        private $_errorPDO;
        private $_errorConsulta;

        public function __construct() {
            $archivo = 'config.ini.php';
            $configurar = parse_ini_file($archivo, true);

            $this->_host    = $configurar['basedatos']['host'];
            $this->_user    = $configurar['basedatos']['user'];
            $this->_pass    = $configurar['basedatos']['pass'];
            $this->_dbname  = $configurar['basedatos']['dbname'];
            $this->_charset = $configurar['basedatos']['charset'];
            try 
            {

            $this->_conexion = new PDO("mysql:host=$this->_host;
                    dbname=$this->_dbname;
                    charset=$this->_charset", 
                    $this->_user, 
                    $this->_pass);
            $this->_conexion->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            }

            catch(PDOException $e)
            {
                $errorPDO = $this->_errorPDO = $e->getMessage();
            }
        }

        public function preparar($sql) {
            $this->_consulta = $this->_conexion->prepare($sql);
        }

        public function asignar($parametro, $valor, $tipo = null){
            if(is_null($tipo)){
                switch (true) {
                    case is_int($valor):
                        $tipo = PDO::PARAM_INT;
                        break;
                    case is_bool($valor):
                        $tipo = PDO::PARAM_BOOL;
                        break;
                    case is_null($valor):
                        $tipo = PDO::PARAM_NULL;
                        break;
                    default:
                        $tipo = PDO::PARAM_STR;
                }  
            }

            $this->_consulta->bindValue($parametro, $valor, $tipo);
        }

        public function ejecutar() {
            $this->_consulta->execute();

            $errorConsulta = $this->_consulta->errorInfo();

            $this->errorConsulta($errorConsulta);
        }

        public function cerrar() {
            return $this->_conexion=null;
        }

        public function consultaSimple() {
            $resultado = $this->_consulta->fetch(PDO::FETCH_ASSOC);
            return $resultado;
        }

        public function consultaArray() {
            $resultado = $this->_consulta->fetchAll(PDO::FETCH_ASSOC);
            return $resultado;
        }

        public function contarRegistros() {
            $datos = $this->_consulta->rowCount();
            return $datos;
        }

        public function ultimoId() {
            $datos = $this->_consulta->lastInsertId();
            return $datos;
        }

        public function errorConsulta($errorConsulta){
            if(!is_null($errorConsulta)) {
                    print_r($errorConsulta);
                } else {
                    echo 'Consulta Exitosa';
                }
        }

        public function errorPDO($errorPDO){
            if(!is_null($errorPDO)) {
                    var_dump($errorPDO[2]);
                } else {
                    echo 'Consulta Exitosa';
                }
        }

        public function sanitizarDatos($datos) {
            $datos = trim($datos);
            $datos = stripslashes($datos);
            $datos = htmlspecialchars($datos);
            return $datos;
        }

        public function metodos() {
            $listar = get_class_methods(new Conexion());
            echo "Los Metodos disponibles para la clase son;"."<br><br>";
            foreach ($listar as $metodo) {
                if ($metodo !== "__construct" && $metodo !== "metodos") {
                echo "*$metodo\n"."<br><br>";
                }
            }   
        }

    }

Clase Estudiante:

<?php namespace Models;

    class Estudiante extends Conexion
    {
        private $_idEstudiante;
        private $_primerNombre;
        private $_segundoNombre;
        private $_primerApellido;
        private $_segundoApellido;
        private $_fechaNacimiento;
        private $_fotografia;
        private $_promedio;
        private $_fechaInscripcion;
        private $_seccionId;
        private $_conexion;

        public function set($atributo, $contenido) {
            $this->$atributo = $contenido;
        }

        public function get($atributo) {
            return $this->$atributo;
        }


        public function listar()
        {
            $sql = "
                 SELECT t1.*,t2.descripcionSeccion
                 as nombre_seccion 
                 FROM estudiantes t1 
                 INNER JOIN secciones t2 
                 ON  t1.seccionId = t2.idSeccion
                ";
            /*$datos = */
            $this->_conexion->consultaSimple($sql);
            /*return $datos;*/
        }

        public function registar()
        {
            $sql = "INSERT INTO usuarios (primerNombre,segundoNombre,
                    primerApellido,segundoApellido,fechaNacimiento,fotografia,promedio,
                        fechaInscripcion,seccionId) 
                    VALUES 
                    (:primerNombre,:segundoNombre,:primerApellido,:segundoApellido,
                    :fechaNacimiento,:fotografia,:promedio,:fechaInscripcion,:seccionId)";

            $primerNombre = sanitizarDatos($this->_primerNombre);
            $segundoNombre = sanitizarDatos($this->_segundoNombre);
            $primerApellido = sanitizarDatos($this->_primerApellido);
            $segundoApellido =  sanitizarDatos($this->_segundoApellido);
            $fechaNacimiento = sanitizarDatos($this->_fechaNacimiento);
            $fotografia = sanitizarDatos($this->_fotografia);
            $promedio = sanitizarDatos($this->_promedio);
            $fechaInscripcion = sanitizarDatos($this->_fechaInscripcion);
            $seccionId = sanitizarDatos($this->_seccionId);

            $this->_conexion->preparar($sql);

            $this->_conexion->asignar("primerNombre",$primerNombre);
            $this->_conexion->asignar("segundoNombre",$segundoNombre);
            $this->_conexion->asignar("primerApellido",$primerApellido);
            $this->_conexion->asignar("segundoApellido",$segundoApellido);
            $this->_conexion->asignar("fechaNacimiento",$fechaNacimiento);
            $this->_conexion->asignar("fotografia",$fotografia);
            $this->_conexion->asignar("promedio",$promedio);
            $this->_conexion->asignar("fechaInscripcion",$fechaInscripcion);
            $this->_conexion->asignar("seccionId",$seccionId);

            $this->_conexion->ejecutar();

            $this->_conexion->cerrar();

        }

        public function borrar() {
            $sql = "DELETE FROM estudiantes WHERE idEstudiante=:idEstudiante";

            $idEstudiante=$this->_idEstudiante;

            $this->_conexion->preparar($sql);

            $this->_conexion->asignar("idEstudiante",$idEstudiante);

            $this->_conexion->ejecutar();

            $this->_conexion->cerrar();
        }

        public function editar() {

            $sql = "UPDATE FROM estudiantes 
            SET 
            primerNombre = :primerNombre, 
            segundoNombre = :segundoNombre, 
            primerApellido = :primerApellido, 
            segundoApellido = :segundoApellido WHERE idEstudiante=:idEstudiante";

            $primerNombre = $this->_primerNombre;
            $segundoNombre = $this->_segundoNombre;
            $primerApellido = $this->_primerApellido;
            $segundoApellido = $this->_segundoApellido;
            $idEstudiante = $this->_idEstudiante;

            $this->_conexion->preparar($sql);

            $this->_conexion->asignar("primerNombre",$primerNombre);
            $this->_conexion->asignar("segundoNombre",$segundoNombre);
            $this->_conexion->asignar("primerApellido",$primerApellido);
            $this->_conexion->asignar("segundoApellido",$segundoApellido);
            $this->_conexion->asignar("idEstudiante",$idEstudiante);

            $this->_conexion->ejecutar();

            $this->_conexion->cerrar();

        }

        /*t1.*,t2.descripcionSeccion
                 as nombre_seccion 
                 FROM estudiantes t1 
                 INNER JOIN secciones t2 
                 ON  t1.seccionId = t2.idSeccion
                 WHERE t1.*/

        public function ver() {

                $sql = "
                 SELECT primerNombre FROM estudiantes WHERE idEstudiante = :idEstudiante
                ";

            $idEstudiante = $this->_idEstudiante;

            $this->_conexion->preparar($sql);

            $this->_conexion->asignar("idEstudiante",$idEstudiante);

            $this->_conexion->ejecutar();

            $this->_conexion->cerrar();
        }

        public function metodos() {
            $listar = get_class_methods(new Estudiante());
            echo "Los Metodos disponibles para la clase son;"."<br><br>";
            foreach ($listar as $metodo) {
                if ($metodo !== "__construct" && $metodo !== "metodos") {
                echo "*$metodo\n"."<br><br>";
                }
            }   
        }
    }

index:

 <?php

        require_once "Config/Autoload.php";
        Config\Autoload::run();



        $conexion = new Models\Conexion();

        $estudiante = new Models\Estudiante();

        $estudiante->set("_conexion",$conexion);
        $estudiante->set("_idEstudiante", 12345);

        /*echo $estudiante->get("_idEstudiante")."<br>";

        var_dump($estudiante->get("_conexion"));*/

        $estudiante->ver();
        $estudiante->consultaSimple();



    ?>

ERROR:

Fatal error: Uncaught Error: Call to a member function fetch() on null in C:\xampp\htdocs\Escuela CRUD\Models\Conexion.php:80 Stack trace: #0 C:\xampp\htdocs\Escuela CRUD\index.php(20): Models\Conexion->consultaSimple() #1 {main} thrown in C:\xampp\htdocs\Escuela CRUD\Models\Conexion.php on line 80

Se supone que primero deberia ejecutarla y luego obtener los resultados usando el tipo de consulta, pero me dice que esta nulo, ya imprimi los atributos del estudiante con GET y muestra bien los datos, no se que puede pasar

Dev 200
  • 5,246
  • 5
  • 39
  • 80
  • Haz un `var_dump($this->_consulta)` y debe regresarte un objeto de tipo consulta, pero lo más seguro es que te regresará un dato nulo, porque tanto `_conexion` como la variable anterior hacen referencia al mismo objeto. – Yikarus Jun 12 '17 at 23:12
  • Aqui el problema, regresa la consulta: object(PDOStatement)#6 (1) { ["queryString"]=> string(84) " SELECT primerNombre FROM estudiantes WHERE idEstudiante = :idEstudiante " }, eso si lo hago dentro del metodo preparar, y quitando consultaSimple(); y ocurre que al ser llamado execute() se cumple el errorConsulta pero sale un array 0000 – Dev 200 Jun 12 '17 at 23:13
  • Estás mandando mal el parámetro a `bindValue()` el formato que debe tener el parámetro de `$parameter`es `':idEstudiante'` con los dos puntos, intenta eso para ver si ya te regresa datos. – Yikarus Jun 12 '17 at 23:20
  • Trate con : puntos y sin puntos, leyendo la guia de phpdelusion.net indica que eso no importa como se ponga y tengo otras consultas asi y funciona, incluso el método de borrar al asignarle la id funciona – Dev 200 Jun 12 '17 at 23:21
  • No me parece una buena idea extender tu clase `Estudiante` de tu clase `Conexion`. Generalmente extiendes clases que guardan relación entre ellas. Ejemplo, una clase `Cuadrupedos` puede extender de la clase `Animales` para crear en `Cuadrupedos` **sólo aquellos métodos que no están en la clase `Animales`**. En ese sentido, extender `Estudiantes` de `Conexion` no tiene mucho sentido, más aún cuando puedes disponer de `Conexion` y de sus métodos creando una nueva instancia mediante `new`. Luego, en `Conexion` te falta un método parecido al método `Init` de la clase en Github. – A. Cedano Jun 13 '17 at 00:10
  • Lo que ocurre es que no supe como agregarle los metodos editar ver etc etc al estudiante ya que estan declarados en conexion y al usar extend pude agregarles el atributo conexion, como podria usar los metodos de consulta y demas sin extenderlos? – Dev 200 Jun 13 '17 at 01:34
  • Simplemente haces include del archivo Conexion.php, luego creas un objeto conexión mediante new e invocas los métodos de conexión como se hace habitualmente. En lugar de $this usarías $conexion->metodo(parametros); – A. Cedano Jun 13 '17 at 06:53
  • el problema estaba en la consulta sql la cambie y corregi algunas otros detalles y funciono, hasta quite la extencion @A.Cedano, por otra parte me parece dificil ejeje o no entiendo muy bien todavia tu clase de github – Dev 200 Jun 14 '17 at 15:56
  • Me alegro de que lo hayas solucionada. Si usas la clase tal cual, incluso agregando los métodos que necesites, no será difícil. En el readme de Github explico con algunos ejemplos como usar la clase de forma sencilla, invocando a los métodos de la misma. Puedes usar un mismo método para hacer CRUD (Insertar, Leer, Actualizar, Borrar) sin tener que modificar nada en la clase, aunque la misma se puede personalizar según la necesidad de cada uno. – A. Cedano Jun 14 '17 at 16:03
  • @A.Cedano lo leere bien para entender, solo he visto 15 videos de PHP OO jejeje aun me cuesta, por cierto, creo que el creador o colaborar de la guia de PDO de phpdelusion es este señor: https://stackoverflow.com/users/285587/your-common-sense. Ademas deja esto para revisar la valides de los argumentos en PDO PROPER TUTORIAL: https://github.com/colshrapnel/safemysql – Dev 200 Jun 14 '17 at 16:24
  • @A.Cedano tambien te dejo esta pregunta donde anexe unos link interesantes sobre PDO https://es.stackoverflow.com/questions/78554/diferencia-entre-execute-y-query-en-mysql – Dev 200 Jun 14 '17 at 16:26

1 Answers1

0

Existian algunos errores en las consultas SQL y en el modo de devolver los datos:

Clase Conexion:

use PDO;
class Conexion 
{
    private $_host;
    private $_user;
    private $_pass;
    private $_dbname;
    private $_charset;

    private $_conexion; // Conexion a la base de Datos
    private $_consulta; // Consultas
    private $_errorPDO;
    private $_errorConsulta;

    public function __construct() {
        $archivo = 'config.ini.php';
        $configurar = parse_ini_file($archivo, true);

        $this->_host    = $configurar['basedatos']['host'];
        $this->_user    = $configurar['basedatos']['user'];
        $this->_pass    = $configurar['basedatos']['pass'];
        $this->_dbname  = $configurar['basedatos']['dbname'];
        $this->_charset = $configurar['basedatos']['charset'];
        try 
        {

        $this->_conexion = new PDO("mysql:host=$this->_host;
                dbname=$this->_dbname;
                charset=$this->_charset", 
                $this->_user, 
                $this->_pass);
        $this->_conexion->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        }

        catch(PDOException $e)
        {
            $errorPDO = $this->_errorPDO = $e->getMessage();
        }
    }

    public function preparar($sql) {
        $this->_consulta = $this->_conexion->prepare($sql);
    }

    public function asignar($parametro, $valor, $tipo = null){
        if(is_null($tipo)){
            switch (true) {
                case is_int($valor):
                    $tipo = PDO::PARAM_INT;
                    break;
                case is_bool($valor):
                    $tipo = PDO::PARAM_BOOL;
                    break;
                case is_null($valor):
                    $tipo = PDO::PARAM_NULL;
                    break;
                default:
                    $tipo = PDO::PARAM_STR;
            }  
        }

        $this->_consulta->bindValue($parametro, $valor, $tipo);
    }

    public function ejecutar() {
        $this->_consulta->execute();

        /*$errorConsulta = $this->_consulta->errorInfo();

        $this->errorConsulta($errorConsulta);*/
    }

    public function cerrar() {
        return $this->_conexion=null;
    }

    public function consultaSimple() {
        $resultado = $this->_consulta->fetch(PDO::FETCH_ASSOC);
        return $resultado;
        /*
        datos=$conexion->consultaSimple();
        foreach ($datos as $valor) {
        echo $valor;}
        */
    }

    public function consultaArray() {
        $resultado = $this->_consulta->fetchAll(PDO::FETCH_ASSOC);
        return $resultado;
        /*
        datos=$conexion->consultaArray();
        foreach ($datos as $valor) {
        echo $valor;}
        */
    }

    public function contarRegistros() {
        $datos = $this->_consulta->rowCount();
        return $datos;
    }

    public function ultimoId() {
        $datos = $this->_consulta->lastInsertId();
        return $datos;
    }

    public function errorConsulta($errorConsulta){
        if(!is_null($errorConsulta)) {
                print_r($errorConsulta);
            } else {
                echo 'Consulta Exitosa';
            }
    }

    public function errorPDO($errorPDO){
        if(!is_null($errorPDO)) {
                print_r($errorPDO[2]);
            } else {
                echo 'Consulta Exitosa';
            }
    }

    public function sanitizarDatos($datos) {
        $datos = trim($datos);
        $datos = stripslashes($datos);
        $datos = htmlspecialchars($datos);
        return $datos;
    }

    public function metodos() {
        $listar = get_class_methods(new Conexion());
        echo "Los Metodos disponibles para la clase son;"."<br><br>";
        foreach ($listar as $metodo) {
            if ($metodo !== "__construct" && $metodo !== "metodos") {
            echo "*$metodo\n"."<br><br>";
            }
        }   
    }

}

Clase Estudiante:

<?php namespace Models;

    class Estudiante
    {
        private $_idEstudiante;
        private $_primerNombre;
        private $_segundoNombre;
        private $_primerApellido;
        private $_segundoApellido;
        private $_fechaNacimiento;
        private $_fotografia;
        private $_promedio;
        private $_fechaInscripcion;
        private $_seccionId;
        private $_conexion;

        public function set($atributo, $contenido) {
            $this->$atributo = $contenido;
        }

        public function get($atributo) {
            return $this->$atributo;
        }


        public function listar()
        {
            $sql = "
                 SELECT t1.*,t2.descripcionSeccion
                 as descripcionSeccion
                 FROM estudiantes t1 
                 INNER JOIN secciones t2 
                 ON  t1.seccionId = t2.idSeccion
                ";
            $this->_conexion->preparar($sql);
            $this->_conexion->ejecutar();
            $this->_conexion->cerrar();
        }

        public function registrar()
        {
            $sql = "INSERT INTO estudiantes (primerNombre,segundoNombre,
                    primerApellido,segundoApellido,fechaNacimiento,fotografia,promedio,
                        fechaInscripcion,seccionId) 
                    VALUES 
                    (:primerNombre,:segundoNombre,:primerApellido,:segundoApellido,
                    :fechaNacimiento,:fotografia,:promedio,:fechaInscripcion,:seccionId)";

            $primerNombre = $this->_primerNombre;
            $segundoNombre = $this->_segundoNombre;
            $primerApellido = $this->_primerApellido;
            $segundoApellido =  $this->_segundoApellido;
            $fechaNacimiento = $this->_fechaNacimiento;
            $fotografia = $this->_fotografia;
            $promedio = $this->_promedio;
            $fechaInscripcion = $this->_fechaInscripcion;
            $seccionId = $this->_seccionId;

            $this->_conexion->preparar($sql);

            $this->_conexion->asignar("primerNombre",$primerNombre);
            $this->_conexion->asignar("segundoNombre",$segundoNombre);
            $this->_conexion->asignar("primerApellido",$primerApellido);
            $this->_conexion->asignar("segundoApellido",$segundoApellido);
            $this->_conexion->asignar("fechaNacimiento",$fechaNacimiento);
            $this->_conexion->asignar("fotografia",$fotografia);
            $this->_conexion->asignar("promedio",$promedio);
            $this->_conexion->asignar("fechaInscripcion",$fechaInscripcion);
            $this->_conexion->asignar("seccionId",$seccionId);

            $this->_conexion->ejecutar();

            $this->_conexion->cerrar();

        }

        public function borrar() {
            $sql = "DELETE FROM estudiantes WHERE idEstudiante=:idEstudiante";

            $idEstudiante=$this->_idEstudiante;

            $this->_conexion->preparar($sql);

            $this->_conexion->asignar("idEstudiante",$idEstudiante);

            $this->_conexion->ejecutar();

            $this->_conexion->cerrar();
        }

        public function editar() {

            $sql = "UPDATE estudiantes  SET 
            primerNombre = :primerNombre, 
            segundoNombre = :segundoNombre, 
            primerApellido = :primerApellido, 
            segundoApellido = :segundoApellido WHERE idEstudiante=:idEstudiante";

            $primerNombre = $this->_primerNombre;
            $segundoNombre = $this->_segundoNombre;
            $primerApellido = $this->_primerApellido;
            $segundoApellido = $this->_segundoApellido;
            $idEstudiante = $this->_idEstudiante;

            $this->_conexion->preparar($sql);

            $this->_conexion->asignar("primerNombre",$primerNombre);
            $this->_conexion->asignar("segundoNombre",$segundoNombre);
            $this->_conexion->asignar("primerApellido",$primerApellido);
            $this->_conexion->asignar("segundoApellido",$segundoApellido);
            $this->_conexion->asignar("idEstudiante",$idEstudiante);

            $this->_conexion->ejecutar();

            $this->_conexion->cerrar();

        }



        public function ver() {

                $sql = "SELECT t1.*,t2.descripcionSeccion
                 as descripcionSeccion 
                 FROM estudiantes t1 
                 INNER JOIN secciones t2 
                 ON  t1.seccionId = t2.idSeccion
                 WHERE idEstudiante= :idEstudiante";

            $idEstudiante = $this->_idEstudiante;

            $this->_conexion->preparar($sql);

            $this->_conexion->asignar("idEstudiante",$idEstudiante);

            $this->_conexion->ejecutar();

            $this->_conexion->cerrar();
        }

        public function metodos() {
            $listar = get_class_methods(new Estudiante());
            echo "Los Metodos disponibles para la clase son;"."<br><br>";
            foreach ($listar as $metodo) {
                if ($metodo !== "__construct" && $metodo !== "metodos") {
                echo "*$metodo\n"."<br><br>";
                }
            }   
        }
    }
Dev 200
  • 5,246
  • 5
  • 39
  • 80