Ricerca nel DB con radiobutton + riempimento select

Scar991

Utente Attivo
30 Apr 2012
167
0
0
Salve a tutti!
Sto organizzando l'interfaccia per il DB di una biblioteca.
Per la ricerca avevo pensato ad una struttura piuttosto semplice:

Un campo di ricerca con annesso pulsante;
Una serie di radiobutton per specificare il criterio secondo il quale eseguire la ricerca;
Un campo che raccolga i risultati e mi consenta di selezionarli per vederne i dettagli;

Ho "collegato" il mio form alla action, nella quale ho definito le 'varianti' della query a seconda del pulsante premuto.

Esempio:

PHP:
if(isset($_POST['Radio_Ricerca']) && $_POST['Radio_Ricerca'] == 'Codice'){
		
		$query = "SELECT CODICE, TITOLO, AUTORE FROM elenco_libri WHERE CODICE LIKE $stringa%";
		}
	
	if(isset($_POST['Radio_Ricerca']) && $_POST['Radio_Ricerca'] == 'Categoria'){
		$query = "SELECT * FROM elenco_libri WHERE CATEGORIA LIKE $stringa%";
		}
	
	if(isset($_POST['Radio_Ricerca']) && $_POST['Radio_Ricerca'] == 'Autore'){
		$query = "SELECT * FROM elenco_libri WHERE AUTORE LIKE $stringa%";
		}
E così per ogni pulsante.

Ho poi, alla fine degli if, 'fatto partire' la query, con

PHP:
$q = mysql_query($query);
Ho controllato questo comando col var_dump() e il risultato è bool(false) (non so se c'è qualche problema nella definizione delle query, magari per il % alla fine del like?)

Oltre questo problema, non so come 'raccogliere i risultati' della query, inviarli all'altra pagina (immagino con una variabile in sessione ma vorrei una conferma) e inoltre vorrei capire come riempire una select assegnando alle <option> proprio i risultati della query. Qualcuno sa aiutarmi??
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
ciao
intanto correggi mettendo gli apici
.....WHERE CODICE LIKE '$stringa%'";
a tutti i like
poi da dove salta fuori la variabile $stringa? un $_post che non hai messo?
poi perche scrivi tante le volte la query?
PHP:
<?php
//......
if(isset($_POST['Radio_Ricerca']){
	switch($_POST['Radio_Ricerca']){
		case "Codice": $wh=" CODICE ";
		break;
		case "Categoria": $wh=" CATEGORIA ";
		break;
		case "Autore": $wh=" AUTORE ";
		break;
	}
	$wh .= "LIKE '$stringa%'";
	$query = "SELECT * FROM elenco_libri WHERE $wh";
	//pi metti anche qui un var_dump per vedere se la query è scritta giusta
	var_dump($query);
	$q=mysql_query($query);
	var_dump($q);
}
//.....
?>
se l'interrogazione al db ti da bool false conviene sempre verificare la query stringa per vedere se non ci sono errori
 

Scar991

Utente Attivo
30 Apr 2012
167
0
0
poi da dove salta fuori la variabile $stringa? un $_post che non hai messo?
Perdonami, $stringa è il valore del campo di testo preso dal post, ho dimenticato di indicarlo prima!

Comunque, geniale, non mi era venuto in mente di usare lo switch!
La query funziona infatti il var_dump non da come risultato il bool(false)

Ci sono ancora un paio di problemini, anzi in sostanza uno dipende dall'altro...
Una volta fatta la mia ricerca nella action, devo tornare alla pagina di presentazione con tutte le righe trovate dalla mia query (immagino debba farlo con una variabile di sessione)

Esempio:

PHP:
		$_SESSION['query'] = serialize($q);
e scompattarla dall'altro lato. E' corretto?
Non so come procedere poi per riempire il mio elenco (tag html <select>) con tutte le righe risultanti dalla query.
Avevo pensato ad una cosa del genere, per 'scompattare' gli elementi della query

PHP:
if (isset($_SESSION['query'])) {
		$query = unserialize($_SESSION['query']);
	} else {
		$query = '';
	}

while ($tempbox = mysql_fetch_array($query)){
		$code = $tempbox['CODICE'];
		$category = $tempbox['CATEGORIA'];
		$author = $tempbox['AUTORE'];
		$title = $tempbox['TITOLO'];
		$publishing = $tempbox['CASA_EDITRICE'];
		$pubyear = $tempbox['ANNO'];
		$pubplace = $tempbox['LUOGO'];

	}
ma non essendo esperto non so se funziona e se è il procedimento corretto...
Come mi consigliate di procedere?
 

Scar991

Utente Attivo
30 Apr 2012
167
0
0
Ahahahah! Classico! Allora aspetto con ansia un modo semplice per risolvere il mio problema :) Grazie mille Borgo!
 

Scar991

Utente Attivo
30 Apr 2012
167
0
0
Ecco a te

HTML:
<form id="Ricerca_Libri" name="Ricerca_Libri" method="post" action="act_ricerca.php">
  <h3>Cerca per</h3>
  <div id="tipo_ricerca">
    <label>
      <input type="radio" name="Radio_Ricerca" value="Codice" id="Radio_Ricerca_0" />
      Codice</label>
      <label>
      <input type="radio" name="Radio_Ricerca" value="Categoria" id="Radio_Ricerca_1" />
      Categoria</label>
    <label>
      <input type="radio" name="Radio_Ricerca" value="Autore" id="Radio_Ricerca_2" />
      Autore</label>
    <label>
      <input type="radio" name="Radio_Ricerca" value="Titolo" id="Radio_Ricerca_3" />
      Titolo</label>
      <label>
      <input type="radio" name="Radio_Ricerca" value="Casa_ED" id="Radio_Ricerca_4" />
      Casa Editrice</label>
    <label>
      <input type="radio" name="Radio_Ricerca" value="Anno" id="Radio_Ricerca_5" />
      Anno</label>
    <label>
      <input type="radio" name="Radio_Ricerca" value="Tutto" id="Radio_Ricerca_6" />
      Tutto</label>
  </div>
    <div id="Search">
      <p>
          <input type="text" name="Text_Search" id="Text_Search" /> <input type="submit" name="Avvia_ricerca" value="Ricerca" />
      </p>
    </div>
	<div id="ris_search">
    <select name="Risultati_Ricerca" id="Risultati_Ricerca" size="15">

    </select>
    </div>
</form>
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
ciao
cosa intendi per
<input type="radio" name="Radio_Ricerca" value="Tutto" id="Radio_Ricerca_6" />
?
es se nel campo testo immetti "pinco" vuol dire che deve cercare in codice, categoria, autore..... cioè in tutti i campi un valore che inizi per pinco?
mi sembrerebbe un po' un assurdo perchè andare a cercare, es, pinco nell'anno non mi sembra il caso.
se con tutto vuoi vedere TUTTI i libri, in pratica l'elenco completo della libreria ti conviene staccare la formazione dell'elenco dalla ricerca.
io farei una pagina per avere l'elenco (eventualmente ordinato per un determinato criterio) e una per la ricerca secondo determinati criteri

prima di andare avanti aspetto una tua risposta
 

Scar991

Utente Attivo
30 Apr 2012
167
0
0
Praticamente serve nel caso in cui uno non sappia bene con che criterio cercare. Ho fatto una query che, con una serie di OR, cerchi il parametro in tutte le colonne. Nel caso in cui scriverai 'pippo' non ci saranno risultati relativi alla colonna dell'anno, di conseguenza il problema non si pone... Però magari può essere una parte del titolo, uno degli autori eccetera... Per questo mi serviva la ricerca in ogni colonna.

La mia query in pratica è
PHP:
"SELECT * WHERE CODICE LIKE '%$stringa%' OR AUTORE LIKE '%$stringa%' OR [...] "
Arriveranno, dunque, alcuni risultati, non tutto il database.
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
ciao
allora, penso, che ti convenga aggiustare lo switch così
PHP:
<?php
switch($_POST['Radio_Ricerca']){
        case "Codice": $wh=" CODICE LIKE '$stringa%'";
        break;
        case "Categoria": $wh=" CATEGORIA LIKE'$stringa%'";
        break;
        case "Autore": $wh=" AUTORE LIKE '$stringa%'";
        break;
		//....
		case "Tutto": $wh=" CODICE LIKE '$stringa%' OR CATEGORIA LIKE '$stringa%' ........";
		default: $wh=" CODICE LIKE '$stringa%'";//nel caso non venga fatta alcuna selezione
		break;		
    } 
$query = "SELECT * FROM elenco_libri WHERE $wh"; 
//ecc..... query...
?>
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
ciao
parli di questo
Oltre questo problema, non so come 'raccogliere i risultati' della query, inviarli all'altra pagina (immagino con una variabile in sessione ma vorrei una conferma) e inoltre vorrei capire come riempire una select assegnando alle <option> proprio i risultati della query. Qualcuno sa aiutarmi??
e perchè devi mandarli ad un'altra pagina?
o metti il form di ricerca e i risultati nella stessa
o form in una e risultati in un'altra

i due schemi
pagina unica:
pag. cerca_e_mostra.php
PHP:
<?php
//ricerchi
//e mostri i risultati
?>
<form name="form1" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<!-- radio e submit -->
</form>
due pagine:
pag. cerca.php
PHP:
<form name="form1" method="post" action="mostra.php">
<!-- radio e submit -->
</form>
pag. mostra.php
PHP:
<?php
//ricerchi
//e mostri i risultati
?>
<a href="cerca.php">altra ricerca</a>
 

Scar991

Utente Attivo
30 Apr 2012
167
0
0
Ok, ho fatto qualche tentativo, controllato le queries con la var_dump e non c'è nessun bool(false).

Non riesco a riempire la select con i risultati della query.

Posto qui il codice della pagina

PHP:
<?php
session_start()

//dati di connessione
?>

<form id="Ricerca_Libri" name="Ricerca_Libri" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
  <h3>Cerca per</h3>
  <div id="tipo_ricerca">
    <label>
      <input type="radio" name="Radio_Ricerca" value="Codice" id="Radio_Ricerca_0" />
      Codice</label>
      <label>
      <input type="radio" name="Radio_Ricerca" value="Categoria" id="Radio_Ricerca_1" />
      Categoria</label>
    <label>
      <input type="radio" name="Radio_Ricerca" value="Autore" id="Radio_Ricerca_2" />
      Autore</label>
    <label>
      <input type="radio" name="Radio_Ricerca" value="Titolo" id="Radio_Ricerca_3" />
      Titolo</label>
      <label>
      <input type="radio" name="Radio_Ricerca" value="Casa_ED" id="Radio_Ricerca_4" />
      Casa Editrice</label>
    <label>
      <input type="radio" name="Radio_Ricerca" value="Anno" id="Radio_Ricerca_5" />
      Anno</label>
    <label>
      <input type="radio" name="Radio_Ricerca" value="Tutto" id="Radio_Ricerca_6" />
      Tutto</label>
  </div>
  <div id="Search">
      <p>
          <input type="text" name="Text_Search" id="Text_Search" /> <input type="submit" name="Avvia_ricerca" value="Ricerca" />
      </p>
    </div>
  <?php
	
	if(isset($_POST['Text_Search'])) {
	$stringa = strtoupper($_POST['Text_Search']);
	}
	
	if(isset($_POST['Radio_Ricerca'])) {
		switch ($_POST['Radio_Ricerca']) {
			case "Codice": $wh = " UPPER(CODICE) LIKE '$stringa%'";
			break;
			case "Categoria": $wh = " UPPER(CATEGORIA) LIKE '%$stringa%'";
			break;
			case "Autore": $wh = " UPPER(AUTORE) LIKE '%$stringa%'";
			break;
			case "Titolo": $wh = " UPPER(TITOLO) LIKE '%$stringa%'";
			break;
			case "Casa_ED": $wh = " UPPER(CASA_EDITRICE) LIKE '%$stringa%'";
			break;
			case "Anno": $wh = " UPPER(ANNO) LIKE '%$stringa%'";
			break;
			case "Tutto": $wh = "UPPER(CODICE) LIKE '$%stringa%' OR UPPER(AUTORE) LIKE '%$stringa%' OR UPPER(TITOLO) LIKE '%$stringa%' OR UPPER(CASA_EDITRICE) LIKE '%$stringa%' OR UPPER(ANNO)  LIKE '%$stringa%'";
			default: $wh = " UPPER(CODICE) LIKE '$stringa%'";
			break;			
		}

		$query = "SELECT * FROM elenco_libri WHERE $wh";
		
		$q = mysql_query($query);
		
		?>
    <div id="ris_search">    
    <select name="Risultati_Ricerca" id="Risultati_Ricerca" size="15">
    <?php
	
		if (mysql_num_rows($q > 0)) {
			while ($tempbox = mysql_fetch_array($q)){
			$code = ($tempbox['CODICE']);
			$category = ($tempbox['CATEGORIA']);
			$author = ($tempbox['AUTORE']);
			$title = ($tempbox['TITOLO']);
			$publishing = ($tempbox['CASA_EDITRICE']);
			$pubyear = ($tempbox['ANNO']);
			$pubplace = ($tempbox['LUOGO']);

// qui in teoria dovrebbe esserci echo "<option value="$code">RIGA NELLA SELECT</option>"; ma non funziona.
			
	?>
    </select>
    <?php 
		}
		}
	}
	?>
    </div>
</form>
Come faccio a riempire la select??
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
ciao
intanto se non da bool false deve darti resuorce, se non te lo da non viene eseguito il var dump, o uno o l'altro.
metti poi il var_dump( $query) della querystringa e guarda se ti da qualcosa? se viene eseguito deve darti
string(nn) "SELECT * FROM elenco_libri WHERE..." dove al posto dei punti quello che hai selezionato.
però da un primo occhio intanto non capisco a che che ti serva una <select> ....</select> (se poi funzia) in quel punto.
secondo me è da rifare il tutto
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
ciao
prova una cosa come questo schema
PHP:
<?php
session_start(); //a che ti serve?
//dati di connessione
?>
<form id="Ricerca_Libri" name="Ricerca_Libri" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
  <h3>Cerca per</h3>
  <div id="tipo_ricerca">
    <label><input type="radio" name="Radio_Ricerca" value="Codice" id="Radio_Ricerca_0" />Codice</label>
    <label><input type="radio" name="Radio_Ricerca" value="Categoria" id="Radio_Ricerca_1" />Categoria</label>
    <label><input type="radio" name="Radio_Ricerca" value="Autore" id="Radio_Ricerca_2" />Autore</label>
    <label><input type="radio" name="Radio_Ricerca" value="Titolo" id="Radio_Ricerca_3" />Titolo</label>
    <label><input type="radio" name="Radio_Ricerca" value="Casa_ED" id="Radio_Ricerca_4" />Casa Editrice</label>
    <label><input type="radio" name="Radio_Ricerca" value="Anno" id="Radio_Ricerca_5" />Anno</label>
    <label><input type="radio" name="Radio_Ricerca" value="Tutto" id="Radio_Ricerca_6" />Tutto</label>
  </div>
  <div id="Search">
      <p>
          <input type="text" name="Text_Search" id="Text_Search" /> <input type="submit" name="Avvia_ricerca" value="Ricerca" />
      </p>
  </div>
</form>
  <?php
if(isset($_POST['Avvia_ricerca']) && $_POST['Avvia_ricerca']=="Ricerca"){//altrimenti come fa a sapere php che hai avviato la ricerca?  
    if(trim($_POST['Text_Search']) !="") {
    	$stringa = strtoupper($_POST['Text_Search']);
    }else{
		echo "<h1>non messo un criterio di ricerca</h1>";
		echo "<meta http-equiv='Refresh' content='3; URL=".htmlspecialchars($_SERVER['PHP_SELF'])."'>";
	}
	//non serve la verifica perche se è vuoto ci pensa la clausola "default" dello switch
	switch ($_POST['Radio_Ricerca']) {
    	case "Codice": $wh = " UPPER(CODICE) LIKE '$stringa%'";
        break;
        case "Categoria": $wh = " UPPER(CATEGORIA) LIKE '%$stringa%'";
        break;
        case "Autore": $wh = " UPPER(AUTORE) LIKE '%$stringa%'";
        break;
        case "Titolo": $wh = " UPPER(TITOLO) LIKE '%$stringa%'";
        break;
        case "Casa_ED": $wh = " UPPER(CASA_EDITRICE) LIKE '%$stringa%'";
        break;
        case "Anno": $wh = " UPPER(ANNO) LIKE '%$stringa%'";
        break;
        case "Tutto": $wh = "UPPER(CODICE) LIKE '$%stringa%' OR UPPER(AUTORE) LIKE '%$stringa%' OR UPPER(TITOLO) LIKE '%$stringa%' OR UPPER(CASA_EDITRICE) LIKE '%$stringa%' OR UPPER(ANNO)  LIKE '%$stringa%'";
        default: $wh = " UPPER(CODICE) LIKE '$stringa%'";
        break;            
	}
	//considera però che usi tutto può venirti fuori una <select> lunga una bibbia
	$query = "SELECT * FROM elenco_libri WHERE $wh";
	$q = mysql_query($query);
	//qui devi mettere la verifica se ci sono record
	if (mysql_num_rows($q > 0)) {//io metterei la condizione che se i risultati sono + di 20 (es) farei fare la ricerca con criteri più stretti
	// non so quanti libri hai ma se es 1000 di cui 100 usciti nel 2012 e uno ricerca solo per 2012 ti tocca scorrere per un pezzo
	//per trovare quello che cerchi
?>
    	<div id="ris_search">
		<form action="scheda_libro.php" method="post">
    	<select name="Risultati_Ricerca" id="Risultati_Ricerca" size="15">
<?php
    	while ($tempbox = mysql_fetch_array($q)){
			$code = $tempbox['CODICE'];
        	$category = $tempbox['CATEGORIA'];
        	$author = $tempbox['AUTORE'];
        	$title = $tempbox['TITOLO'];
        	$publishing = $tempbox['CASA_EDITRICE'];
        	$pubyear = $tempbox['ANNO'];
        	$pubplace = $tempbox['LUOGO'];
			echo "<option value=\"code\">$author : $title</option>";
    	}//fine del while
?>
    	</select>
		<!--qui puoi mettere un altro tasto di submit o con un js fai
		automaticamente il submit alla selezione della select
		io ti metto il submit eventualmente ti posto il js -->
		<input type="submit" name="scheda_libro" value="scheda" />
		</form>
		</div>
<?php 
	}else{
		echo "<h1>testi non trovati, cambia criterio di ricerca</h1>"
		echo "<meta http-equiv='Refresh' content='3; URL=".htmlspecialchars($_SERVER['PHP_SELF'])."'>";
	}
}
?>
poi ti fai la pagina scheda_libro.php
PHP:
<?php
//dati di connessione
$code=$_POST['Risultati_Ricerca'];
$query = "SELECT * FROM elenco_libri WHERE CODICE='$code'";
$q = mysql_query($query);
$riga=mysql_fetch_array($q);
$code = $riga['CODICE'];
$category = $riga['CATEGORIA'];
$author = $riga['AUTORE'];
$title = $riga['TITOLO'];
$publishing = $riga['CASA_EDITRICE'];
$pubyear = $riga['ANNO'];
$pubplace = $riga['LUOGO'];
//qui poi ci penserai tu con i css
echo "codice libro: $code<br />";
echo "categoria: $category<br />";
//ecc....
echo "<a href=\"cerca.php\">altra ricerca</a>";
?>
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
ciao
ieri mi ero dimenticato, modifica la query di ricerca
PHP:
<?php
//.....
    $query = "SELECT * FROM elenco_libri WHERE $wh ORDER BY AUTORE,TITOLO"; 
//.....
?>
così l'elenco ti risulta ordinato e non sparso qua e la
 

Scar991

Utente Attivo
30 Apr 2012
167
0
0
Si, avevo messo l'order by nella mia revisione, grazie borgo!

Ho provato ad aggiungere un pulsante di eliminazione nella pagina dei dettagli che mi avevi consigliato di usare.

PHP:
<form ...>
<?php
echo "Codice: $code <br />";
echo "Categoria: $category <br />";

// ecc ecc ecc

?>
<input type="submit" name="Elimina" value="Elimina" />

if(isset($_POST['Elimina']) && $_POST['Elimina'] == 'Elimina') {
		$wh2 = "CODICE = '$code' AND TITOLO = '$title'";
		$del = "DELETE FROM elenco_libri WHERE $wh2";
		
		$d = mysql_query($del);
}

</form>
Ma la cancellazione non avviene.
Il form viene inviato e a quanto sembra resettato in quanto la pagina risulta essere vuota. Cosa mi consigliate?