Ir para conteúdo

POWERED BY:

Arquivado

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

Will Fernando

[Resolvido] autentificação com PDO

Recommended Posts

opa galera to com um problemin ... seguinte tenho um metodo que faz a autentificação ..so que.. nao ta funcionando.. *acho que na teoria devia funciona :P hehe .. mas se alquem souber pq.. ou de algum outro modo de faze isso favor da uma dicazin :P

 

valww

logo abaixo os resultados dos testes e o script =]

 

*mudei o return so pra testa oque tava voltando

 

object(ArrayIterator)#3 (1) {

["storage":"ArrayIterator":private]=>

array(1) {

[0]=>

string(8) "Database"

}

}

 

object(ArrayIterator)#4 (1) {

["storage":"ArrayIterator":private]=>

array(0) {

}

}

public static function getAuthentication($User, $Pws, PDO $Conn){
		try{
			$Authentication = $Conn->prepare("
			SELECT USUARIO, SENHA, NIVEL FROM USUARIOS WHERE USUARIO=':User' AND SENHA= ':Pws'
			");
			$Authentication->bindParam(':User', $User, PDO::PARAM_STR, 50);
			$Authentication->bindParam(':Pws', $Pws, PDO::PARAM_STR, 50);
			$Authentication->execute();
			$AList = new ArrayIterator($Authentication->fetchAll(PDO::FETCH_OBJ));
			if(count($AList) != 0){
				$ReplyAuth = $AList;
			}else {
				$ReplyAuth = FALSE ;
		    }
		}
		catch(PDOException $EAuthenticaion){
          throw new RuntimeException( sprintf( 'Erro ao executar realizar a autentificação: %s', $EAuthentication->getMessage() ) );
	    }
	   return $AList; 
	}
}
//Testes
Registry::IteratorView();
$Conn = Registry::get('Database');
try{
}
catch(RuntimeException $EAuthenticaion){
	echo $EAuthenticaion->getMessage();
}
echo '<pre>';
var_dump(DAUsuarios::getAuthentication('meriane',123456, $Conn));
echo '</pre>';

Compartilhar este post


Link para o post
Compartilhar em outros sites

efetue um var_dump em $Authentication e verifique se ela te retorna um objeto do tipo PDOStatement

 

efetue um var_dump($Authentication->fetchAll(PDO::FETCH_OBJ)) e verifica se ele te retorna um array() contendo N objetos de tipo stdObj

 

itere sobre o resultado de fetchAll normalmente, sem a necessidade de instanciar um ArrayObject, a menos que necessite fazer manipulações próprias com a tabela recebida

 

$replacement = array(
    ':User' => $User,
    ':Pws' => $Pws
);
$Authentication->execute($replacement);
$data = $Authentication->fetchAll(PDO::FETCH_OBJ);
if(sizeof($data)) return $data;
else return false;

Compartilhar este post


Link para o post
Compartilhar em outros sites

do Authentication retorna

object(PDOStatement)#3 (1) {

["queryString"]=>

string(92) "

SELECT USUARIO, SENHA, NIVEL FROM USUARIOS WHERE USUARIO=':User' AND SENHA= ':Pws'

"

}

do fetchAll(PDO::FETCH_OBJ) sem o ArrayIterator retorna *com tambem retorna nada

 

nada

Compartilhar este post


Link para o post
Compartilhar em outros sites

itere sobre o resultado de fetchAll normalmente, sem a necessidade de instanciar um ArrayObject

Se você vai trabalhar com objetos, trabalhe 100% com objetos. PDOStatement::query() retorna uma matriz...

 

Will, fiz dê uma olhada nos comentários.

 

public static function getAuthentication($User, $Pws, PDO $Conn){
	$AList = null; //o null jamais será retornado, só estamos declarando a variável

	try{
		/**
		 * Se você está prepara uma consulta com o método prepare, você não precisa das aspas nos valores
		 * que serão substituídos pelos métodos bindParam() e bindValue(), isso será feito automaticamente.
		 */
		$Authentication = $Conn->prepare( 'SELECT USUARIO, SENHA, NIVEL FROM USUARIOS WHERE USUARIO=:User AND SENHA=:Pws' );
		$Authentication->bindParam(':User', $User, PDO::PARAM_STR, 50);
		$Authentication->bindParam(':Pws', $Pws, PDO::PARAM_STR, 50);

		if ( $Authentication->execute() ){
			$AList = new ArrayIterator( $Authentication->fetchAll( PDO::FETCH_OBJ ) );
		} else {
			throw new RuntimeException( sprintf( 'Erro ao executar a consulta: %s' , implode( ',' , $pdo->errorInfo() ) ) , $pdo->errorCode() );
		}
	} catch( PDOException $EAuthenticaion ){
		throw new RuntimeException( sprintf( 'Erro ao executar realizar a autentificação: %s', $EAuthentication->getMessage() ) );
	}

	return $AList;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

resultados apos alterações feitas

 

obs: eu testei a sql esta correta

SELECT USUARIO, SENHA, NIVEL FROM USUARIOS WHERE USUARIO='meriane' AND SENHA= '123456'

resultado:

object(ArrayIterator)#3 (1) {

["storage":"ArrayIterator":private]=>

array(1) {

[0]=>

string(8) "Database"

}

}

 

 

 

Fatal error: Uncaught exception 'RuntimeException' with message 'Erro ao executar a consulta' in C:\"caminho"\DAUsuarios.php:103

Stack trace:

#0 C:\"caminho"\DAUsuarios.php(121): DAUsuarios::getAuthentication('meriane', 123456, Object(Database))

#1 {main}

thrown in C:\"caminho"\DAUsuarios.php on line 103

script:

public static function getAuthentication($User, $Pws, PDO $Conn){
		$ReplyAuth = null;
		try{
			$Authentication = $Conn->prepare('
			SELECT USUARIO, SENHA, NIVEL FROM USUARIOS WHERE USUARIO= :User AND SENHA= :Pws
			');
			$Authentication->bindParam(':User', $User, PDO::PARAM_STR, 50);
			$Authentication->bindParam(':Pws', $Pws, PDO::PARAM_STR, 50);
			if($Authentication->execute()){
				$ReplyAuth = New ArrayIterator($Authentication->fetchAll(PDO::FETCH_OBJ));
			}else {
				throw new RuntimeException('Erro ao executar a consulta');
		    }
		}
		catch(PDOException $EAuthenticaion){
          throw new RuntimeException( sprintf( 'Erro ao executar realizar a autentificação: %s', $EAuthentication->getMessage() ) );
	    }
	   return $ReplyAuth; 
	}
}
//Testes
$Conn = Registry::get('Database');
Registry::IteratorView();
echo '<pre>';
var_dump(DAUsuarios::getAuthentication('meriane',123456, $Conn));
echo '</pre>';
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Will, você tirou a parte mais importante, a que relata o erro, devolva o RuntimeException da forma que eu havia passado que encontraremos a origem do problema:

 

throw new RuntimeException( sprintf( 'Erro ao executar a consulta: %s' , implode( ',' , $Conn->errorInfo() ) ) , $Conn->errorCode() );

Compartilhar este post


Link para o post
Compartilhar em outros sites

apos trosentos mil testes novidades ...

 

resposta ta sendo :

 

object(ArrayIterator)#3 (1) {

["storage":"ArrayIterator":private]=>

array(1) {

[0]=>

string(8) "Database"

}

}

 

object(PDOStatement)#3 (1) {

["queryString"]=>

string(89) "

SELECT USUARIO, SENHA, NIVEL FROM USUARIOS WHERE USUARIO= :User AND SENHA= :Pws

"

}

 

 

	public static function getAuthentication($User, $Pws, PDO $Conn){
		$ReplyAuth = null;
		try{
			$Authentication = $Conn->prepare("
			SELECT USUARIO, SENHA, NIVEL FROM USUARIOS WHERE USUARIO= :User AND SENHA= :Pws
			");
			$Authentication->bindParam(':User', $User, PDO::PARAM_STR);
			$Authentication->bindParam(':Pws', $Pws, PDO::PARAM_STR);
			if($Authentication->execute()){
				$ReplyAuth = New ArrayIterator($Authentication->fetchAll(PDO::FETCH_OBJ));
			}else {
				throw new RuntimeException( sprintf( 'Erro ao executar a consulta: %s' , implode( ',' , $Conn->errorInfo() ) ) , $Conn->errorCode() );
		    }
		}
		catch(PDOException $EAuthenticaion){
          throw new RuntimeException( sprintf( 'Erro ao executar realizar a autentificação: %s', $EAuthentication->getMessage() ) );
	    }
	   return $Authentication; 
	}
}
//Testes
$Conn = Registry::get('Database');
Registry::IteratorView();
try{
	
}catch(RuntimeException $Eroo){
	echo $Eroo->getMessage();
}
echo '<pre>';
var_dump(DAUsuarios::getAuthentication('meriane',123456, $Conn));
echo '</pre>';
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

	public static function getAuthentication($User, $Pws, PDO $Conn){
		$ReplyAuth = null;
		//...
				$ReplyAuth = New ArrayIterator($Authentication->fetchAll(PDO::FETCH_OBJ));
		//...
		return $Authentication; 
	}
}

Will, você não deveria estar retornando um $ReplyAuth ???

 

Você está retornando o $Authentication, mas acho que não é o que você precisa.

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

itere sobre o resultado de fetchAll normalmente, sem a necessidade de instanciar um ArrayObject

Se você vai trabalhar com objetos, trabalhe 100% com objetos. PDOStatement::query() retorna uma matriz...

$replacement = array(
    ':User' => $User,
    ':Pws' => $Pws
);
$Authentication->execute($replacement);
$data = $Authentication->fetchAll(PDO::FETCH_OBJ);
if(sizeof($data)) return new ArrayIterator($data);
else return false;

^^

Compartilhar este post


Link para o post
Compartilhar em outros sites

if(sizeof($data)) return new ArrayIterator($data);
else return false;

Evandro, apenas uma consideração pessoal, baseada em minha própria experiência...

 

Veja:

 

Se a matriz tiver 1 ou mais elementos, retorna um iterator

Senão retorna falso.

 

O problema dessa situação é que, normalmente, tratamos um retorno falso como uma falha, porém não é o que acontece nesse caso já que o método não falhou, apenas não trouxe nenhum resultado para sua consulta.

 

Eu retornaria o iterator independente de ter ou não conteúdo, afinal, não é responsabilidade do método tratar o resultado, ele deve retornar o que é esperado independente de qualquer coisa e, se falhar disparar uma exceção, quem deverá tratar o resultado será o Client que usará essa informação.

 

Em linguagens como Java, ao definir a interface de um objeto, você também define o tipo de retorno e nesse caso, isso iria falhar, já que você especifica um Iterator e retorna um Boolean. Existe a possibilidade de o PHP 6 vir com especificação de tipo de retorno para os métodos assim como já existe para os parâmetros e, se isso de fator ocorrer, esse tipo de implementação também não será mais aconselhável, mesmo que você não especifique o tipo de retorno.

Compartilhar este post


Link para o post
Compartilhar em outros sites

você não deveria estar retornando um $ReplyAuth ???

opa tinha trocado so pra testa acabei esquecendo de muda devolta :P

agora funciono

 

*resolvido

 

valwww galera

 

resumo:

o problema principal estava no bindParam quando tentava delimitar o numero de caracter string. foi resolvido removendo esse parametro.

 

script final:

public static function getAuthentication($User, $Pws, PDO $Conn){
		$ReplyAuth = null;
		try{
			$Authentication = $Conn->prepare("
			SELECT USUARIO, SENHA, NIVEL FROM USUARIOS WHERE USUARIO= :User AND SENHA= :Pws
			");
			$Authentication->bindParam(':User', $User, PDO::PARAM_STR);
			$Authentication->bindParam(':Pws', $Pws, PDO::PARAM_STR);
			if($Authentication->execute()){
				$ReplyAuth = New ArrayIterator($Authentication->fetchAll(PDO::FETCH_OBJ));
			}else {
				throw new RuntimeException( sprintf( 'Erro ao executar a consulta: %s' , implode( ',' , $Conn->errorInfo() ) ) , $Conn->errorCode() );
			}
		}
		catch(PDOException $EAuthenticaion){
			throw new RuntimeException( sprintf( 'Erro ao executar realizar a autentificação: %s', $EAuthentication->getMessage() ) );
		}
		return $ReplyAuth;
	}
}
//Testes
$Conn = Registry::get('Database');
Registry::IteratorView();
try{

}catch(RuntimeException $Eroo){
	echo $Eroo->getMessage();
}
echo '<pre>';
var_dump(DAUsuarios::getAuthentication('meriane',123456, $Conn));
echo '</pre>';
?>

resposta final:

 

 

object(ArrayIterator)#3 (1) {

["storage":"ArrayIterator":private]=>

array(1) {

[0]=>

string(8) "Database"

}

}

 

object(ArrayIterator)#4 (1) {

["storage":"ArrayIterator":private]=>

array(1) {

[0]=>

object(stdClass)#5 (3) {

["USUARIO"]=>

string(7) "meriane"

["SENHA"]=>

string(6) "123456"

["NIVEL"]=>

string(1) "1"

}

}

}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Em linguagens como Java, ao definir a interface de um objeto, você também define o tipo de retorno e nesse caso, isso iria falhar, já que você especifica um Iterator e retorna um Boolean. Existe a possibilidade de o PHP 6 vir com especificação de tipo de retorno para os métodos assim como já existe para os parâmetros e, se isso de fator ocorrer, esse tipo de implementação também não será mais aconselhável, mesmo que você não especifique o tipo de retorno.

 

Sim, eu arranho um pouco em C e o return type é necessário. Eu particularmente gosto da peculiaridade do PHP de multi-type mesmo sendo considerado 'ruim'. Para cobrir o tipo exato de comparação, existe o comparador idêntico.

 

No caso da função dele, poderia ser tratado o retorno de autenticação de maneira fácil se a função não retornasse sempre um objeto iterator

 

 

if (!$DAUsuarios::getAuthentication($username,$password) echo 'Logon falhou';

Acredito que, por ser ele quem está montando as queryes, o manipulamento de erro de queryString só se faz necessário enquanto no ambiente de desenvolvimento, para fins de debug. Depois que for conferido que todas as queryes estão OK que o sistema loga perfeitamente, as exceptions e mensagens de debug quanto à querystring deveriam ser removidas para fins de segurança, já que todos os possíveis erros previstos seriam falha na resposta do servidor SGDB ou usuário e senha inválidos.

 

Creio que eu deva estar indo de encontro com algum padrão de codificação, por isso a sua orientação. Mas eu gosto de aproveitar as "falhas" do PHP em prol da praticidade =\ vício.

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.