Jump to content


Photo

Pdo Exception


  • Faça o login para participar
2 replies to this topic

#1 finish

finish

    12 Horas

  • Usuários
  • 144 posts
  • Sexo:Não informado

Posted 16/12/2008, 11:30

Galera, como que funciona o exception do PDO, não estou conseguindo entender. O que eu quero fazer é tentar rodar uma query, caso ela tenha erro, retornar uma mensagem amigável e gravar o erro em um log!! Como que faz isso.

O que faço atualmente: ($conn é a conexão já efetuada)

$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

			try
			{
				$conn->exec("Select * from tbl_usuariosss");
				echo"OK";
			}
			catch (PDOException $e)
			{
				 print $e->getMessage();
			}

O que acontece é o seguinte, por eu setar o atrribute como EXCEPTION ele já me lança uma exceção, e por eu ter no catch o print, ele me lança pela segunda vez a exceção!!

Se eu troco para SILENT o attribute, ele não me mostra nada no catch, pq ? Como eu faço para apresentar a mensagem para o usuário e ter a mensagem em log para mim ???

#2 Paulo Freitas

Paulo Freitas

    ××××××× LRU #456504 ××××××× ××××××× LRM #364686 ×××××××

  • Ex-Admins
  • 5612 posts
  • Sexo:Masculino
  • Localidade:Campinas - SP

Posted 16/12/2008, 18:17

Well, não consigo reproduzir o problema... Rodei o código abaixo no terminal:

<?php

$conn = new PDO('sqlite::memory:');
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

try {
	$conn->exec('SELECT * FROM tbl_usuariosss');
	print 'Ok';
} catch (PDOException $e) {
	print $e->getMessage();
}

?>

E me foi retornada uma mensagem de erro uma única vez:

SQLSTATE[HY000]: General error: 1 no such table: tbl_usuariosss

Tem algo de errado aí. Sobre a última pergunta, não é nada bom exibir a mensagem de erro pro usuário, exiba uma mensagem de erro padrão. Tu até pode pegar o código do erro pelo método getErrorCode() do objeto da exceção ($e) e gerar uma mensagem de erro customizada, mas nenhuma informação sensível pode ser divulgada. Sobre gravar o erro em log, você pode usar a função error_log() dentro do catch. :)

[]’s :DAté mais

#3 finish

finish

    12 Horas

  • Usuários
  • 144 posts
  • Sexo:Não informado

Posted 18/12/2008, 10:42

Deu certo Paulo, eu estava comendo bola em um detalhe do setAttribute.

Quanto a mensagem, estou fazendo isso mesmo, só mostra "Erro" para o usuário e mando por email o erro para mim!

Obrigado!


Só que fiquei agora com uma outra dúvida relacionado a PDO. É o seguinte, tenho um campo int no banco, chamado unidade. Quando retorno ele através do fetchObject, eu jogo em um array de um método.

Ao utilizar esses valor retornados, e utilizar um foreach para ler o array, para minha surpresa o campo esta como string! Eu preciso que fique como inteiro, pq acontece isso ?

=====

Seguinte, fiz um teste, gostaria de entender pq o php trata desta forma:
foreach($unidade as $l)
		{
			$unidade = $l->num_unid;
			echo"Mostrando valor da var";
			echo $l->num_unid;
			echo"<br> Mostrando tipo da var";
			echo gettype($l->num_unid);
			echo"<br> Setando  um tipo especifico para a var";
			echo settype($l->num_unid, "integer");
			echo"<br> Var definida ficou como string, mesmo setando ela como integer<br>";
			echo gettype($l->num_unid);

			echo"<br> Agora, joguei o valor em uma váriavel qualquer";
			echo settype($unidade, "integer");
			echo"<br> Desta vez, ele aceitou o tipo, e deixou como inteiro<br>";
			echo gettype($unidade);
			echo"<br>";
		}

Se eu uso a váriavel do foreach para verificar o tipo, ele não seta o tipo, agora se eu jogo o valor em uma nova variavel e tento, ele aceita, pq isto ?

Edição feita por: finish, 18/12/2008, 11:14.





1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq