Ir para conteúdo

POWERED BY:

Arquivado

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

DougCoder

PDO Fatal error: Call to a member function fetch() on boolean

Recommended Posts

Boa noite a todos,

 

Passei o projeto para PDO e está tudo aparentemente bem, porém o que antes era uma simples busca de 1 dado em cada select, agora se tornou vários dados em um select (limitei ele em maxOptions = 5), ok, até ai tudo bem, me virei aqui para fazer isso virar um array de dados. Atualmente o cenário é o seguinte:

 

Tenho estas variáveis que recebem um array, se eu der um echo em cada uma delas e preencher o meu select option com 2 ou mais dados, ela me retorna (2,5) ou (2,x,x,x números que eu quiser), ou até mesmo apenas um número. Ótimo, em tese está funcionando.

$tema = join(',',(array)$id_tema);
$autor = join(',',(array)$id_autor);
$chave = join(',',(array)$id_palchave);
$disciplina = join(',',(array)$id_disciplina);

Ai eu tenho um pequeno select que faz a magia da busca múltipla, neste select tenho algumas function de BD que concatena:

$sqlbusca = $conn->query("SELECT DISTINCT ARQ_ID,ARQ_NOME,conc_busca_autores(ARQ_ID) as AUT_NOME,         
            conc_busca_temas(ARQ_ID) as TEM_NOME,EDI_NOME, conc_busca_disciplina(ARQ_ID) as DIS_NOME,conc_busca_palchave(ARQ_ID) as PAL_CHA_NOME,
            TIP_ARQ_NOME,ARQ_CAM_ARQ FROM `arquivos` a
                            
                            INNER JOIN arquivos_has_disciplinas b ON a.ARQ_ID = b.Arquivos_ARQ_ID
                            INNER JOIN disciplinas dis ON b.Disciplinas_DIS_ID = dis.DIS_ID
                           
                            INNER JOIN arquivos_has_temas c ON a.ARQ_ID = c.Arquivos_ARQ_ID
                            INNER JOIN temas tem ON c.Temas_TEM_ID = tem.TEM_ID
                            
                            INNER JOIN autores_has_arquivos d ON a.ARQ_ID = d.Arquivos_ARQ_ID
                            INNER JOIN autores aut ON d.Autores_AUT_ID = aut.AUT_ID
                            
                            INNER JOIN palavraschave_has_arquivos e ON a.ARQ_ID = e.Arquivos_ARQ_ID
                            INNER JOIN palavraschave pal ON e.PalavrasChave_PAL_CHA_ID = pal.PAL_CHA_ID
                            
                            INNER JOIN editoras edi ON edi.EDI_ID = a.Editoras_idEditoras
                            INNER JOIN tipoarquivo tip ON tip.TIP_ARQ_ID = a.TipoArquivo_idTipoArquivo
                            
                            where ( a.ARQ_NOME LIKE '$txtnomearquivo%' or '$txtnomearquivo' LIKE '' )
                            and ( a.editoras_ideditoras = $id_editora or $id_editora = 0 )
                            and ( a.TipoArquivo_idTipoArquivo = $id_ta or $id_ta = 0 )
                            and ( b.Disciplinas_DIS_ID in ($disciplina) or ($disciplina) = 0 )
                            and ( c.Temas_TEM_ID in($tema) or ($tema) = 0 )
                            and ( d.Autores_AUT_ID in ($autor) or ($autor) = 0 )
                            and ( e.PalavrasChave_PAL_CHA_ID in ($chave) or ($chave) = 0 )");
while ($linha = $sqlbusca->fetch(PDO::FETCH_ASSOC)) {  ?> 

//aqui vem a tabela, etc. 

Eis a questão:

 

Se eu selecionar apenas 1 dado de apenas 1 select option ou de vários select options ou até mesmo parte do nome do arquivo(iniciais), ele me retorna perfeito, nada a fazer. O erro acontece no momento em que eu seleciono por exemplo, duas disciplinas, ou dois autores e coloco para busca. Coloquei um var_dump($sqlbusca).

 

retorno do var_dump => bool(false)
Fatal error: Call to a member function fetch() on boolean in C:\xampp\htdocs\ ...

 

" "SOLUÇÃO" " entre aspas [bug]

Se eu modificar (remover or ($disciplina) = 0)

and ( b.Disciplinas_DIS_ID in ($disciplina) or ($disciplina) = 0 )

Para

and ( b.Disciplinas_DIS_ID in ($disciplina) ) 

o var_dump mostra todo o sql e na onde eu coloco dois dados fica assim: and ( b.Disciplinas_DIS_ID in (2,4) )

 

Apenas fazendo esta alteração, eu consigo fazer a busca de 2 disciplinas ou mais na minha busca e funciona 100%. PORÉM O RESTO... Buga tudo, não consigo pesquisar nada a não ser apenas a disciplina. Já editei todos os outros para ficar igual disciplina e nada, já substitui o in por LIKE, já alterei o = 0 por LIKE '' e nada também.

 

Alguma luz no fim do túnel?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Comece debugando da forma certa:

http://php.net/manual/pt_BR/pdo.errorinfo.php

 

Isso vai te dizer qual o real problema na query.

Opa,

 

Meu primeiro contato com o PDO. Acho que implementei a função de forma correta, precisei adicionar cláusulas de error do PDO em um manual que pesquisei, retornou isso aqui:

 

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[21000]: Cardinality violation: 1241 Operand should contain 2 column(s)' in C:\xampp\htdocs\...\main_p.php:505 Stack trace: #0 C:\xampp\htdocs\...\main_p.php(505): PDO->query('SELECT DISTINCT...') #1 {main} thrown in C:\xampp\htdocs\...\main_p.php on line 505

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aparentemente o erro que você passou é outro, contudo se o conjunto que você está passando é uma string, use ' '...

and ( b.Disciplinas_DIS_ID in ($disciplina) or '$disciplina' = 0 )

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Aparentemente o erro que você passou é outro, contudo se o conjunto que você está passando é uma string, use ' '...

and ( b.Disciplinas_DIS_ID in ($disciplina) or '$disciplina' = 0 )

 

Cara... você ta de brincadeira só pode.

Eu juro que eu fiz isso e não deu certo. Mas se não me engano eu fiz isso em 2 campos e realmente é o certo com ' ' igual eu fiz na primeira linha em:

a.ARQ_NOME LIKE '$txtnomearquivo%' or '$txtnomearquivo' LIKE ''

E por incrível que pareça.... coloquei '$variavel' em todos depois de or e... funcionou cara! Ô Vida... Menos mal hehe, muito obrigado por atentar no meu deslize vergonhoso.

 

Outro detalhe que está errado, meu: or '$disciplina' = 0 na verdade deveria ser is null ou LIKE ' ' ou LIKE '%'

 

PORQUE:

O padrão de busca (geralmente) é quando não se tem nenhum campo preenchido ele trazer todos os dados como retorno e com = 0 ele não retorna nenhum. Sem falar que como o conjunto é uma string... não faz sentido o uso do = 0. Concorda?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só observe que null e '' são duas coisas diferentes...

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por First
      Olá a todos!
       
      Eu estou criando um sistema do zero mas estou encontnrando algumas dificuldades e não estou sabendo resolver, então vim recorrer ajuda de vocês.
      Aqui está todo o meu código: https://github.com/PauloJagata/aprendizado/
       
      Eu fiz um sistema de rotas mas só mostra o conteúdo da '/' não sei porque, quando eu tento acessar o register nada muda.
      E eu também quero que se não estiver liberado na rota mostra o erro de 404, mas quando eu tento acessar um link inválido, nada acontece.
      Alguém pode me ajudar com isso? E se tiver algumas sugestão para melhoria do código também estou aceitando.
       
       
      Desde já, obrigado.
    • Por ILR master
      Boa tarde, pessoal.
      Espero que todos estejam bem.
       
      Seguinte:
      Tenho a seguinte consulta:
       
      $usuarios= "SELECT * FROM usuarios";
      $query= mysqli_query($conexao, $usuarios) or die ("Usuário não encontrado");
      $usuario = mysqli_fetch_array($query);
       
      Quero pegar apenas o campo 'nome' da tabela 'usuarios' e colocar todos os resultados da seguinte forma:
       
      $nomes = array("Rafael", "João", "Maria", "Pedro", "Patricia", "Camila");
       
      Agradeço desde já.
      Abs
       
       
    • Por mateus.andriollo
      Existe uma forma de fazer um IF na select e comparar com Array de dados?
       
      algo como
       
      Select if( in_array(idCliente,'1,2,3,4,5')=true,'Tem','Não') ) as cliente Não consigo usar inner ou where pois esse array é algo q tem varias regras...
       
      Precisava saber se existe uma função assim em MySQL
    • Por mateus.andriollo
      Existe uma forma de fazer um IF na select e comparar com Array de dados?
       
      algo como
       
      Select if( in_array(idCliente,'1,2,3,4,5')=true,'Tem','Não') ) as cliente Não consigo usar inner ou where pois esse resultado do array é algo q tem varias regras...
       
      Precisava saber se existe uma função assim em MySQL
    • Por clovis.sardinha
      Bom dia.
      Meu problema é o seguinte:
      Estou fazendo uma tabela e preciso mostrar o usuário e várias cidades que pertencem a este usuário.
      O resultado do array é o seguinte:

      Quando passo para a tabela os valores de cidade se repetem para o mesmo usuário até o final e retorna fazendo o mesmo para o próximo usuário. 
      Veja abaixo

       
      Meu código para a tabela é a seguinte:
      <tr> <td align="left"><?php echo $usuario['nome'] ?></td> <td align="left"><?php echo $usuario['nome_orgao'] ?></td> <td align="left"><?php echo $usuario['nome_funcao'] ?></td> <?php foreach($destinos as $key=>$destino):?> <?php $key=0;?> <td align="left"> <?php foreach($destino as $chave=> &$cidade): ?> <?php echo $cidade['cid_nome']."-";?> <?php endforeach;?> </td> <?php $key+=$key; ?> <?php endforeach;?> <td><?php echo date('d/m/Y', strtotime( $usuario['created_at'])) ?></td> <td align="left"><a href="<?php echo base_url('UserAdmin/Usuario/getUsuarioById')."/".$usuario['id_user'] ?>">DETALHES</a></td> </tr> <?php endforeach ?> Onde estou errando? O que tenho de fazer para percorrer este array de modo a aparecer apenas as cidades pertencentes a cada usuário?

×

Informação importante

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