[Php - MySql] ricerca con form select diversi

windtalk

Nuovo Utente
27 Gen 2010
10
0
0
Ciao a tutti sono nuovo di quessto forum, ma non del php! :)

Sono alle prese con un motorino di ricerca. Vo spiego
sto cercando di realizzare la seguente modalità di ricerca:

Ho un db con 3 tabelle e voglio realizzare un sistema di ricerca su una sola tabella che ricerchi dati incrociandoli nei diversi campi.
il db è così strutturato

db:
dati
tabelle:
personaggi con 34 campi
sessioni con 3 campi
utenti con 10 campi

A me interessa per la ricerca la sola tabella personaggi.

Mi spiego meglio.
Voglio effettuare una modalità di ricerca all'interno della tabella che incroci dati presenti in due o tre campi per un determinato record.
La modalità di input per l'utente, e quindi anche per caturare i dati tramite POST, voglio che sia tramite form select e input.
HTML:
<form method="post" action="cerca.php">
<select name="urlA">
<option value="" selected> 
<option value="cognome">Cognome
<option value="arcocronos">Arco Cronologico
<option value="attivita">Attività
</select><br>
<input type=text maxlength=30 size=15 name="chiaveA"><br /><br />
<select name="urlB">
<option value="" selected> 
<option value="arcocronos">Arco Cronologico
<option value="provenienza">Provenienza
<option value="attivita">Attività
<option value="residenza">Residenza
<option value="beni">Beni o Proprietà
<option value="ordine">Ordine
</select><br>
<input type=text maxlength=30 size=15 name="chiaveB"><br /><br />
<input type="submit" value="cerca"> 
</form>


e per il codice php ho scritto in sintesi questo:
PHP:
//chiavi da ricercare divisa da virgole 
$keyA = explode (",", $_POST['chiaveA']); 
$keyB = explode (",", $_POST['chiaveB']); 

$urlA=($_POST['urlA'] == 'cognome' || $_POST['urlA'] == 'arcocronos' || $_POST['urlA'] == 'attivita'); 
$urlB=($_POST['urlB'] == 'arcocronos' || $_POST['urlB'] == 'provenienza' || $_POST['urlB'] == 'attivita' || $_POST['urlB'] == 'residenza' || $_POST['urlB'] == 'beni' || $_POST['urlB'] == 'ordineR'); 

if (($urlA=='') || ($urlB=='')) { 
echo "Devi riempiere tutti i campi"; 
} else { 

$query2 = "SELECT * FROM persone WHERE '$urlA%' LIKE '%$keyA%' AND '$urlB%' LIKE '%$keyB%'"; 
$result2 = mysql_query($query2, $db) 
or die( "Errore: " . mysql_error() ); 

//conto il numero di record trovati 
$numrows2 = mysql_num_rows($result2); 

//realizzo un ciclo WHILE 
while ($row2 = mysql_fetch_array($result2)) { 
//stampo il risultato 
echo "Personaggio: " . $row2['nome'] . "&nbsp;" .strtoupper($row2['cognome']). "<br>"; 
} 

}

Ho problemi nella costruzione della query e della gestione degli input da parte dell'utente tramite POST. Come li gestisco? Come faccio a dire di cercarmi quel record in cui sono presenti solo ed esclusivamente i valori immessi nei campi delle select "urlA" e "urlB"?
Potete darmi qualche suggerimento?

grazie per qualsiasi aiuto e suggeirmento e segnalazione :)
 
ciao

scusa, ma non capisco molto bene il tuo scripit
1. dopo l'explode $keyA e $keyB sono un array
2. alle variabili $urlA e $urlB, se non vado errato, assegni il valore TRUE o FALSE rimangono vuote (?).

quindi per me (ma forse sto dicendo una ca...ta) la select ti diventa

"SELECT * FROM persone WHERE 'TRUE' LIKE '%ARRAY%' AND 'TRUE' LIKE '%ARRAY%'";

mentre, da quello che ho capito, se inputi nel form (es),
cognome
pinco, pallo
provenienza
vicino, lontano

vorresti che la selct fosse

FROM persone WHERE (cognome LIKE pinco OR cognome LIKE pallo OR provenienza LIKE vicino OR provenienza LIKE lontano)

o al posto degli OR gli AND

o ho capito male?


p.s.
benvenuto nel forum (più MIGLIORE)
 
grazie per la risposta e il benvenuto :)

si in effetti a me servirebbe una cosa del tipo, se inputi nel form es
cognome
pinco
provenienza
vicino

nella select della query vorrei che fosse
FROM persone WHERE (cognome LIKE pinco AND provenienza LIKE vicino)

il fatto è che vorrei che i valori fossero dinamici. una select per tutte le opzioni che possono verificarsi insomma.:confused:
lo so, mi sono incasinato da solo!!
 
ciao,
ti do un'idea di massima, io ho messo tutto in una pagina, però
tu puoi dividerla.
comunque (sembra) che funzi

PHP:
<?php
//variabili ci connessione

if(isset($_POST['cerca']) && $_POST['cerca']=="cerca"){//se ho dato il submit
	if($_POST['urlA'] !="" || $_POST['urlB'] !="" || trim($_POST['chiaveA']) !="" || trim($_POST['chiaveB'])){//se i campi non vuoti
		//chiavi da ricercare divisa da virgole 
		//sarebbe opportuno verificare che esistato virgole
		// es. in chiaveA potrei scrivere solo PINCO
		//facciamo finta che comunque siano scritti giusti
		$urlA=$_POST['urlA'];
		$urlB=$_POST['urlB'];
		$keyA = explode (",", $_POST['chiaveA']);
		$keyB = explode (",", $_POST['chiaveB']);
		$interrogaA="";//metto a vuote due variabili che mi serviranno
		$interrogaB="";
		$interrogaTOT="";
		foreach($keyA as $valore){
			//concateno la prima variabile
			$interrogaA.= " ".$urlA." LIKE '%".trim($valore)."%' AND";
		}
		/*esempio:
		se $urlA contiene cognome e $keyA pinco, pallino
		al termine del forech la stringa $interrogaA conterrà
		 cognome LIKE '%pinco%' AND cognome LIKE '%pallino%' AND
		 analogamente faccio per $interrogaB
		*/
		foreach($keyB as $valore){
			//concateno la prima variabile
			$interrogaB.= " ".$urlB." LIKE '%".trim($valore)."%' AND";
		}
		//da $interrogaB devo toglere l'ultimo AND altrimenti mi da errore
		//elimino gli ultimi 3 caratteri corrispondenti a AND
		$interrogaB=substr($interrogaB, 0,-3);
		//concateno le due stringhe per ottenere i vari like
		$interrogaTOT =$interrogaA.$interrogaB;
		//e genero la query stringa
		$query="SELECT * FROM persone WHERE ".$interrogaTOT;
		//qui metto un echo per verificare la sringa, poi la togli
		echo $query."<br>";
		//non metto mysql_query($query); perche non ho implementato il db
		//qui la visualizzazione della ricerca
	}else{//i campi sono vuoti
		echo "devi selezionare/scrivere tutti i campi";
	}//fine if vuoti
}//fine if cerca
?>

<form method="post" action="cerca_1.php">
<select name="urlA">
<option value="" selected> 
<option value="cognome">Cognome
<option value="arcocronos">Arco Cronologico
<option value="attivita">Attività
</select><br>
<input type=text maxlength=30 size=15 name="chiaveA"><br /><br />
<select name="urlB">
<option value="" selected> 
<option value="arcocronos">Arco Cronologico
<option value="provenienza">Provenienza
<option value="attivita">Attività
<option value="residenza">Residenza
<option value="beni">Beni o Proprietà
<option value="ordine">Ordine
</select><br>
<input type=text maxlength=30 size=15 name="chiaveB"><br /><br />
<!--metti il name al submit -->
<input type="submit" value="cerca" name="cerca"> 
</form>
p.s.
i commenti che ho messo dovrebbero essere sufficienti per capire
prova e sappimi dire
 
Ci sono!!!! Posto il codice che funziona, ma c'è ancora un problemino...

Sono a questo punto:

PHP:
//Creo due array con tutte le parole chiave dei campi 
$keyA=explode(",",$_POST['chiaveA']);
$keyB=explode(",",$_POST['chiaveB']);

//analizzo i termini
reset ($keyA); 
reset ($keyB); 
list(,$parolaA) = each ($keyA);  
$parolaA = trim($parolaA); 
list(,$parolaB) = each ($keyB); 
$parolaB = trim($parolaB); 

$query2 = "SELECT * FROM persone WHERE persone.".$_POST['urlA']." LIKE '%$parolaA%' AND persone.".$_POST['urlB']." LIKE '%$parolaB%' ORDER BY cognome";
$result2 = mysql_query($query2, $db)
or die( "Errore: " . mysql_error() );

Ora il problema è su un value (attivita) che nel db ha 15 campi così nominati:
attività1
attività2
attività3
...
...
attività15

Come faccio a dirgli che se il value dell'urlA o dell'urlB è attivita di considerare per la ricerca i campi del db suddetti??

grazie!
 
ciao,
ti do un'idea di massima, io ho messo tutto in una pagina, però
tu puoi dividerla.
comunque (sembra) che funzi

PHP:
<?php
//variabili ci connessione

if(isset($_POST['cerca']) && $_POST['cerca']=="cerca"){//se ho dato il submit
	if($_POST['urlA'] !="" || $_POST['urlB'] !="" || trim($_POST['chiaveA']) !="" || trim($_POST['chiaveB'])){//se i campi non vuoti
		//chiavi da ricercare divisa da virgole 
		//sarebbe opportuno verificare che esistato virgole
		// es. in chiaveA potrei scrivere solo PINCO
		//facciamo finta che comunque siano scritti giusti
		$urlA=$_POST['urlA'];
		$urlB=$_POST['urlB'];
		$keyA = explode (",", $_POST['chiaveA']);
		$keyB = explode (",", $_POST['chiaveB']);
		$interrogaA="";//metto a vuote due variabili che mi serviranno
		$interrogaB="";
		$interrogaTOT="";
		foreach($keyA as $valore){
			//concateno la prima variabile
			$interrogaA.= " ".$urlA." LIKE '%".trim($valore)."%' AND";
		}
		/*esempio:
		se $urlA contiene cognome e $keyA pinco, pallino
		al termine del forech la stringa $interrogaA conterrà
		 cognome LIKE '%pinco%' AND cognome LIKE '%pallino%' AND
		 analogamente faccio per $interrogaB
		*/
		foreach($keyB as $valore){
			//concateno la prima variabile
			$interrogaB.= " ".$urlB." LIKE '%".trim($valore)."%' AND";
		}
		//da $interrogaB devo toglere l'ultimo AND altrimenti mi da errore
		//elimino gli ultimi 3 caratteri corrispondenti a AND
		$interrogaB=substr($interrogaB, 0,-3);
		//concateno le due stringhe per ottenere i vari like
		$interrogaTOT =$interrogaA.$interrogaB;
		//e genero la query stringa
		$query="SELECT * FROM persone WHERE ".$interrogaTOT;
		//qui metto un echo per verificare la sringa, poi la togli
		echo $query."<br>";
		//non metto mysql_query($query); perche non ho implementato il db
		//qui la visualizzazione della ricerca
	}else{//i campi sono vuoti
		echo "devi selezionare/scrivere tutti i campi";
	}//fine if vuoti
}//fine if cerca
?>

<form method="post" action="cerca_1.php">
<select name="urlA">
<option value="" selected> 
<option value="cognome">Cognome
<option value="arcocronos">Arco Cronologico
<option value="attivita">Attività
</select><br>
<input type=text maxlength=30 size=15 name="chiaveA"><br /><br />
<select name="urlB">
<option value="" selected> 
<option value="arcocronos">Arco Cronologico
<option value="provenienza">Provenienza
<option value="attivita">Attività
<option value="residenza">Residenza
<option value="beni">Beni o Proprietà
<option value="ordine">Ordine
</select><br>
<input type=text maxlength=30 size=15 name="chiaveB"><br /><br />
<!--metti il name al submit -->
<input type="submit" value="cerca" name="cerca"> 
</form>
p.s.
i commenti che ho messo dovrebbero essere sufficienti per capire
prova e sappimi dire





nn avevo visto che avevi postato!!
ora controllo e ti dico!
grazie
 
ciao, forse era più semplice di quello che pensavo (se funzia)
sostituisci la parte relativa al concatenamento di $interrogaB con

PHP:
if($urlB != "attivita"){//non è attività
			foreach($keyB as $valore){
				//concateno la prima variabile
				$interrogaB.= " ".$urlB." LIKE '%".trim($valore)."%' AND";
			}//fine foreach
		}else{
			for($k=1;$k<=15;$k++){
				foreach($keyB as $valore){
					//concateno la prima variabile mettendo anche il numero da 1 a 15
					//dovrebbe risultare attivita1 LIKE.....attivita2 LIKE ......
					$interrogaB.= " ".$urlB.$k." LIKE '%".trim($valore)."%' AND";
				}//fine foreach
			}//fine for
		}//fine if attivita
 
ho provato la tua soluzione e ammetto di aver trovato diverse difficoltà.
alla fine sto optando per la soluzione che ho postato in contemporanea a te e nel contempo sto cercando una soluzione per il value attivita e i relativi 15 campi corrispondenti nel db.

Inizialmente pensavo a una cosa del tipo:
PHP:
if($_POST['urlA'] == 'attivita' || $_POST['urlB'] == 'attivita') {
$urlAB = "persone.attività1 OR persone.attività2 OR persone.attività3 OR persone.attività4 OR persone.attività5 OR persone.attività6 OR persone.attività7 OR persone.attività8 OR persone.attività9 OR persone.attività10 OR persone.attività11 OR persone.attività12 OR persone.attività13 OR persone.attività14 OR persone.attività15";
}

$query = "SELECT * FROM persone WHERE ((persone.".$_POST['urlA']." OR persone.".$urlAB.") LIKE '%$parolaA%') AND ((persone.".$_POST['urlB']." OR persone.".$urlAB.") LIKE '%$parolaB%') ORDER BY cognome";

ma è una ca....ta!!
 
ciao
penso che tu ci abbia gia pensato, ma un piccolo suggerimento

quando fai le perove subito dopo

$query = "SELECT * FROM persone WHERE......................

metti o
var_dump($query);
o
echo $query;

commentando il mysql_query, in modo da vedere se la querystringa è quella che vorresti tu
 
metti o
var_dump($query);
o
echo $query;

grazie per la segnalazione :)

ho provato in questo modo:

all'inizio ho inserito questo controllo
PHP:
if(($_POST['urlA'] == 'attivita') || ($_POST['urlB'] == 'attivita')) {
include "cercapr3.php";
}

vede se il value selezionato in urlA o in urlB è attivita allora include lo script seguente

PHP:
//Creo un array con tutte le parole chiave di entrambi i campi 
$keyA=explode(",",$_POST['chiaveA']);
$keyB=explode(",",$_POST['chiaveB']);

//analizzo i termini
reset ($keyA); 
reset ($keyB); 
list(,$parolaA) = each ($keyA);  
$parolaA = trim($parolaA); 
list(,$parolaB) = each ($keyB); 
$parolaB = trim($parolaB); 

//conteggio lettere
$lunghezzaA = strlen($parolaA);
$lunghezzaB = strlen($parolaB);

//Alert LUNGHEZZA minima
if ($lunghezzaA <3 || $lunghezzaB <3) {
echo "I criteri di ricerca non sono stati rispettati.<br><br>
Ricorda che devi immettere almeno una parola con un minimo di <span class=\"testoBold\">3 lettere</span><br><br>";
} else {

if($_POST['urlA'] == 'attivita') {
$query1 .= "(persone.attività1 LIKE '%$parolaA%' OR persone.attività2 LIKE '%$parolaA%' OR persone.attività3 LIKE '%$parolaA%' OR persone.attività4 LIKE '%$parolaA%' OR persone.attività5 LIKE '%$parolaA%' OR persone.attività6 LIKE '%$parolaA%' OR persone.attività7 LIKE '%$parolaA%' OR persone.attività8 LIKE '%$parolaA%' OR persone.attività9 LIKE '%$parolaA%' OR persone.attività10 LIKE '%$parolaA%' OR persone.attività11 LIKE '%$parolaA%' OR persone.attività12 LIKE '%$parolaA%' OR persone.attività13 LIKE '%$parolAa%' OR persone.attività14 LIKE '%$parolaA%' OR persone.attività15 LIKE '%$parolaA%') AND persone.".$_POST['urlB']." LIKE '%$parolaB%'";
}
$query1 .= "0";
$query1 = "SELECT * FROM persone WHERE " . $query1;
var_dump($query1);
$result1 = mysql_query($query1, $db)
or die( "Errore: " . mysql_error() );
...
...

il risultato è una pagina vuota!!
anche richiedendo un var_dump:eek:
perchè???
 
ciao
se ti da una pagina vuota probailmente il var_dump non viene eseguito
metti i vari var_dump sparsi a pioggia in modo da cercare di seguire le strade che percorre lo script in funzione dei vari input
 

Discussioni simili