Jump to content
Fórum Script Brasil
  • 0

Consulta personalizada com php


LillyC

Question

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 to comment
Share on other sites

5 answers to this question

Recommended Posts

  • 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...