Ciao! Allora, ti spiego tutto: lo script è formato da tutti passaggi semplici concatenati in maniera logica; ti faccio presente che io di mestiere faccio il muratore, specializzato in impermeabilizzazioni di tetti e lattoneria, quindi la mia conoscenza elementare di php è relegata alla lettura di qualche libro/manuale durante le domeniche estive al mare. Se in futuro troverai il modo di elaborare lo script con formule più dirette, ben venga.
1) MySQL:
ho creato 3 tabelle +1 (tu ne farai 5+1): NOMI (id, valori(=> nomi di persone)), CAPELLI (id, valori(=> neri, castani, ecc...)), OCCHI (id, valori(=>azzurri, verdi, ecc...)). L'ultima tabella è di riepilogo ELENCO (id, id_nomi, id_capelli, id_occhi). Per ogni campo di ogni riga di questa tabella, è presente un valore id corrispondente alla propria "caratteristica" nella propria tabella di riferimento. Tanto per intenderci: non avrai (ANDREA, CASTANI, VERDI), ma (1, 2, 2). Questo sistema ha uno svantaggio: nella tabella elenco, quando inserisci i dati non devi inserire direttamente le caratteristiche ma il loro id di riferimento nella propria tabella di dettaglio; ma ha un grande vantaggio: se devi cambiare/modificare un valore, basta andare nella propria tabella di dettaglio e modificare una singola vocina che, al contempo modifica tutte le caselle della tabella ELENCO che hanno lo stesso id nello stesso campo.
2) FORM:
ho creato un form dinamico con 3 caselle di riepilogo a discesa. I dati mostrati in ogni casella li prendo direttamente dal DB, senza quindi inserirli nel html della pag. Ho settato # come valore NULL di ogni menù. La pagina in questione l'ho chiamata provamodulo.php. Ecco il codice:
Codice PHP:
<html>
<head>
<meta name="GENERATOR" content="Microsoft FrontPage 6.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<title>Nuova pagina 1</title>
</head>
<?php
require "ezine_db.inc.php";
$ezine_db = ezine_connecte_db();
$nomiel = @mysql_query('SELECT id,dati FROM nomi');
$capelliel = @mysql_query('SELECT id,dati FROM capelli');
$occhiel = @mysql_query('SELECT id,dati FROM occhi');
?>
<body>
<FORM target="_blank" ACTION="pag_search.php" Method="GET">
<select size="1" name="nomi">
<option selected value=#>-</option>
<?php
while ($n_el = mysql_fetch_array($nomiel)) {
$n_id = $n_el['id'];
$n_dt = htmlspecialchars($n_el['dati']);
echo "<option value='$n_id'>$n_dt</option>\n";
}
?>
</select></p>
<select size="1" name="capelli">
<option selected value=#>-</option>
<?php
while ($c_el = mysql_fetch_array($capelliel)) {
$c_id = $c_el['id'];
$c_dt = htmlspecialchars($c_el['dati']);
echo "<option value='$c_id'>$c_dt</option>\n";
}
?>
</select></p>
<select size="1" name="occhi">
<option selected value=#>-</option>
<?php
while ($o_el = mysql_fetch_array($occhiel)) {
$o_id = $o_el['id'];
$o_dt = htmlspecialchars($o_el['dati']);
echo "<option value='$o_id'>$o_dt</option>\n";
}
?>
</select></p>
<input type="submit" value="invia" name="invia"><input type="reset" value="Reimposta" name="B2"></p>
</form>
</body>
</html>
3) PHP
...tralasciamo la parte di connessione al DB e di gestione degli errori di connessione...
Passiamo al settaggio delle variabili inviate dal FORM alla pag_search.php
Codice PHP:
//preparazione variabili
$nm=(isset($_REQUEST['nomi'])) ? $_REQUEST['nomi'] : "";
$cp=(isset($_REQUEST['capelli'])) ? $_REQUEST['capelli'] : "";
$oc=(isset($_REQUEST['occhi'])) ? $_REQUEST['occhi'] : "";
ora inserisco i parametri inviati in un array, definendo il comportamento da eseguire per ogni parametro inviato. Se scelgo un Nome devo cercare nella tabella ELENCO, alla colonna id_nomi, e così via:
Codice PHP:
$ext=array();
if (isset($_REQUEST['nomi']) && (!empty($_REQUEST['nomi'])) && ($nm != '#')) $ext['0']=" elenco.id_nomi LIKE '$nm'";
if (isset($_REQUEST['capelli']) && (!empty($_REQUEST['capelli'])) && ($cp != '#')) $ext['1']=" elenco.id_capelli LIKE '$cp'";
if (isset($_REQUEST['occhi']) && (!empty($_REQUEST['occhi'])) && ($oc != '#')) $ext['2']=" elenco.id_occhi LIKE '$oc'";
Ora creo due query di ricerca, una funziona se tutti i parametri sono inviati # cioè vuoti. In questo caso hai due scelte o trovi tutti i risultati oppure echo"è necessario selezionare un parametro"... fai tu. L'altra funziona se anche solo un parametro è stato inviato dal FORM e, con il comando implode, recupera dall'array i parametri inviati e li esegue, ognuno nella sua colonna di pertinenza della tabella ELENCO.
Codice PHP:
if ($nm == '#' && $cp == '#' && $oc =='#') {
$stringa2 = NULL;
$stringa1 = "SELECT * FROM elenco ORDER BY id";
}
if ($nm != '#' OR $cp != '#' OR $oc != '#') {
$stringa1 = NULL;
$stringa2 = "SELECT * FROM elenco WHERE (".implode(" AND ",$ext).")";
}
Ora con un semplice ciclo if, recupero quale delle due query è attiva e per sicurezza annullo l'altra:
Codice PHP:
if (!empty($stringa1)) {
$stringa2 = NULL;
$ris = @mysql_query($stringa1);
} else if (!empty($stringa2)) {
$stringa1 = NULL;
$ris = @mysql_query($stringa2);
}
Adesso ho ottenuto un set di risultati MA, si tratta di righe piene di numeri quindi, con un ciclo WHILE, processo tutte le righe trovate e, per ognuna delle quali, per ogni id_nome, id_capelli, id_occhi ordino di andare a cercare nella propria tabella di riferimento a quale caratteristica corrisponde. In questo modo sostituisco gli id con caratteristiche e poi impagino i risultati in una tabella:
Codice PHP:
while ($row = mysql_fetch_array($ris)) {
$search_nomi = "SELECT * FROM nomi WHERE nomi.id LIKE ($row[1])";
$search_capelli = "SELECT * FROM capelli WHERE capelli.id LIKE ($row[2])";
$search_occhi = "SELECT * FROM occhi WHERE occhi.id LIKE ($row[3])";
$s_nom = @mysql_query($search_nomi);
$s_cap = @mysql_query($search_capelli);
$s_occ = @mysql_query($search_occhi);
while ($row_nomi = mysql_fetch_array($s_nom)) {
//stampo i risultati in una tabella
echo "
</p>";
echo "<table border=\"0\" cellspacing=\"0\" cellpadding=\"2\" id=\"table1\">";
echo "<tr>";
echo "<td style=\"border-right: 1px solid #CCCCCC; border-bottom: 1px solid #CCCCCC\" align=\"center\" width=\"33%\" height=\"20\"><font color=\"#005CB9\" size=\"-1\" face=\"Arial\">" . $row_nomi[1] . "</td>";
}
while ($row_cap = mysql_fetch_array($s_cap)) {
echo "<td style=\"border-right: 1px solid #CCCCCC; border-bottom: 1px solid #CCCCCC\" align=\"center\" width=\"33%\" height=\"20\"><font color=\"#005CB9\" size=\"-1\" face=\"Arial\">" . $row_cap[1] . "</td>";
}
while ($row_occ = mysql_fetch_array($s_occ)) {
echo "<td style=\"border-right: 1px solid #CCCCCC; border-bottom: 1px solid #CCCCCC\" align=\"center\" width=\"34%\" height=\"20\"><font color=\"#005CB9\" size=\"-1\" face=\"Arial\">" . $row_occ[1] . "</td>";
echo "</tr>";
}
}
?>
Io l'ho provato e funziona; resto a disposizione. Ciao!!!