[PHP][MYSQL] Ricerca avanzata tramite form

Emix

Utente Attivo
15 Feb 2010
594
0
16
Buongiorno a tutti,
ho un problema che non riesco a risolvere, ma probabilmente è una questione di logica.

Io ho un form in cui posso scegliere tra due checkbox, inserire una data inizio e una fine, selezionare da un elenco una stazione.
La pagina dopo dovrebbe fare una SELECT e mostrare a video i risultati in base a cosa ha selezionato l'utente nella pagina prima, come una comunissima ricerca avanzata... Il form è questo:

HTML:
<form action="search_validate.php" method="post">
Data inizio <input type="date" name="datain" value="" placeholder="AAAA-MM-DD" /><br />
Data fine <input type="date" name="dateout" value="" placeholder="AAAA-MM-DD" /><br />SCP:<BR />
SI <input type="checkbox" value="si" name="SCPSI" /><br />
NO<input type="checkbox" value="no" name="SCPNO" /><br>FLOTTA:<br />
COURTESY <input type="checkbox" value="Courtesy" name="courtesy" /><br />
POOL <input type="checkbox" value="Pool" name="Pool" /><br>
<font face="Eras Medium ITC">Stazione:</font></td><td>
<select name="Stazione" id="Stazione" class="bootstrap-frm">
<option value="">Scegli la stazione</option>
<option value="TUTTE">TUTTE</option>
<option value="STAZIONE1">STAZIONE1</option>
<option value="STAZIONE2">STAZIONE2</option>
<option value="STAZIONE3">STAZIONE3</option>
<option value="STAZIONE4">STAZIONE4</option>
<option value="STAZIONE5">STAZIONE5</option>
<option value="STAZIONE6">STAZIONE6</option>
<option value="STAZIONE7">STAZIONE7</option>
<option value="STAZIONE8">STAZIONE8</option>
<option value="STAZIONE9">STAZIONE9</option>
<option value="STAZIONE10">STAZIONE10</option>
<option value="STAZIONE11">STAZIONE11</option>
</select><br />
<input id="button" style="margin-left: 10px;" value="Cerca" type="Submit">
</form>
Il codice PHP prima si preoccupa di verificare se è stato selezionato qualcosa, altrimenti assegna 0 come value. Recupera i dati della select e delle date.

Ora il problema sorge qua... come faccio a costruire una query in base agli input dati nella pagina precedente? In questa caso io posso avere o 1 stazione specifica o TUTTE, o una flotta specifica o TUTTE o un campo SCP specifico o TUTTE nell'intervallo delle date inserite....

Sto uscendo pazzo....

Grazie a chi vuole rispondere
 

marino51

Utente Attivo
28 Feb 2013
2.609
132
63
Lombardia
ho strutturato il tuo script per fare delle prove con la soluzione proposta,
PHP:
<?php
if (empty($_POST['cerca']))
{
?>
<form action="ricerca.php" method="post">
Data inizio <input type="date" name="datain" value="" placeholder="AAAA-MM-DD" /><br />
Data fine <input type="date" name="dateout" value="" placeholder="AAAA-MM-DD" /><br />
SCP:<BR />
SI <input type="checkbox" value="si" name="SCPSI" /><br />
NO<input type="checkbox" value="no" name="SCPNO" /><br>
FLOTTA:<br />
COURTESY <input type="checkbox" value="Courtesy" name="courtesy" /><br />
POOL <input type="checkbox" value="Pool" name="Pool" /><br>
<font face="Eras Medium ITC">Stazione:</font></td><td>
<select name="Stazione" id="Stazione" class="bootstrap-frm">
<option value="">Scegli la stazione</option>
<option value="TUTTE" selected>TUTTE</option>
<option value="STAZIONE1">STAZIONE1</option>
<option value="STAZIONE2">STAZIONE2</option>
<option value="STAZIONE3">STAZIONE3</option>
<option value="STAZIONE4">STAZIONE4</option>
<option value="STAZIONE5">STAZIONE5</option>
<option value="STAZIONE6">STAZIONE6</option>
<option value="STAZIONE7">STAZIONE7</option>
<option value="STAZIONE8">STAZIONE8</option>
<option value="STAZIONE9">STAZIONE9</option>
<option value="STAZIONE10">STAZIONE10</option>
<option value="STAZIONE11">STAZIONE11</option>
</select><br />
<input name="cerca" id="button" style="margin-left: 10px;" value="Cerca" type="Submit">
</form>
<?php
}
else
{
    if (empty($_POST['datain']))  $datain="1900-01-01";
    else                          $datain=$_POST['datain'];

    if (empty($_POST['dateout'])) $dateout="9999-12-31";
    else                          $dateout=$_POST['dateout'];

    $sql = "SELECT column_name(s) FROM table_name WHERE column_date BETWEEN '".$datain."' AND '".$dateout."'";

    if (!empty($_POST['SCPSI']))    $sql .= " AND condizione per scpsi";

    if (!empty($_POST['SCPNO']))    $sql .= " AND condizione per scpno";

    if (!empty($_POST['courtesy'])) $sql .= " AND condizione per courtesy";

    if (!empty($_POST['Pool']))     $sql .= " AND condizione per Pool";

    if (!empty($_POST['Stazione']) and $_POST['Stazione'] != "TUTTE") $sql .= " AND column_stazione = '".$_POST['Stazione']."'";

    echo $sql;
}
?>

ho modificato anche,
<option value="TUTTE" selected>TUTTE</option>
<input name="cerca" id="button" style="margin-left: 10px;" value="Cerca" type="Submit">
questo è "un" risultato
SELECT column_name(s) FROM table_name WHERE column_date BETWEEN '1900-01-01' AND '2017-08-01' AND condizione per scpsi AND condizione per courtesy AND column_stazione = 'STAZIONE6'

ps, non ho volutamente inserito logiche di controllo, vedi SI o NO, COURTESY o POOL
che lascio a te, che conosci l'applicazione

le clausole che seguono la where possono essere complicate con AND e OR (e LIKE) secondo la necessità
 
Ultima modifica:

Emix

Utente Attivo
15 Feb 2010
594
0
16
Ciao Marino e grazie per la risposta.
Funziona tutto egregiamente soltanto che giustamente non funzionano le doppie spunte. Mi spiego. A me servirebbe poter scegliere anche entrambe le scelte ES: SCP si e SCP no. In quel caso anche se la condizione che crei è giusta, non funziona per la query non stampa nulla. Come posso fare nel caso in cui mi servissero entrambi ? Mettiamo un ulteriore checkbox o c'è un modo diverso ?

Grazie
 

marino51

Utente Attivo
28 Feb 2013
2.609
132
63
Lombardia
A me servirebbe poter scegliere anche entrambe le scelte ES: SCP si e SCP no
Si e NO è applicato allo stesso campo ed i valori sono solo i due indicati ?
se la risposta è positiva, la doppia spunta equivale ad estrarre tutto, basta mettere un "if" che in caso di doppia spunta non inserisca nessuna della due condizioni
se la risposta è negativa, quali sono le definizioni del campo(o campi), i contenuti e come deve operare la scelta ?

per courtesy/pool vale lo stesso discorso
 

Emix

Utente Attivo
15 Feb 2010
594
0
16
Nono hai capito perfettamente. sono solamente due o si o no e in caso di flotta sono soltanto due, pool e corutesy.
 

marino51

Utente Attivo
28 Feb 2013
2.609
132
63
Lombardia
may be ...
PHP:
    $sql = "SELECT column_name(s) FROM table_name WHERE column_date BETWEEN '".$datain."' AND '".$dateout."'";

    if (empty($_POST['SCPSI']) or empty($_POST['SCPNO']))
    {
        if (!empty($_POST['SCPSI']))    $sql .= " AND condizione per scpsi";

        if (!empty($_POST['SCPNO']))    $sql .= " AND condizione per scpno";
    }

    if (empty($_POST['courtesy']) or empty($_POST['Pool']))
    {
        if (!empty($_POST['courtesy'])) $sql .= " AND condizione per courtesy";

        if (!empty($_POST['Pool']))     $sql .= " AND condizione per Pool";
    }

    if (!empty($_POST['Stazione']) and $_POST['Stazione'] != "TUTTE") $sql .= " AND column_stazione = '".$_POST['Stazione']."'";
 
Ultima modifica:

Emix

Utente Attivo
15 Feb 2010
594
0
16
Come sempre gentilissimo. è corretto. Grazie mille.