Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Atila Rampazo

[PDO] Erro

Recommended Posts

Caros boa tarde!

Estou tendo esse problema que ja esta me deixando louco, se alguem puder me ajudar agradesceo

<?php


class login {
           // irá receber uma conexão
public $conn = null;
// contrutor
public function loginDAO(){
	$this->conn = new Conexao();
}

       public function ValidaUsuario($Usuario,$Senha){        
         	try {
                       $Senha = md5($Senha);
                       $stmt = $this->conn->prepare("SELECT count(*) as resgistros FROM tblUsuario  WHERE Ativo = 1 AND  Usuario = '?' AND Senha = '?'")or trigger_error(print_r($this->con->errorInfo()));
                       $stmt->bindValue(1, $Usuario);
                       $stmt->bindValue(2, $Senha);
                       $stmt->execute();
                       $number_of_rows = $stmt->fetchColumn();
                       // Se houver apenas um usuário, retorna true 
                       return ($number_of_rows == 1) ? true : false;   
	} catch (Exception $e) {
		echo "Erro:".$e->getMessage();
	}
       }

}

?>

 

Erro: Fatal error: Call to a member function prepare() on a non-object in /home/buddyweb/public_html/PHPOO/osexpress/classes/Login/login.class.php on line 15

Compartilhar este post


Link para o post
Compartilhar em outros sites

posta a classe Conexao.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só apaguei os dados do servidor pois e de cliente

Engraçado que em outros lugares da pagina funciona normalmente select etc...

<?php
/*
* 1ª: Criamos no construtor um retorno dos métodos da classe pai que de outra forma estaria indisponível para quaisquer outra classe fora de Driver, já que os atributos da classe PDO são private, usando parent::_construct(…) retornamos o construtor de PDO no construtor de Driver e assim fica possível as classes DAO chamarem os métodos de PDO sem precisar reconfigurar/instanciar;
* 2ª. Com o if() checamos se já existe uma conexão aberta, neste caso ela não fará nada, somente no caso de não haver conexão (this->handle==null) será chamada uma nova, isso otimiza nossa aplicação em tempo e performance.
*/
//ela herdará os métodos e atributos do PDO através da palavra-chave extends
class Conexao extends PDO{
private $dsn = '';
private $user = '';
private  $password = '';
private $hadle = null;

function __construct(){
	try {
		// Aqui ela retornará o PDO em si, veja que usei parent::_construct()
		if($this->hadle == null)
		{
			$dbh = parent::__construct($this->dsn,$this->user,$this->password);
			$this->hadle = $dbh;
			return $this->hadle;
		}
	} catch (Exception $e) {
		$this->erro( $e->getMessage());
		return false;
	}
}
//aqui criei um objeto de fechamento da conexão
function __destruct()
{
	$this->handle = null;
}
      function erro($erro_valor)
      {
          error_log($erro_valor."\r\n", 3, "erro/erro.log");
      }
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só apaguei os dados do servidor pois e de cliente

Engraçado que em outros lugares da pagina funciona normalmente select etc...

<?php
/*
* 1ª: Criamos no construtor um retorno dos métodos da classe pai que de outra forma estaria indisponível para quaisquer outra classe fora de Driver, já que os atributos da classe PDO são private, usando parent::_construct(…) retornamos o construtor de PDO no construtor de Driver e assim fica possível as classes DAO chamarem os métodos de PDO sem precisar reconfigurar/instanciar;
* 2ª. Com o if() checamos se já existe uma conexão aberta, neste caso ela não fará nada, somente no caso de não haver conexão (this->handle==null) será chamada uma nova, isso otimiza nossa aplicação em tempo e performance.
*/
//ela herdará os métodos e atributos do PDO através da palavra-chave extends
class Conexao extends PDO{
private $dsn = '';
private $user = '';
private  $password = '';
private $hadle = null;

function __construct(){
	try {
		// Aqui ela retornará o PDO em si, veja que usei parent::_construct()
		if($this->hadle == null)
		{
			$dbh = parent::__construct($this->dsn,$this->user,$this->password);
			$this->hadle = $dbh;
			return $this->hadle;
		}
	} catch (Exception $e) {
		$this->erro( $e->getMessage());
		return false;
	}
}
//aqui criei um objeto de fechamento da conexão
function __destruct()
{
	$this->handle = null;
}
      function erro($erro_valor)
      {
          error_log($erro_valor."\r\n", 3, "erro/erro.log");
      }
}

 

 

Acredito que o erro esteja no conceito. Veja, __construct não é explicitamente um método, e sim um inicializador.

Tanto faz você alterar o valor de return, ele será explicitamente ignorado.

 

<?php

class A
{
   public function __construct()
   {
       # Das linhas a seguir, comente uma a uma e execute novamente o script
       return NULL;
       return TRUE;
       return FALSE;
       return 1;
       return 'String';
   }
}

var_dump(new A());

 

Ainda assim, seu código continua funcionando devido à herança de PDO.

 

Quanto ao erro, você muito provavelmente se esqueceu de fazer uma chamada a login::loginDAO

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu estava fazendo a chamada assim

 

<?php
   include_once '../classes/Conexao.class.php';
   include_once '../classes/Usuarios/Usuario.class.php';
   include_once '../classes/Usuarios/UsuarioDAO.class.php';
   $userClass = new UsuarioDAO();
if($_POST['acao'] == "logar"){
   // Pega os dados vindos do formulário
   $usuario = $_POST['usuario'];
   $senha = $_POST['senha'];
   print_r($userClass->ValidaUsuario( $usuario, $senha ));
}
?>
<!DOCTYPE html>
<html>
   <head>
       <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
       <title></title>
   </head>
   <body>
       <form method="post" action="index.php">
           <input type="text" name="usuario">
           <input type="password" name="senha">
           <input type="submit" name="Logar">
           <input type="hidden" name="acao" value="logar">
       </form>
   </body>
</html>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom Dia!

Fiz como você me disse só que estou tendo um problema, mesmo se eu utilize mysq_num_rows o que seja ele sempre me retorna true, mesmo se ele não trouxer nada do resultado.

Vou postar o DAO e o Frontend

 

DAO

public function ValidaUsuario($Usuario,$Senha){        

         try {

                       $stmt = $this->conn->prepare("SELECT count(*) FROM tblUsuario  WHERE Ativo = 1 AND  Usuario = '?' AND Senha = '?'") or trigger_error(print_r($this->conn->errorInfo()));
                       $stmt->bindValue(1, $Usuario,PDO::PARAM_STR);
                       $stmt->bindValue(2, $Senha,PDO::PARAM_STR);
                       if($stmt->execute())
                       {
                       	return true;
                       }else {
                       	return false;
                       }



	} catch (Exception $e) {

		echo "Erro:".$e->getMessage();

                       return false;

	}

index.php

<?php
   include_once '../classes/Conexao.class.php';
   include_once '../classes/Usuarios/Usuario.class.php';
   include_once '../classes/Usuarios/UsuarioDAO.class.php';
   $userClass = new UsuarioDAO();
if($_POST['acao'] == "logar"){
    // Pega os dados vindos do formulário
    $usuario = $_POST['usuario'];
    $senha = md5($_POST['senha']);

    $userClass->UsuarioDAO();
    if($userClass->ValidaUsuario( $usuario, $senha ))
    {
    	echo 'Você existe no banco';
    }else {
    	echo 'Você não existe no banco';
    }

}
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Num rows te dá o número de linhas retornadas. Como você usa COUNT, você sempre terá, no mínimo, uma linha retornada. Com o valor da contagem.

 

Remova o COUNT ou verifique o valor retornado nessa linha.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.