[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 :)
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
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)
 

windtalk

Nuovo Utente
27 Gen 2010
10
0
0
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!!
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
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
 

windtalk

Nuovo Utente
27 Gen 2010
10
0
0
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!
 

windtalk

Nuovo Utente
27 Gen 2010
10
0
0
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
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
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
 

windtalk

Nuovo Utente
27 Gen 2010
10
0
0
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!!
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
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
 

windtalk

Nuovo Utente
27 Gen 2010
10
0
0
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è???
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
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
Autore Titolo Forum Risposte Data
Emix [PHP][MYSQL] Ricerca avanzata tramite form PHP 6
MarcoGrazia [PDO][PHP[MySQL] Piccolo modulo di ricerca in un sito tramite l'operatore LIKE Snippet PHP 1
R Barra ricerca php e mysql PHP 0
R Ricerca Email in database mysql con php PHP 2
G Visualizzazion modulo di ricerca in PHP e MySql PHP 0
F Ricerca avanzata PHP & MySQL PHP 4
P Codifica caratteri speciali mysql php PHP 0
F Applicazione PHP/MySQL per prenotazioni: limitare il numero massimo di posti prenotabili PHP 20
L tipo boolean non funzionante su mariadb (mysql). E codice php 7.4. PHP 0
M PHP/MySQL - Estrarre valori min e max di ogni gruppo PHP 5
F Ricreare struttura php+mysql su Xampp Apache 0
M Array associativi php su 2 campi mysql PHP 10
L php mysql non salva solo id PHP 21
L php mysql cerca e visualizza pagina PHP 0
R Aggiornare record mysql con Ajax, jQuery e php Ajax 2
Z MySql injection PHP PHP 1
D problema php mysql PHP 1
D problema php mysql PHP 1
L Google chart php mysql PHP 2
L Aiuto per programma web php/mySQL PHP 2
S Problemi delle funzioni eliminate con PHP e MySQL PHP 4
C Aiuto compiuto scuola PHP/MySQL PHP 2
G Problema caricamento tabelle MySql da PhP PHP 0
L update tabelle in php mysql [risolto] PHP 6
F Passare una variabile php dal DB mysql alla pagina PHP 3
B Fare calcoli con php da tabella mysql PHP 2
D [MySQL] [PHP] SQL andare da capo MySQL 0
P [OFFRO] Realizzazione siti web in PHP/MYSQL, responsive e Ottimizzati SEO Offerte e Richieste di Lavoro e/o Collaborazione 0
Tommy03 Firebase o PHP+Mysql? Sviluppo app per Android 0
pjtertdj Visualizzazione dati in php da mysql con funzione matematica in javascript PHP 1
E Cerco programmatore PHP/Mysql - retribuito Offerte e Richieste di Lavoro e/o Collaborazione 0
K [RISOLTO] Problema Griglia Php+Mysql PHP 13
Z Gestionale in Php/mysql: Quanto farsi pagare? Aiuto! Discussioni Varie 0
E Inserimento dati da PHP in tabella MySQL PHP 5
R radio input php mysql PHP 2
E Caricare dati da DB MySql all'apertura pagina, meglio PHP o Javascript? PHP 1
giusebos [retribuito] Cercasi programmatore PHP/MySql Offerte e Richieste di Lavoro e/o Collaborazione 1
N Apache + MySQL + PHP MacOs Mojave Web Server 0
T PHP+MYSQL: problema con quelle maledette lettere accentate... PHP 5
K [PHP + MYSQL ] Inserimento dati in database da form dinamico PHP 13
M [PHP] Metodo migliore per fare login a un DB Mysql PHP 1
gandalf1959 problema con la codifica caratteri accentati e speciali tra php e mysql PHP 3
webmachine [PHP][MYSQL] Problema con le SELECT PHP 5
V Creare tabella mysql con php non funziona PHP 1
W Area riservata sicura PHP MySQL PHP 12
G php salvare file in campo blob mysql: massimo 4MB PHP 1
xone [Vendo] Gestionale Magazzino PHP-MYSQL Altri Annunci 0
M Stampare con php e mysql PHP 8
P Importazione dati da file xml in db mysql con php PHP 17
xone [Vendo] Script gestionale php-mysql gestione pratiche Altri Annunci 0

Discussioni simili