New question

Question:

Date: 22-10-2016 03:50:56 (In Spanish)

Error en código PHP: Fatal error: Uncaught Error: Call to a member function prepare() on null[Resolved]

Buenos días, cuando ejecuto el código me sale este error

Fatal error: Uncaught Error: Call to a member function prepare() on null in /var/www/html/login.php/datos/UsuarioDao.php:27 Stack trace: #0 /var/www/html/login.php/controlador/UsuarioControlador.php(13): UsuarioDao::login(Object(Usuario)) #1 /var/www/html/login.php/vista/index.php(5): UsuarioControlador::login('santiago91', '1234') #2 {main} thrown in /var/www/html/login.php/datos/UsuarioDao.php on line 27



UsuarioDao.php:

<?php

include 'conexion.php';
include '../entidades/usuario.php';

class UsuarioDao extends Conexion{ /*Hereda todo lo que tiene conexion */

  protected static $cnx;

  private static function getConexion()
  {
    self::$cnx = Conexion::conectar();
  }

  private static function desconectar(){

    self::$cnx = null;
  }

/*Metodo que sirve para validar el login*/
  public static function login($usuario){

    $query = "SELECT * FROM usuarios WHERE usuario = :usuario AND password = :password";

    self::getConexion();

    $resultado = self::$cnx->prepare($query);
    $resultado->bindParam(":usuario", $usuario->getUsuario());
    $resultado->bindParam(":password", $usuario->getPassword());

    $resultado->execute();

    if($resultado->rowCount() > 0){

      $filas = $resultado->fetch();
      if($filas["usuario"] == $usuario->getUsuario() && $filas["password"] == $usuario->getPassword()){

        return true;
      }
    }
      return false;
  }
}

 ?>


conexion.php:

<?php

class Conexion{

  /*Conexión a la base de datos

  * @return PDO

  */

  public static function conectar(){

    try {

      $cn= new PDO("pgsql:host=localhost;port=5432;dbname=login_php","postgres","22927175");

    } catch (PDOException $e) {

        die($ex->getMessage());
    }

  }
}


UsuarioControlador.php:
<?php

include '../datos/UsuarioDao.php';

class UsuarioControlador{

    public static function login($usuario, $password){

      $obj_usuario = new Usuario();
      $obj_usuario->setUsuario($usuario);
      $obj_usuario->setPassword($password);

      UsuarioDao::login($obj_usuario);
    }

  }

 ?>


Usuario.php
<?php

class Usuario{

  private $id;
  private $nombre;
  private $usuario;
  private $email;
  private $password;
  private $privilegio;
  private $fecha_registro;

  public function getId(){
		return $this->id;
	}

	public function setId($id){
		$this->id = $id;
	}

	public function getNombre(){
		return $this->nombre;
	}

	public function setNombre($nombre){
		$this->nombre = $nombre;
	}

	public function getUsuario(){
		return $this->usuario;
	}

	public function setUsuario($usuario){
		$this->usuario = $usuario;
	}

	public function getEmail(){
		return $this->email;
	}

	public function setEmail($email){
		$this->email = $email;
	}

	public function getPassword(){
		return $this->password;
	}

	public function setPassword($password){
		$this->password = $password;
	}

	public function getPrivilegio(){
		return $this->privilegio;
	}

	public function setPrivilegio($privilegio){
		$this->privilegio = $privilegio;
	}

	public function getFecha_registro(){
		return $this->fecha_registro;
	}

	public function setFecha_registro($fecha_registro){
		$this->fecha_registro = $fecha_registro;
	}
}



 ?>
Tags: Error - PHP - PHP Fatal error - Question - Source code Votes: 0 - Answers: 13 - Views: 18 Share on: Google Facebook Twitter LinkedIn Link
 

Answers:

  • Date: 22-10-2016 04:17:51 Hola, muestra el código de tu archivo login.php y el archivo del formulario, para ver así el problema quizás estas capturando mal las cajas de texto   Votes: 0 - Link answer
     
  • Date: 22-10-2016 05:27:35 Aún no tengo un formulario hermano, estoy probando primero y eso es lo que me arroja.
    Este el index.php

    <?php
    
    include '../controlador/UsuarioControlador.php';
    
    echo UsuarioControlador::login("santiago91","1234");
    ?>
    
      Votes: 0 - Link answer
     
  • Date: 22-10-2016 06:30:48 Ya verifiqué si hay problemas con la clase conectar pero la conexión resulta exitosa cuando le pongo el if($cn){ echo "exito";} Seguiré indagando, ojalá puedan auxiliarme por acá   Votes: 0 - Link answer
     
  • Date: 22-10-2016 08:32:27 En la clase conectar añadí un return $cn en la línea 16, ahí retorna la conexión pero ahora me sale este error:
     Notice: Only variables should be passed by reference in /var/www/html/login.php/datos/UsuarioDao.php on line 35
    
    Notice: Only variables should be passed by reference in /var/www/html/login.php/datos/UsuarioDao.php on line 37


    Es en el archivo UsuarioDao.php líneas 35, 37 respectivamente. Seguiré indagando, si pueden ayudarme se los agradeceré
      Votes: 0 - Link answer
     
  • Date: 22-10-2016 13:02:04 Lo solventé gracias a Dios, lo último que me arrojaba mas que un error era una notificación pero son de esas que seguirán apareciendo si no las quitas. En un foro vi que se podía desactivar

    error_reporting(0); en el php.ini esa fue la solución
      Votes: 0 - Link answer
     
  • Date: 22-10-2016 17:23:12 estimado Santiago, la configuracion de eliminar el reporte de error no es mala idea, y esta recomentado ser utilizado en el momento del desarrollo y no en produccion, sin embargo si quieres mantener esa configuracion simplemente antepone un simbolo de arroba @ en la funcion que refieres y esta ya no va a reportar error, ej:

    con error en pantalla
    conectado = $this->conectar();

    sin error en pantalla

    conectado = @$this->conectar();

    sin embargo si el error no te interesa o no te afecta en el transcurso de la aplicacion siempre puedes acudir al log ya sea el que general apache o bien crearte uno propio.

    espero esto pueda ser de utilidad para resolver tu problema
    saludos desde Guatemala.
      Votes: 1 - Link answer
     
  • Date: 23-10-2016 05:43:19 Gracias hermano, hice la prueba y funciona; sinceramente no quedé satisfecho con haber eliminado el reporte pero fue la alternativa que conseguí. Gracias de nuevo por el tip!   Votes: 0 - Link answer
     
  • Date: 24-10-2016 09:04:03 Usas algún Framework??? O.o   Votes: 0 - Link answer
     
  • Date: 24-10-2016 12:53:07 Aclaro que no soy un experto, estoy aprendiendo a programar y empecé por PHP por exigencias de la universidad.
    Si, utilizó bootstrap. ¿Por qué hermano?.
      Votes: 0 - Link answer
     
  • Date: 24-10-2016 15:29:35 Hola Santiago, antes que nada debo decirte que es muy mala práctica el uso del @ y/o desentenderse de los errores, has hecho bien en solicitar ayuda, pero no debes conformarte con el ocultamiento, ya que tu problema sigue ahí.

    Volviendo a tu error, el mismo esta bien claro, estas llamando a la función "prepare()" sobre una variable que contiene NULL, o sea, no estas preparando ninguna query, y esto pasa en tu archivo UsuarioDao.php, línea 27.

    Si vemos la línea 27 observamos que estas haciendo esta invocación:

    resultado = self::$cnx->prepare($query);


    Entonces claramente el problema esta en que no se esta cargando la variable estática self::$cnx con la conexión PDO, ya que la variable self::$cnx termina conteniendo NULL

    Si vemos en la línea 25 del mismo archivo:

    self::getConexion();


    O sea, estas invocando la supuesta carga de esa variable (self::$cnx), y digo supuesta porque dentro de getConexion() la llamada a Conexion::conectar() no devuelve nada.... y aquí el error, el cual esta en el archivo conexion.php

    Veamos el problema:
    En el archivo conexión.php tienes declarada la función conectar() que no retorna nada, te estaría faltando poner en la línea 16 de ese archivo el código "return $cn;" y listo, quedaría así:

    <?php
    
    class Conexion{
    
      /*Conexión a la base de datos
    
      * @return PDO
    
      */
    
      public static function conectar(){
    
        try {
    
          $cn= new PDO("pgsql:host=localhost;port=5432;dbname=login_php","postgres","22927175");
          return $cn;
        } catch (PDOException $e) {
    
            die($ex->getMessage());
        }
    
      }
    }
    


    Espero que mi respuesta te sea de ayuda.

    Saludos y buen código!
      Votes: 3 - Link answer
     
  • Date: 24-10-2016 16:37:55 Gracias por el apoyo señor Fernando y mas aún gracias por la explicación del error; la había leído en otros foros pero no de una forma tan sencilla como la explica usted.

    Pero verá, verifiqué la clase de conexión luego de abrir esta pregunta y en efecto faltaba el "return $cn" pero fue luego de colocar esa línea de código que empezó a arrojarme el error o más bien el "NOTICE" de "only variables should be pass by reference" seguí la opción de desactivar el error_reporting para continuar con el codificación.

    Si puede estudiar el código tomando en cuenta que luego de colocar "return $cn" me arroja el warning que ya mencioné le agradecería enormemente su ayuda.
      Votes: 1 - Link answer
     
  • Date: 25-10-2016 08:47:08 Bien, veamos, el "Notice: Only variables should be passed by reference" esta dado por la forma de utilizar el bindParam, no puedes usar directamente el método, sino una variable que contenga el valor, veamoslo en código:

    Tu pasas el valor al bindParam de la siguiente forma:
    $resultado->bindParam(":usuario", $usuario->getUsuario());
    $resultado->bindParam(":password", $usuario->getPassword());


    Y la forma correcta es la siguiente:
    $datoUsuario = $usuario->getUsuario();
    $datoPassword = $usuario->getPassword();
    $resultado->bindParam(":usuario", $datoUsuario);
    $resultado->bindParam(":password", $datoPassword);


    Nunca ocultes errores (jamas de los jamases).

    Saludos y buen código!
      Votes: 1 - Link answer
     
  • Date: 25-10-2016 13:34:24 ¡Santo remedio! De la patria grande de Argentina tenía que ser señor Fernando. Gracias a todos una vez mas por aportar su grano de arena, me siento pequeño delante de todos pero tengo el deseo de aprender y seguiré adelante.

    En mi experiencia como novato lo que se me hace más difícil es saber por donde empezar pero por algún lado se comienza. Gracias a Dios por esta comunidad.
      Votes: 1 - Link answer
     
To actively participate in the community first must authenticate, enter the system.Sign In
 
frjcbbae garagebible.com