View Full Version : [PHP+MySQL]
ciao a tutti!
sto realizzando una piccola applicazione per la gestione della mia biblioteca personale.
per la memorizzazione dei libri mi appoggio ad un DB MySQL, la tabella LIBRI è strutturata enl modo seguente:
id, int(3)
titolo varchar(100)
autore varchar(50)
volume int(1)
scaffale varchar(3)
tag varchar(100)
ora, la situazione è la seguente:
-la ricerca per titolo funziona
-la ricerca per autore funziona
-la ricerca per tag... la ricerca per tag???
come posso implementare questa maledetta ricerca per tag??
dunque, facciamo chiarezza, il campo tag memorizza i dati in questo formato:
,tag1,tag2,tag3,...,
nel form di ricerca, il campo "tag" il formato utilizzato è lo stesso.
io avevo pensato di:
-prendere il contenuto di $_POST['tag']
-fare un explode(',', $_POST['tag'])
-poi con un ciclo creo una query con tanti LIKE quanti sono gli elementi dell'array ottenuto dall'explode legati con degli OR
SELECT i_campi_che_voglio FROM libri WHERE tag LIKE ',storia,' OR tag LIKE ',commedia,' OR tag LIKE ',biografia,' OR tag LIKE ...:sbavvv:
questa soluzione dovrebbe funzionare ma mi pare comunque che sia una cosa molto grezza:huh:
non esistono metodi più eleganti per raggiungere lo scopo? :wtf:
P.S.: forse la lunghezza di titolo ed autore sono un po' eccessive, lasciamo stare per adesso.:D
La butto lì... non è che magari non va implementato così il campo tag, ma va creata una tabella apposita, dove metterai tutte le tag create, con rispettivo libro collegato?
| tag | id_libro |
|-----------------------|-----------------------|
| disney | 3 |
| disney | 120 |
| horror | 27 |
umh... è vero, non ci avevo nemmeno pensato:doh:
però, scusa, se cerco più di un tag alla volta, ad esempio sto cercando un libro di guerra ambientato nel futuro e scritto in inghilterra ho sempre una query di questo tipo:
SELECT id_libro FROM MEMon_table WHERE tag='guerra' OR tag='futuro' OR tag='inghilterra'
insomma, non è che finisce che rimpiazzo i LIKE con gli = ?
ad ogni modo ora mi creo sicuramente la tabella come hai consigliato tu ma il problema della query chilometrica rimane
-----EDIT-----
ahhhh ho capito!!!
dici di fare così in modo che poi si possa usare l'IN?? hai ragione, scusa il mio iniziale scetticismo, sotto sotto sapevo che mi sfuggiva qualcosa, ora ci sono arrivato pure io.
grazie mille!
Beh si è ovvio che per cercare un libro indicando più tag c'è bisogno di metterle tutte, ma mica è un problema, e non è neppure una query chilometrica, rimane comunque una microquery, le query chilometriche son ben altre, e credimi, una query è quasi sempre chilometrica :D
-----EDIT-----
ahhhh ho capito!!!
dici di fare così in modo che poi si possa usare l'IN?? hai ragione, scusa il mio iniziale scetticismo, sotto sotto sapevo che mi sfuggiva qualcosa, ora ci sono arrivato pure io.
grazie mille!
Ho visto ora l'edit, avendo una tabella a se stante puoi sfruttare tutte le potenzialità di una query, IN compreso.
non so se vi può interessare (credo di no), nel dubbio io condivido!
questo è il file ricerca.php
<?php
if (isset($_POST['submit'])&&(!empty($_POST['autore'])||!empty($_POST['titolo'])||!empty($_POST['tag']))){ //inizio report
require('functions.inc.php');
echo '<h3>REPORT:</h3>';
$dbconn=connectDB();
if($dbconn!=1){echo $dbconn;}
$codquery=0;
$codtagquery=0;
if (!empty($_POST['titolo'])){
$queryta="SELECT id_libro FROM libri WHERE titolo LIKE '%".$_POST['titolo']."%'";
$codquery=1;
}
if (!empty($_POST['autore'])){
if ($codquery==1){
$queryta.=" AND autore LIKE '%".$_POST['autore']."%'";
}
else{
$queryta="SELECT id_libro FROM libri WHERE autore LIKE '%".$_POST['autore']."%'";
$codquery=1;
}
}
if (!empty($_POST['tag'])){
$tag=str_replace(",", "','", $_POST['tag']);
$tagquery="SELECT id_libro FROM tag_table WHERE tag IN ('".$tag."')";
$codtagquery=1;
}
if($codquery+$codtagquery==2){
$query=$queryta.' INTERSECT '.$tagquery;
}
else{
if($codquery==1){
$query=$queryta;
}
else{
$query=$tagquery;
}
}
$result=mysql_query($query); //dati ottenuti in base alla combinazione delle 2 query
if(@mysql_num_rows($result)){
$infoquery="SELECT * FROM libri WHERE id_libro IN ('0'"; //ottengo i dati in base agli id
while($id=mysql_fetch_array($result)){
$infoquery.=",'".$id[0]."'";
}
$infoquery.=")";
$infoquery=mysql_query($infoquery);
echo'<table border=1>';
echo '<tr><td>Titolo</td><td>Autore</td><td>Volume</td><td>Scaffale</td></tr>';
while($info=mysql_fetch_array($infoquery)){
echo '<tr><td>'.$info[1].'</td><td>'.$info[2].'</td><td>'.$info[3].'</td><td>'.$info[4].'</td></tr>';
}
echo'</table>';
}
else{
echo "<p>Nessun risultato.</p>";
}
} //fine report
else{ //form di ricerca
?>
<form name="datiUtenti" action="ricerca.php" method="POST">
Titolo: <input type="text" name="titolo"/><br/>
Autore: <input type="text" name="autore"/><br/>
Tag: <input type="text" name="tag"/><br/>
<br/>
<input type="hidden" name="submit" value="ok"/><br/>
<input type="submit" value="CERCA"/>
</form>
<?php
} //fine form di ricerca
?>
se avete dei consigli sappiate che vi ascolto.
P.S.: lasciate pure perdere le consigerazioni riguardanti la sicurezza e la grafica, l'applicazione dovrò girare su un computer che non avrà proprio fisicamente accessso alla rete e soprattutto visualizzerà le pagine tramite riga di comando, al massimo potrei usare le tabelle per un'impaginazione un grossolana
vBulletin® v3.6.4, Copyright ©2000-2026, Jelsoft Enterprises Ltd.