Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
bem amigos... minha dúvida é a seguinte.. estou fazendo uma consulta ao banco de dados e caso a tabela que estou querendo não exista gostaria de tratar melhor esse erro.. só pra melhores esclarecimentos; O nome da tabela é enviado para o arquivo.php?parametro=tabela. Por um parâmetro via URL então caso o usuário insira outro nome na url ("só de sacanagem") gostaria de tratar isso de uma forma mais elegante e também pra não expor a estrutura de pastas do servidor.
Para isso estou tendo problemas com o código a seguir ...
try{
while(list($id, $imagem)= $result->fetch_row())
echo " <li class='ui-tabs-nav-item' id='nav-fragment-".$id."'>
<a href='#fragment-".$id."'><img src='images/inauguracao/miniaturas/".$imagem."' alt='' />
<span>
".$imagem."
</span>
</a>
</li>";
echo "</ul>";
if(!$result){
throw new Exception("erro");
}
}
catch(Exception $e){
echo "Ocorreu um erro".$e->getLine();
}
reset($result);
com o modelo exposto, e quando eu tento induzir um erro alterando propositalmente o valor do parâmetro via URL a pagina exime o erro simples:
PHP Fatal error: Call to a member function fetch_row() on a non-object in ....... exibegalerias.php on line 60
já tentei inserir como condição do bloco if a função fetch_row() mas não funciona...
a variavel $result é uma chamada ao método query() a classe mysqli() onde contem a string com os dados SQL da consulta, o código em sí funciona perfeitamente, só a questão do tratamento das exceções mesmo que tá pegando!
como devo proceder pra tratar corretamente esse tipo de exceção?
desde já agradecido por qualquer manifestação!
nem empty() e nem isset().. tanto dentro de try/catch quando fora... continua dando o mesmo erro...
Tem certeza que é o mesmo erro? Porque se você fez o if com o throw antes do while, não tem como ele ter chegado no while...
Coloca a linha abaixo antes do if/while e veja o que aparece:
var_dump($result);
também não to entendendo o conteudo abaixo é exibido quando uso a métodos var_dump() passando como parâmetro a variável $result. Ao clicar normalmente a página abre e exibe o texto abaixo dentro da div que está o php:
object(mysqli_result)#2 (5) { ["current_field"]=> int(0) ["field_count"]=> int(2) ["lengths"]=> NULL ["num_rows"]=> int(11) ["type"]=> int(0) }
Mas quando eu induzo o erro na URL aparece o mesmo erro:
PHP Fatal error: Call to a member function fetch_row() on a non-object in caminho do servidor..../arquivo.php on line 66
pensei em algo diferente para resolver o problema, talvez criando um método que recebesse como parâmetro a o valor da variável pela URL e fizesse uma busca por todas as tabelas no banco de dados e caso não correspondesse a nenhuma tabela direciona o usuário para outra página de erro.
isso causaria alguma lentidão na execução? iria prejudicar navegabilidade da página?
Ahhh
O erro agora é em outro arquivo.
Erro inicial:
PHP Fatal error: Call to a member function fetch_row() on a non-object in ....... exibegalerias.php on line 60
Erro depois de adicionar o if:
PHP Fatal error: Call to a member function fetch_row() on a non-object in caminho do servidor..../arquivo.php on line 66
Pelo visto tem outros lugares do mesmo jeito...
não não.. é o mesmo arquivo..
exibegalerias.php é o mesmo que arquivo.php.. só dupliquei o troquei o nome pra não afetar o restante do código.. mas já resolvi meu problema de uma maneira até mais sensata..
Já tenho no meu servidor uma arquivo chamado class.php onde tenho a classe principal do site que sempre que eu preciso executa algumas "coisinhas pra mim!".. como vou precisar fazer isso novamente em outras páginas eu criei um método muito simples na classe principal que retorna um valor boolean...
public function verificaTabela($tabela){
//Arquivo que faz a conexão e seleciona o banco de dados
include("conexao.php");
if(mysqli->query("SELECT * FROM ".$tabela)){
return true; return false;
}
}
optei pelo boolean porque usando um if em verificaTabela($tabela) pode fazer qualquer coisa com o usuário desde direcioná-lo para outra página até mesmo exibir uma mensagem... imprimir um javascript que execute outro comando ..... qualquer coisa..
Agradeço a paciência de todos que se dispuseram a ler e responder esse tópico. ta ai o exemplo caso alguém caia na mesma dúvida!
O try/catch só funciona para exceções, e como a própria mensagem já diz, isso não é uma exceção, e sim um erro ("Fatal error").
No seu caso, a variável $result deveria ser um objeto, mas quando dá erro ela é outro valor, provavelmente false. O que você deve fazer é verificar a variável $result ANTES de tentar usar o fetch_row:
try{
if(empty($result)){