Il problema è che voglio un motore di ricerca abbastanza complesso a vantaggio della sua utilità.
Il form di ricerca è strutturato così:
1) c'è una casella di testo che può essere cercato in uno solo dei seguenti campi:
titolo
autore
musicista
commento
in prestito a
prestato da
2) c'è la possibilità di aggiungere uno dei seguenti campi nella ricerca (caselle a discesa a singola selezione)
etichetta
genere
giudizio
3) la ricerca si può ordinare per:
anno
giudizio
titolo (ordine alfabetico)
e l'ordine può essere ascendente o discendente
Di questi punti per ora ho risolto 1) e 3), se dovessi creare una query completa per ogni casistica non me la cavo più, per ora il codice è questo, che riporto solo a titolo di esempio per far vedere che ho variato la query solo in alcuni punti a seconda dei valori postati (che sono inseriti in sessione per evitare di doverli ritrasmettere in caso di paginazione dei risultati):
Codice PHP:
$query="SELECT c.* FROM cd c ";
if (!empty($_SESSION['principale'])&&$_SESSION['principale']!="") {
switch ($_SESSION[ricerca]) {
case "titolo":
$query.="WHERE LOWER($_SESSION[ricerca]) LIKE '%$_SESSION[principale]%' ";
break;
case "commento":
$query.="WHERE LOWER($_SESSION[ricerca]) LIKE '%$_SESSION[principale]%' ";
break;
case "prestito":
$query.="WHERE LOWER($_SESSION[ricerca]) LIKE '%$_SESSION[principale]%' ";
break;
case "in_prestito":
$query.="WHERE LOWER($_SESSION[ricerca]) LIKE '%$_SESSION[principale]%' ";
break;
case "autore":
$query.="INNER JOIN cd_musicisti_autori cd_m_a
ON c.id = cd_m_a.id_cd
INNER JOIN musicisti m
ON cd_m_a.id_musicisti = m.id
WHERE LOWER(m.nome) LIKE '%$_SESSION[principale]%'
OR
LOWER(m.cognome) LIKE '%$_SESSION[principale]%'";
break;
case "musicista":
$query.="INNER JOIN cd_musicisti cd_m
ON c.id = cd_m.id_cd
INNER JOIN musicisti m
ON cd_m.id_musicisti = m.id
WHERE LOWER(m.nome) LIKE '%$_SESSION[principale]%'
OR
LOWER(m.cognome) LIKE '%$_SESSION[principale]%'";
break;
}
}
$query.="ORDER BY $_SESSION[ordine] $_SESSION[ordine2] ";
$query.="LIMIT $primo, $per_page";