Jump to content
XBUZZY

pesquisa avançada (SQL/PHP)

Recommended Posts

XBUZZY

Viva,

preciso fazer uma pesquisa avançada para um portal que estou a desenvolver, o problema e que a pesquisa que quero fazer engloba 4 campos onde eu posso preenche-los todos ou apenas alguns, aí se encontra a minha dificuldade..

Agradeço desde já

deixo aqui o código onde mostra a pesquisa correcta se preencher todos os dados

SELECT contracto_pt . * , gestores.nome_g, agentes.nome_p FROM contracto_pt, gestores, agentes WHERE contracto_pt.data_cpt BETWEEN '2011-05-13' AND '2011-05-18' AND contracto_pt.estado_cpt like pendente AND  (agentes.nome_p like 'NomeAgente' ) AND  (contracto_pt.tipo_servico_cpt like 'Meo Satélite' ) AND  (contracto_pt.sfidd_cpt = agentes.sfidd_p )  AND  (agentes.gestor_p = gestores.id_g)

Share this post


Link to post
Share on other sites
mAiN_iNfEcTiOn

Se queres obter resultados com pelo menos um dos critérios preenchidos, deves alterar o concatenador de condições para OR em vez de AND.

Share this post


Link to post
Share on other sites
XBUZZY

mas se for OR basta 1 condição ser verdadeira que já não testa as outras..

por exemplo eu quero ver todos os contractos do serviço X de 10 de Abril a 15 de maio, com OR já não testa a condição da data

Share this post


Link to post
Share on other sites
filiperainho

Faz varias condições sql e com "if" verificas qual é a que vais usar.


Programador - C# ; C ; PHP ; JavaScript ; CSS ; HTML ; iniciante em Android.

Share this post


Link to post
Share on other sites
XBUZZY

eu tenho 2 paginas 1º com um form onde envia os dados dos campos e a 2º onde recebe "GET"

com IF's na teoria ficaria assim:

if campo 1 verdadeiro

SQL consulta1

IF campo 2 verdadeiro

SQL consulta1+campo2

.

.

.

É mais ou menos assim que se refere?

Share this post


Link to post
Share on other sites
filiperainho

por exemplo:

se só forem as datas uma condição, se só for o nome outra, se for o nome e o cliente outra.

tens de ir vendo com if quais são as cenas que não são vazias.

Ou então se forem vazias podes atribuir valores por defeito se as datas forem vazias metes a data actual + 10 anos e a data actual - 10 anos para obteres a data final e a inicial e a strings podes tratar da seguinte maneira:contracto_pt.tipo_servico_cpt like '%$nome%'.


Programador - C# ; C ; PHP ; JavaScript ; CSS ; HTML ; iniciante em Android.

Share this post


Link to post
Share on other sites
mAiN_iNfEcTiOn

SELECT 
    contracto_pt . * , gestores.nome_g, agentes.nome_p 

FROM
    contracto_pt, gestores, agentes

WHERE
    /* PRIMEIRO O NECESSÁRIO */
    (contracto_pt.sfidd_cpt = agentes.sfidd_p )  AND
    (agentes.gestor_p = gestores.id_g) AND
    (
        /* AGORA O OPCIONAL */
        ( 
            (contracto_pt.data_cpt BETWEEN '2011-05-13' AND '2011-05-18') AND
            (contracto_pt.tipo_servico_cpt like 'Meo Satélite' )  
        ) OR
        (agentes.nome_p like 'NomeAgente' ) OR  
        (contracto_pt.estado_cpt like pendente)
    )

Já agora... cuidado que pendente é entendido como um campo e não como string... para ser como string tem que ser:

        (contracto_pt.estado_cpt like 'pendente')

Share this post


Link to post
Share on other sites
XBUZZY

SELECT 
    contracto_pt . * , gestores.nome_g, agentes.nome_p 

FROM
    contracto_pt, gestores, agentes

WHERE
    /* PRIMEIRO O NECESSÁRIO */
    (contracto_pt.sfidd_cpt = agentes.sfidd_p )  AND
    (agentes.gestor_p = gestores.id_g) AND

    /* AGORA O OPCIONAL */
    ( 
        (contracto_pt.data_cpt BETWEEN '2011-05-13' AND '2011-05-18') AND
        (contracto_pt.tipo_servico_cpt like 'Meo Satélite' )  
    ) OR
    (agentes.nome_p like 'NomeAgente' ) OR  
    (contracto_pt.estado_cpt like pendente)

Já agora... cuidado que pendente é entendido como um campo e não como string... para ser como string tem que ser:

        (contracto_pt.estado_cpt like 'pendente')

Com este codigo ao fazer a consulta mostra-me 3mil resultados onde so deveria mostrar 1, isto com todos os campos preenchidos

Share this post


Link to post
Share on other sites
mAiN_iNfEcTiOn

Ok... vamos por partes... O conceito de pesquisa é esse... Se colocas vários dados no google, ele procura por cada um deles aparecendo os mais relevantes em cima (claro que neste caso nao aparecem os mais relevantes em cima).

O que tu queres é construção de uma query em modo condicional... Algo do género:


$query = "SELECT * FROM tabela WHERE 1=1";

if( count($_POST)>0 )
{
    if( !empty($_POST['campo1']) )
        $query .= " AND campo1 = '" . @mysql_real_escape_string($_POST['campo1']) . "'";

    if( !empty($_POST['campo2']) )
        $query .= " AND campo2 = '" . @mysql_real_escape_string($_POST['campo2']) . "'";

    if( !empty($_POST['campo3']) )
        $query .= " AND campo3 = '" . @mysql_real_escape_string($_POST['campo3']) . "'";
}

(Etc).

Share this post


Link to post
Share on other sites
XBUZZY

eu em php ainda sou um newbie, faço tudo mas é atravez das ferramentas do dreamweaver (server behaviors)

percebo o minimo de codigo :)

se pudessem explicar "como se fosse muito burro"

Share this post


Link to post
Share on other sites
mAiN_iNfEcTiOn

Olá XBUZZY...

Compreendo que estejas a começar na área do desenvolvimento web... Mas eu aconselho-te então a aprenderes PHP antes de começares. Os server-behaviors do DreamWeaver (DW) são muito maus de 'manter' em termos de código, pois quando quiseres adicionar/expandir as capacidades do teu código não vais perceber porque é código gerado pelo DW.

:) É que o código que aí vês é bastante simples... Usa coisas básicas do PHP que deves saber para poderes desenvolver correctamente.

Share this post


Link to post
Share on other sites
ruimcosta

Desde sempre preferi ter eu o trabalho de fazer e absorver o conhecimento gerado pela experiência.

Abomino desde o 1º instante wizards, server behaviors e afins.

Aprendam a lógica e depois tudo se tornará mais fácil!


Abraços e beijinhos,Rui Costa

Share this post


Link to post
Share on other sites
XBUZZY

eu até compreendo a lógica

já tive algoritmia

mas não domino a linguagem, PHP

Se me pudessem ajudar com essa pesquisa ficaria grato..

Cumprimentos

Share this post


Link to post
Share on other sites
Lfscoutinho

Boas,

Então se compreendes a lógica, mas não sabes a sintaxe, faz o "código" da lógica, depois procura no manual do PHP a sintaxe correspondente.

Por exemplo:

para i = 0; i < 11; i = i + 1; fazer {

    mostrar 2 * i;

}

No manual procuras pelo for, operadores, incrementadores e como imprimir texto:

for( $i = 0; $i < 11; $++ ) {

    echo $i;

}

Share this post


Link to post
Share on other sites
XBUZZY

E vou aprendendo.. mas neste momento o tempo é escasso e precisava mesmo de essa consulta.

Mas agradeço desde já toda a ajuda e preocupação

Obrigado :)

Share this post


Link to post
Share on other sites
XBUZZY

tive a repara no código que o dreamweaver gerou e fiz umas alterações para mostrar um resultado mesmo que os campos estejam vazios

quando declaro as variáveis adicionei isto

if ($colname3_Rs1 <> "-xxxxxyyyyyyyxxxxxx-")

  { $colname3_Rs1 = "1";

  }

isto para os vários campos da pesquisa

depois na $query fiz assim

$query_Rs1 = sprintf("SELECT contracto_pt . * , gestores.nome_g, agentes.nome_p FROM contracto_pt, gestores, agentes WHERE (contracto_pt.data_cpt BETWEEN %s AND %s ) AND (contracto_pt.estado_cpt like %s OR $colname5_Rs1 = '1') AND  (agentes.nome_p like %s OR $colname4_Rs1 = '1') AND  (contracto_pt.tipo_servico_cpt like %s OR $colname3_Rs1 = '1' ) AND  (contracto_pt.sfidd_cpt = agentes.sfidd_p )  AND  (agentes.gestor_p = gestores.id_g)", GetSQLValueString($colname_Rs1, "date"),GetSQLValueString($colname2_Rs1, "date"),GetSQLValueString("%" . $colname5_Rs1 . "%", "text"),GetSQLValueString("%" . $colname4_Rs1 . "%", "text"),GetSQLValueString("%" . $colname3_Rs1 . "%", "text"));

// ainda nao fiz para a data //

e agora da devolve resultado mesmo sem ter todos os campos preenchidos.. as questão é que eu o servidor não testa a 1ºcondiçao sempre em 1º lugar.. sendo assim talvez este método seja inútil

Share this post


Link to post
Share on other sites
mAiN_iNfEcTiOn

$query_Rs1 = sprintf("
SELECT contracto_pt.* , gestores.nome_g, agentes.nome_p
FROM contracto_pt, gestores, agentes
WHERE 
(contracto_pt.data_cpt BETWEEN %s AND %s ) AND 
(contracto_pt.estado_cpt like %s OR $colname5_Rs1 = '1') AND 
(agentes.nome_p like %s OR $colname4_Rs1 = '1') AND
(contracto_pt.tipo_servico_cpt like %s OR $colname3_Rs1 = '1' ) AND
(contracto_pt.sfidd_cpt = agentes.sfidd_p )  AND
(agentes.gestor_p = gestores.id_g)
", GetSQLValueString($colname_Rs1, "date"),GetSQLValueString($colname2_Rs1, "date"),GetSQLValueString("%" . $colname5_Rs1 . "%", "text"),GetSQLValueString("%" . $colname4_Rs1 . "%", "text"),GetSQLValueString("%" . $colname3_Rs1 . "%", "text"));

=/ Sinceramente, não percebo... eu actualizei a query... se mesmo assim não é o que pretendes... não te adianta usar o sprintf...

Como eu já disse, tens que ir criando a cláusula where de acordo com os campos que preencheres... Estás a complicar desnecessariamente.

Share this post


Link to post
Share on other sites
XBUZZY

com o codigo que pus o objectivo era se o campo nao ta prenchido fica com a valor de "1" e dps na condiçao era where campo = 'nome' or 1

vai dar sempre valor se for 1 mostra todos os dados.. para aquela condiçao essa era em que pensei

o sprintf foi o dreamweaver que criou..

agora com o codigo que me deste dá o seguinte erro:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE (contracto_pt.sfidd_cpt = agentes.sfidd_p ) AND (agentes.gestor' at line 6

O codigo PHP fica aqui tbm

<?php
if (!function_exists("GetSQLValueString")) {
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") 
{
  if (PHP_VERSION < 6) {
    $theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;
  }

  $theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);

  switch ($theType) {
    case "text":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;    
    case "long":
    case "int":
      $theValue = ($theValue != "") ? intval($theValue) : "NULL";
      break;
    case "double":
      $theValue = ($theValue != "") ? doubleval($theValue) : "NULL";
      break;
    case "date":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;
    case "defined":
      $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
      break;
  }
  return $theValue;
}
}

$currentPage = $_SERVER["PHP_SELF"];

$editFormAction = $_SERVER['PHP_SELF'];
if (isset($_SERVER['QUERY_STRING'])) {
  $editFormAction .= "?" . htmlentities($_SERVER['QUERY_STRING']);
}

$maxRows_Rs1 = 1;
$pageNum_Rs1 = 0;
if (isset($_GET['pageNum_Rs1'])) {
  $pageNum_Rs1 = $_GET['pageNum_Rs1'];
}
$startRow_Rs1 = $pageNum_Rs1 * $maxRows_Rs1;

$colname_Rs1 = "1";
if (isset($_GET['date1'])) {
  $colname_Rs1 = $_GET['date1'];
}
if ($colname_Rs1 <> "-xxxxxyyyyyyyxxxxxx-")
  { $colname_Rs1 = "1";
  }
  
$colname2_Rs1 = "1";
if (isset($_GET['date2'])) {
  $colname2_Rs1 = $_GET['date2'];
}
if ($colname2_Rs1 <> "-xxxxxyyyyyyyxxxxxx-")
  { $colname2_Rs1 = "1";
  }
$colname3_Rs1 = "1";
if (isset($_GET['tiposervico2'])) {
  $colname3_Rs1 = $_GET['tiposervico2'];
  }

if ($colname3_Rs1 <> "-xxxxxyyyyyyyxxxxxx-")
  { $colname3_Rs1 = "1";
  }

$colname4_Rs1 = "1";
if (isset($_GET['agentefld'])) {
  $colname4_Rs1 = $_GET['agentefld'];
}
if ($colname4_Rs1 <> "-xxxxxyyyyyyyxxxxxx-")
  { $colname4_Rs1 = "1";
  }
  
$colname5_Rs1 = "1";
if (isset($_GET['estadofld'])) {
  $colname5_Rs1 = $_GET['estadofld'];
  }
if ($colname5_Rs1 <> "-xxxxxyyyyyyyxxxxxx-")
  { $colname5_Rs1 = "1";
  }

mysql_select_db($database_conn, $conn);
$query_Rs1 = ("SELECT contracto_pt. * , gestores.nome_g, agentes.nome_p

FROM
    contracto_pt, gestores, agentes, 

WHERE
    (contracto_pt.sfidd_cpt = agentes.sfidd_p )  AND
    (agentes.gestor_p = gestores.id_g) AND
    (
        (
            (contracto_pt.data_cpt BETWEEN %s AND %s) AND
            (contracto_pt.tipo_servico_cpt LIKE %s )  
        ) OR
        (agentes.nome_p LIKE %s ) OR  
        (contracto_pt.estado_cpt LIKE %s)"); 
$query_limit_Rs1 = sprintf("%s LIMIT %d, %d", $query_Rs1, $startRow_Rs1, $maxRows_Rs1);
$Rs1 = mysql_query($query_limit_Rs1, $conn) or die(mysql_error());
$row_Rs1 = mysql_fetch_assoc($Rs1);

if (isset($_GET['totalRows_Rs1'])) {
  $totalRows_Rs1 = $_GET['totalRows_Rs1'];
} else {
  $all_Rs1 = mysql_query($query_Rs1);
  $totalRows_Rs1 = mysql_num_rows($all_Rs1);
}
$totalPages_Rs1 = ceil($totalRows_Rs1/$maxRows_Rs1)-1;

$queryString_Rs1 = "";
if (!empty($_SERVER['QUERY_STRING'])) {
  $params = explode("&", $_SERVER['QUERY_STRING']);
  $newParams = array();
  foreach ($params as $param) {
    if (stristr($param, "pageNum_Rs1") == false && 
        stristr($param, "totalRows_Rs1") == false) {
      array_push($newParams, $param);
    }
  }
  if (count($newParams) != 0) {
    $queryString_Rs1 = "&" . htmlentities(implode("&", $newParams));
  }
}
$queryString_Rs1 = sprintf("&totalRows_Rs1=%d%s", $totalRows_Rs1, $queryString_Rs1);
?>

Share this post


Link to post
Share on other sites
mAiN_iNfEcTiOn

Meu amigo...

Convém saber COPIAR E COLAR....

... não sei onde é que vês uma vírgula a mais aqui:

FROM
    contracto_pt, gestores, agentes

No entanto, tu tens, olha (copiado e colado hum?):

FROM
    contracto_pt, gestores, agentes, 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.