Ir para conteúdo
Fórum Script Brasil
  • 0

Consulta personalizada com php


LillyC

Pergunta

Oi,

estou iniciando na área, já fiz cursos, e agora estou tentando me aprofundar, além de ler muita coisa, pego alguns scripts para ver na prática o funcionamento das coisas... vamos ao problema..

Tenho os códigos abaixo, um formulário html (carro_psq.html) que passa as informações para tratar no php (carros_psq.php).

Comecei montando com uma pesquisa relacional, e funcionou certinho... agora quando eu simplifiquei, ele não reconhece os filtros... se não insiro nenhum filtro de pesquisa, ele retorna todos os dados do banco de dados, mas com qualquer filtro dá o seguinte erro:

SQLSTATE[42000]: Syntax error or access violation: 1064 Você tem um erro de sintaxe no seu SQL próximo a 'AND sexo ='M'' na linha 2

sendo que varia, as vezes ele fala que é na linha de cima, depois na linha de baixo.. enfim, agora os códigos:

Formulário de pesquisa personalizada

<form method="POST" action="carros_psq.php"><!-- action="nome do arquivo php que recebe" -->
            <p>Relatório de clientes</p>
            <p>Nome: </p> <input type="text" name="clientes">
            <p>Sexo: </p>
                        <select name="sexo">
                            <option value=""></option>
                            <option value="M">Masculino</option>
                            <option value="F">Feminino</option>
                        </select>
            <p>Pessoa Física/Jurídica: </p>
            <select name="pf_pj">
                <option value=""></option>
                <option value="PF">Pessoa Física</option>
                <option value="PJ">Pessoa Jurídica</option>
            </select>
             <input type="submit" value="Enviar"\>
        </form>
Aquivo para tratar os dados
<?php
try 
{ 
//... conexão do bdd...

    // cria um estilo para o cabeçalho
    $estilo_cabecalho = new TStyle('cabecalho'); 
    $estilo_cabecalho->font_family     = 'verdana,sans-serif'; 
    
    // cria um estilo para os dados
    $estilo_dados = new TStyle('dados'); 
    $estilo_dados->font_family     = 'arial,verdana,sans-serif'; 
    
    // define a consulta
    $sql = "SELECT id, nome, endereco, bairro, cep, pf_pj, cpf_cnpj, cnh, rg_ie, dt_nascimento, telefone, celular, obs, email FROM clientes";
    
    // detecta filtro por nome do clientes
    if (!empty($_REQUEST['clientes']))
    {
        $client = addslashes($_REQUEST['clientes']);
        $sql .= " AND nome like '%{$client}%'";
    }
    // detecta filtro por sexo
    if (!empty($_REQUEST['sexo']))
    {
        $sexo = addslashes($_REQUEST['sexo']);
        $sql .= " AND sexo ='{$sexo}'";
    }
    // detecta filtro por pf_pj
    if (!empty($_REQUEST['pf_pj']))
    {
        $pf_pj = addslashes($_REQUEST['pf_pj']);
        $sql .= " AND pf_pj ='{$pf_pj}'";
    }
    
     
    // executa a instrução SQL 
    $result = $conn->query($sql);
    
    // instancia objeto tabela 
    $tabela = new TTable; 
    
    // define algumas propriedades da tabela
    $tabela->border= 1;
    $tabela->style = "border-collapse:collapse";
    
    // instancia uma linha para o cabeçalho 
    $cabecalho = $tabela->addRow();
    
    // adiciona células (se add lá em cima, insere aqui)
    $cabecalho->addCell('Código'); 
    $cabecalho->addCell('Nome'); 
    $cabecalho->addCell('Endereço'); 
    $cabecalho->addCell('Bairro'); 
    $cabecalho->addCell('CEP');     
    $cabecalho->addCell('Física/Jurídica');
    $cabecalho->addCell('CPF/CNPJ');
    $cabecalho->addCell('CNH');
    $cabecalho->addCell('RG/IE');
    $cabecalho->addCell('Aniversário'); 
    $cabecalho->addCell('Telefone');
    $cabecalho->addCell('Celular');
    $cabecalho->addCell('E-Mail');
    $cabecalho->addCell('Observações');

    $cabecalho->class = 'cabecalho';
    
    // inicializa variáveis de controle
    $colore = FALSE;
    
    // percorre os resultados
    foreach ($result as $row)
    {
        // verifica qual cor irá utilizar para o fundo 
        $bgcolor = $colore ? '#f5f5f5' : '#e8e8e8';
        
        // adiciona uma linha para os dados 
        $linha = $tabela->addRow(); 
        $linha->bgcolor = $bgcolor;
        $linha->class = 'dados';
        
        // lê a data de nascimento
        $dt_nascimento = date_parse($row['dt_nascimento']);
        $dt_nascimento = str_pad($dt_nascimento['day'], 2, '0', STR_PAD_LEFT).'/'.
         str_pad($dt_nascimento['month'], 2, '0', STR_PAD_LEFT).'/'.
         $dt_nascimento['year'];
                         
        // adiciona as células
        $cell1 = $linha->addCell($row['id']);
        $cell2 = $linha->addCell($row['nome']);
        $cell3 = $linha->addCell($row['endereco']);
        $cell4 = $linha->addCell($row['bairro']);
        $cell5 = $linha->addCell($row['cep']);
        $cell6 = $linha->addCell($row['pf_pj']);
    $cell7 = $linha->addCell($row['cpf_cnpj']);
    $cell8 = $linha->addCell($row['cnh']);
    $cell9 = $linha->addCell($row['rg_ie']);
        $cell10 = $linha->addCell($dt_nascimento);
        $cell11 = $linha->addCell($row['telefone']);
        $cell12 = $linha->addCell($row['celular']);
        $cell13 = $linha->addCell($row['email']);
        $cell14 = $linha->addCell($row['obs']);
        
        // define o alinhamento das células
        $cell1->align = 'center';
        $cell2->align = 'left';
        $cell3->align = 'left';
        $cell4->align = 'left';
        $cell5->align = 'center';
        $cell6->align = 'center';
        $cell7->align = 'center';
    $cell8->align = 'center';
    $cell9->align = 'center';
        $cell10->align = 'center';
        $cell11->align = 'center';
        $cell12->align = 'center';
        $cell13->align = 'center';
        $cell14->align = 'center';
        
        // inverte cor de fundo
        $colore = !$colore;
    }
    
    $tabela->show();
} 
catch (Exception $e) 
{ 
    // exibe a mensagem de erro 
    echo $e->getMessage(); 
} 
?>

To pedindo demais, mas gostaria de saber se alguém vê algum erro de sintaxe no código... pra mim não tá fazendo sentido, mas como meu conhecimento é inicial, nem conta né?!

Link para o comentário
Compartilhar em outros sites

5 respostass a esta questão

Posts Recomendados

  • 0

Oi 'LillyC',

Você esqueceu da cláusula WHERE.

O código passa da declaração FROM tabela para AND sem usar a cláusula WHERE.

Veja a sintaxe do comando SELECT no manual do mysql de sua versão.

SELECT {lista de campos} FROM {nome da tabela} [WHERE {campo} condição]

Link para o comentário
Compartilhar em outros sites

  • 0
Oi 'LillyC',

Você esqueceu da cláusula WHERE.

O código passa da declaração FROM tabela para AND sem usar a cláusula WHERE.

Veja a sintaxe do comando SELECT no manual do mysql de sua versão.

SELECT {lista de campos} FROM {nome da tabela} [WHERE {campo} condição]

Desculpa a demora, problemas de família..

Denis, o "WHERE" não é utilizado para quando requer uma condição especial? Por exemplo, se eu tenho duas tabelas relacionados pelo ID uso esse campo para fazer consulta com as duas tabelas..

Bom, enquanto a dúvida persiste continuo estudando e fazendo testes...

Vls

Link para o comentário
Compartilhar em outros sites

  • 0
Oi 'LillyC',

Você esqueceu da cláusula WHERE.

O código passa da declaração FROM tabela para AND sem usar a cláusula WHERE.

Veja a sintaxe do comando SELECT no manual do mysql de sua versão.

SELECT {lista de campos} FROM {nome da tabela} [WHERE {campo} condição]
Desculpa a demora, problemas de família.. Denis, o "WHERE" não é utilizado para quando requer uma condição especial? Por exemplo, se eu tenho duas tabelas relacionados pelo ID uso esse campo para fazer consulta com as duas tabelas.. Bom, enquanto a dúvida persiste continuo estudando e fazendo testes... Vls
Oi 'LillyC', A cláusula WHERE´deve ser utilizada como um filtro que afetará todo o SELECT. Infelizmente muitos usam o WHERE oara realizar as condições de JOIN (ligação entre duas tabelas). Eu recomendo usar a cláusula INNER JOIN ou LEFT JOIN para fazer isso. Usar a cláusula JOIN torna seu SELECT mais limpo. Mais fácil de ler. Exemplo:
SELECT Titular.Nome, Dependente.Nome 
FROM Titular, Dependente
WHERE Titular.codTitular = Dependentes.codTitular AND Titular.Nome LIKE "M%"
Exemplo 2
SELECT Titular.Nome, Dependente.Nome 
FROM Titular
INNER JOIN Dependente ON Dependentes.codTitular = Titular.codTitular
WHERE  Titular.Nome LIKE "M%"

Os dois exemplos acima produzem o mesmo resultado. (Selecionar o nome dos titulares e o nome dos dependentes de todos os titulares cujos nomes começam pela letra "M") Porém o segundo é mais fácil de entender. Imagina a confusão para entender o código do exemplo 1 se você tiver que ligar 4 ou 5 tabelas e se a cláusula WHERE tiver diversos filtros?

O exemplo 2 coloca "cada macaco em seu galho" e torna o código muito mais claro.

Link para o comentário
Compartilhar em outros sites

  • 0

Tudo bem.. entendi, para unir tabelas JOIN...

Mas para realizar um filtro na consulta, usando parâmetros dado pelo usuário é que não está funcionando...

Olha... pegando a sintaxe que você postou:

SELECT Titular.Nome, Dependente.Nome
FROM Titular
INNER JOIN Dependente ON Dependentes.codTitular = Titular.codTitular
WHERE  Titular.Nome LIKE "M%"
mas no lugar do "M%" insiro um parâmetro '%{$nome}%' No código que eu postei incialmente, realmente faltava o WHERE... mas a condição de filtro vem logo após.. e não está funcionando...
...
    // define a consulta
    $sql = "SELECT id, nome, endereco, bairro, cep, pf_pj, cpf_cnpj, cnh, rg_ie, dt_nascimento, telefone, celular, obs, email FROM clientes WHERE";
    
    // detecta filtro por nome do clientes
    if (!empty($_REQUEST['clientes']))
    {
        $client = addslashes($_REQUEST['clientes']);
        $sql .= " AND nome like '%{$client}%'";
    }

    //ordena a consulta
        $sql .= ' ORDER BY ' . $_REQUEST['ordem'];

    //executa a instrução
        $result = $conn->query($sql);
...

Talvez o problema não seja o mysql, e sim meu código php... ??

Link para o comentário
Compartilhar em outros sites

  • 0

'LillyC'

O erro de sua cl´´ausula WHERE em seu SELECT está assim:

SELECT campos FROM tabela WHERE AND...
Quando deveria estar assim:
SELECT campos FROM tabela WHERE {uma comparação}AND {outra comparação}...
Modifique para que fique assim e não haverá mais erro
...
    // define a consulta
    $sql = "SELECT id, nome, endereco, bairro, cep, pf_pj, cpf_cnpj, cnh, rg_ie, dt_nascimento, telefone, celular, obs, email FROM clientes WHERE 1=1 ";
    
    // detecta filtro por nome do clientes
    if (!empty($_REQUEST['clientes']))
    {
        $client = addslashes($_REQUEST['clientes']);
        $sql .= " AND nome like '%{$client}%'";
    }

    //ordena a consulta
        $sql .= ' ORDER BY ' . $_REQUEST['ordem'];

    //executa a instrução
        $result = $conn->query($sql);
...

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      652k
×
×
  • Criar Novo...