Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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?
>
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
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 )
>
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?
Só observe que null e '' são duas coisas diferentes...
Comece debugando da forma certa:
http://php.net/manual/pt_BR/pdo.errorinfo.php
Isso vai te dizer qual o real problema na query.