Newsgroup: it.comp.www.php
Titolo: query

Ho la necessità di far selezionare all'utente alcuni atti in base a:
- Organo deliberante
- Settore
- Numero
- Oggetto
Se l'utente sceglie solamente (ad esempio) Settore... la query visualizza 
tutti gli atti emanati da quel settore (senza tenere conto degli altri campi 
di ricerca)
Se sceglie SETTORE e NUMERO selezionerà soltanto tenendo conto di questi 
campi senza considerare gli altri.
Di fretta ho buttato giù il seguente codice vedendo il quale Ficarra e 
Picone esclamerebbero "Cos'è questa porcata?"
Avete un'idea per rendere più gradevole questo codice?
if($_POST[numero]=="") $_POST[numero]="000";
if($_POST[oggetto]!="")
 {
 $query = "SELECT * FROM atti WHERE oggetto LIKE '%" . $_POST[oggetto] . "%' 
ORDER BY numero ASC";
 }
else
 {
 if($_POST[numero]=="000")
  {
  if(($_POST[settore]!="00") and ($_POST[organo]=="00"))
   {
   $query = "SELECT * FROM atti WHERE settore = '" . $_POST[settore] . "' 
ORDER BY numero ASC";
   }
  if(($_POST[settore]=="00") and ($_POST[organo]!="00"))
   {
   $query = "SELECT * FROM atti WHERE organo = '" . $_POST[organo] . "' 
ORDER BY numero ASC";
   }
  if(($_POST[settore]!="00") and ($_POST[organo]!="00"))
   {
   $query = "SELECT * FROM atti WHERE organo = '" . $_POST[organo] . "' AND 
settore= '" . $_POST[settore] . "' ORDER BY numero ASC";
   }
  }
 else
  {
  if(($_POST[settore]=="00") and ($_POST[organo]=="00"))
   {
   $query = "SELECT * FROM atti WHERE numero= '" . $_POST[numero] . "' ORDER 
BY numero ASC";
   }
  else
   {
   if(($_POST[settore]!="00") and ($_POST[organo]=="00"))
    {
    $query = "SELECT * FROM atti WHERE settore = '" . $_POST[settore] . "' 
AND numero= '" . $_POST[numero] . "' ORDER BY numero ASC";
    }
   if(($_POST[settore]=="00") and ($_POST[organo]!="00"))
    {
    $query = "SELECT * FROM atti WHERE organo = '" . $_POST[organo] . "' AND 
numero= '" . $_POST[numero] . "' ORDER BY numero ASC";
    }
   if(($_POST[settore]!="00") and ($_POST[organo]!="00"))
    {
    $query = "SELECT * FROM atti WHERE organo = '" . $_POST[organo] . "' AND 
settore= '" . $_POST[settore] . "' AND numero= '" . $_POST[numero] . "' 
ORDER BY numero ASC";
    }
   }
  }
 }

 Avete un'idea per rendere più gradevole questo codice?
[..]
se ho capito bene..
non testato e decisamente migliorabile.. ma a titolo di esempio puo'
andare..
$fieldsNullValues = array('organo' => '00', 'settore' => '00', 'numero'
=> '000', 'oggetto' => '00');
$query = "SELECT * FROM table WHERE 1";
while (list($field, $nullValue) = each($fieldsNullValues)) {
  if (!isset($_POST[$field]) || $_POST[$field] == $nullValue) continue;
  $value = mysql_real_escape_string($_POST[$field]);
  $query .= " AND '$field' = '$value'";
}
$query .= " ORDER BY numero ASC";
echo $query;
-- 
www.iuz-lab.info
 - 
www.php-faq.org

 echo $query;
---------------
A quanto ho visto, questo codice fa una selezione di TUTTE le condizioni.
Io, invece, non voglio testare TUTTE le condizioni. Devo poter scegliere, ad 
esempio, soltanto ORGANO = "DIR" ed avere l'elenco di tutti gli atti che 
hanno "DIR" come organo.
Naturalmente, se riempio tutti i campi di ricerca, devo poter selezionare, 
ad esempio, organo="DIR" and numero = "100"
Ciao e grazie 

Salvatore Paci wrote:

no quel codice coglieva anche i valori "nulli".. avevo letto velocemente il
tuo codice e mi pareva di aver capito che se il valore passato e' "00"
allora non va incluso nella ricerca..
di fatto se a quel codice passi valori tramite post del tipo:
organo "03"
settore "00"
numero "001"
oggetto "00"
la query generata sara' qualcosa del tipo.. SELECT * FROM table WHERE 1 AND
organo = 03 AND numero = 001.. senza settore e oggetto..
ma come ti ho detto era solo un esempio..
se lo rielabori un minimo lo puoi utilizzare efficacemente.. 
-- 
www.iuz-lab.info
 - 
www.php-faq.org

 se lo rielabori un minimo lo puoi utilizzare efficacemente..
---
Grazie 1.000
Ho risolto costruendomi una stringa:
if($_POST[oggetto]!="")
 {
 $stringa[]= "oggetto LIKE '%$_POST[oggetto]%'";
 $numero_campi++;
 }
if($_POST[numero]!="000")
 {
 $stringa[]= "numero =$_POST[numero]";
 $numero_campi++;
 }
if($_POST[settore]!="00")
 {
 $stringa[]= "settore =$_POST[settore]";
 $numero_campi++;
 }
if($_POST[organo]!="00")
 {
 $stringa[]= "organo =\"$_POST[organo]\"";
 $numero_campi++;
 }
for($x=0;$x<$numero_campi;$x++)
 {
 if($x>0)
  {
  $stringa_query.= " AND " . $stringa[$x];
  }
 else
  {
  $stringa_query.= $stringa[$x];
  }
 }
$query = "SELECT * FROM atti WHERE " . $stringa_query . " ORDER BY numero 
ASC";