Problema ricerca con piu campi in php

  • Creatore Discussione Creatore Discussione krat0s89
  • Data di inizio Data di inizio

krat0s89

Nuovo Utente
2 Giu 2012
3
0
0
Salve! premetto che sono nuovo al linguaggio php :D
Ho realizzato un pannello di amministrazione in php che carica dei campi (in qsto caso veicoli) dal db e li mette in una pagina dove e possibile controllarli eliminarli modificarli ecc.. ora però mi sono accorto di un piccolo (non tanto-.-) problema che riguarda la ricerca avanzata, che mi permette di filtrare i veicoli a seconda di quello che inserisco nei campi di ricerca. I campi di ricerca sono i seguenti Tipo: che puo essere Tutti, Nuovo o usato, Categorie: Tutti, autocarri, auto, ecc.. e un campo di testo dove posso inserire la marca. Il problema è che qndo seleziono nel campo tipo: Tutti , categoria: autocarri (o altre) e inserisco la marca mi dà un errore su due variabile $x, $y (lui dice non sono definite-.-) che io uso come appoggio e di conseguenza non mi completa correttamente la query creandomi una query del tipo: SELECT * FROM tabella WHERE categoria='autocarri' marca='Volvo' order by id desc limit 0, 12 mancando un AND e causandomi errori a nn finire xd

PHP:
$query2 = "SELECT COUNT(id) AS totale FROM veicoli ";
            $query = "SELECT * FROM veicoli ";
            if(isset($_POST['cerca_tipo']) or isset($_POST['cerca_categoria']) or isset($_POST['marca'])){
                $x;
                $y;
                if($_POST['cerca_tipo']=="tutti" && $_POST['cerca_categoria']=="tutti" && $_POST['cerca']==NULL){
                    } else {
                $query.="WHERE";
                $query2.="WHERE";
                    }
            if($_POST['cerca_tipo']!="tutti"){
                $query.=" tipo ='".$_POST['cerca_tipo']."' ";
                $query2.=" tipo ='".$_POST['cerca_tipo']."' ";
                $x="1";
                }
            if($_POST['cerca_categoria']!="tutti"){
                if($x=="1"){
                    $query.=" AND ";
                    $query2.=" AND ";
                    $y="1";
                    }
                $query.=" categoria='".$_POST['cerca_categoria']."'";
                $query2.=" categoria='".$_POST['cerca_categoria']."'";
                }
            if($_POST['cerca']!=NULL){
                if($y=="1"){
                    $query.=" AND ";
                    $query2.=" AND ";
                    }
                $query.=" marca='".$_POST['cerca']."'";
                $query2.=" marca='".$_POST['cerca']."'";
                }
 
ciao
prova in questa maniera
PHP:
<?php
/*scrvere la select (es)
SELECT * FROM tabella WHERE 1=1
o
SELECT * FROM tabella
è identico in quanto uno sarà sempre uguale a uno
però poi è più comodo per aggiungere le altre condizioni
*/
$query2 = "SELECT COUNT(id) AS totale FROM veicoli WHERE 1=1 ";
$query = "SELECT * FROM veicoli WHERE 1=1 ";
if(isset($_POST['cerca_tipo']) or isset($_POST['cerca_categoria']) or isset($_POST['marca'])){
	if($_POST['cerca_tipo']!="tutti"){
		$query.="AND tipo ='".$_POST['cerca_tipo']."' ";
		$query2.="AND tipo ='".$_POST['cerca_tipo']."' ";
	}
	if($_POST['cerca_categoria']!="tutti"){
		$query.="AND categoria='".$_POST['cerca_categoria']."' ";
		$query2.="AND categoria='".$_POST['cerca_categoria']."' ";
	}
	if($_POST['cerca']!=""){//perchè cerca e non marca?
		$query.="AND marca='".$_POST['cerca']."' ";//perchè cerca e non marca?
		$query2.="AND marca='".$_POST['cerca']."' ";
	}
	$query.="ORDER BY id DESC LIMIT 0, 12";
	$query2.="ORDER BY id DESC LIMIT 0, 12";
}
//qui prima dell' mysql_query verifichi se le due querry vengono scritte come deve
var_dump($query);//poi quando tutto funzia li togli
var_dump($query2);
?>

p.s.
quarda che però inserire i vari $_POST senza farne un controllo preventivo puoi avere grane se ualche maleintenzionato inserisce qualcosa che non dovrebbe

dimenticavo:
guarda che (salvo abbia capito male) non dovrebbe servirti la prima query
per sapere quanti veicoli hai basta

PHP:
$numero_veicoli=mysql_num_rows($ris_della_query2);// o come ha chiamato il risultato di mysql_query
 
weee borgo grandissimo !! grazie mille!! mi sono informato riguardo la protezione dei dati :mavieni: e sul mysql_real_escape_string() volevo chiederti posso fare una cosa del genere o c'e sempre il pericolo di un injection:
PHP:
$query = "select * from tabella where nick='".mysql_real_escape_string($_POST['nick'])."' and password='".mysql_real_escape_string($_POST['password'])."'";
:ilpirata:
ancora grazie!! :cool:
 
ciao
la verifica dei dati provenienti da un form oserei dire che è una cosa indispensabile sia che li utilizzi per inviare una email e, soprattutto, se devono servirti per un database.
in particolare si deve controllare che
1. siano inviati dei dati (soprattutto se questi sono obbligatori)
2. che i dati inviati siano corretti e non contengano qualcosa di nocivo
3. le password da inserire nel db devono essere inserite codificate o con md5 o, meglio, con sah1
ti faccio un paio di esempi:
PHP:
<?php
$nome=$_POST['nome'];//scrivo il post solo qui negli altri uso solo il nome della variabile
$nome=addslashes(trim($nome));//con trim evito che uno inputi solo spazi can add aggiungo \ es all'apostrofo
if(preg_match('/^[a-zA-Z]/', $nome)){//verifico che siano solo caratteri alfabetici minuscoli o maiuscoli
	echo "corretto"; //fai quello che devi fare
}else{
	echo "NON corretto";//qui es. rimandi al form
}
//quello sopra si può usare per tutte le varibili alfabetiche o alfanumeriche eventaulmente modificando il pattern di controllo
$email=addslashes(trim($email));
if(filter_var($email, FILTER_VALIDATE_EMAIL)){
	echo "indirizzo corretto";
}else{
	echo "indirizzo NON corretto";
}

if(preg_match('/^[a-zA-Z0-9]/', $password)){//verifico che siano solo caratteri alfanumerici minuscoli o maiuscoli
	echo "corretta"; //corretta quindi codifico
	$password=sha1($password); e poi la salvo nel db
}else{
	echo "NON corretta";//qui es. rimandi al form
}
?>
guarda però che sono solo esempi, il modo di procedere può essere diverso, ma il concetto della verifica/controllo rimane
spero di essere stato chiaro, eventualmente posta, ricordati però "un problema una discussione" per facilitare eventuali ricerche ad altri utenti interessati
 

Discussioni simili