[PHP & MySQL]Query con funzioni matematiche

lughino

Nuovo Utente
23 Mar 2010
24
0
0
Ciao a tutti,
ho un piccolo problema di comprensione...
ho questa form che contiene questa select:
Codice:
Prezzo<select name="prez"> <option value="">Qualsiasi</option> 
<option value="fino100000">Fino a 100.000€</option> 
<option value="+100000">Da 100.000€ a 200.000€</option> 
<option value="oltre200000">Oltre 200.000€</option> 
</select><br />
Per filtrare i dati dal db del campo prezzo avevo fatto questo:
Codice:
$query_ricerca= "SELECT Immobili.Tipo, Immobili.Comune, Immobili.Acquisto, Immobili.Prezzo, Immobili.Data_ins, Immobili.Descrizione, Immobili.ID, Immagini.Id_Immobili, Immagini.Percorso, Immagini.Flag FROM Immobili JOIN Immagini ON Immobili.ID = Immagini.Id_Immobili ";

if($_GET['tipo'] != ''){ 
        $query_ricerca .= 'WHERE Immobili.Tipo LIKE %'. $tipo .'% AND '; 
} 
if($_GET['c'] != ''){ 
        $query_ricerca .= 'WHERE Immobili.Acquisto LIKE %'.$_GET['c'].'% AND '; 
} 
if($_GET['prez'] != ''){ 
    if($_GET['prez'] == "fino100000") { 
        $query_ricerca .= 'WHERE Immobili.Prezzo <= 100000 AND '; 
    } 
    elseif($_GET['prez'] == "+100000") { 
        $query_ricerca .= 'WHERE Immobili.Prezzo > 100000 Immobili.Prezzo AND >= 200000 AND '; 
    } 
} 
$sql = substr($query_ricerca,0,strlen($query_ricerca)-4);
Solo che ovviamente non funziona.
Mi restituisce un errore di sintassi sql.
Volevo chiedere, come faccio a filtrare i dati secondo un range di prezzi?
Poi mi è sorto anche un altro dubbio, se nella form non seleziono nulla dovrei visualizzare tutto, ma non mi visualizza nulla, nemmeno un errore.
Non so come fare per omettere
Codice:
$sql = substr($query_ricerca,0,strlen($query_ricerca)-4);
se non seleziono nulla.
Grazie a tutti
 
ciao
intanto ti nom mi sembra che il concatenemento che fai sia giusto
esempio: se $_GET['tipo'] e $_GET['c'] sono entrambi pieni ti risulta,

$query_ricerca= "SELECT ......... WHERE Immobili.Tipo..... AND WHERE Immobili.Acquisto...AND...SELECT ......... WHERE Immobili.Tipo..... AND WHERE Immobili.Acquisto...AND..."
mentre la query corretta sarebbe
$query_ricerca= "SELECT ......... WHERE Immobili.Tipo..... AND Immobili.Acquisto..."
se concateni anche il prezzo la query diventa addirittura tripla di select (per questo credo che ti dia errore di sintassi sql)

secondo me dovresti cambiare tutto la logica


p.s.
ci penso un momento, poi eventualmente ti so dire (ma forse non prima di pasqua)
 
ciao,
sono arrivato prima

PHP:
<?php
$query_ricerca= "SELECT Immobili.Tipo, Immobili.Comune, Immobili.Acquisto, Immobili.Prezzo, Immobili.Data_ins, Immobili.Descrizione, Immobili.ID, Immagini.Id_Immobili, Immagini.Percorso, Immagini.Flag FROM Immobili JOIN Immagini ON Immobili.ID = Immagini.Id_Immobili ";

//metti vuota la variabile
$were="";
if($_GET['tipo'] != ""){ 
	$were= "WHERE Immobili.Tipo LIKE %'". $_GET['tipo']."'% "; 
} //fine if tipo
if($_GET['c'] != ''){
	if($were ==""){
		$were= "WHERE Immobili.Acquisto LIKE %'".$_GET['c']."'%";
	}else{
		$were .= " AND  Immobili.Acquisto LIKE %'".$_GET['c']."'%";
	}//fine if-else were vuota
} // fine if acquisto
if($_GET['prez'] == "fino100000") {
	if($were ==""){
        $were= "WHERE Immobili.Prezzo <= 100000 ";
	}else{
		$were .= " AND Immobili.Prezzo <= 100000 ";
	}
}elseif($_GET['prez'] == "+100000") {
	if($were ==""){
		//guarda che hai messo entrambi con segno maggiore se le vuoi compresi
        $were= "WHERE Immobili.Prezzo > 100000 AND Immobili.Prezzo <=200000";
	}else{
		$were .= " AND Immobili.Prezzo > 100000  AND Immobili.Prezzo <=200000";
	}
}elseif($_GET['prez'] == "oltre200000"){
	if($were ==""){
		//guarda che hai messo entrambi con segno maggiore se le vuoi compresi
        $were= "WHERE Immobili.Prezzo > 200000";
	}else{
		$were .= " AND Immobili.Prezzo > 200000";
	}
}//fine selezione prezzi
//a questo punto generi la query stringa
//neza bisogno di altro (la manda a capo per questione di visibilità)
$query_ricerca = "SELECT Immobili.Tipo, Immobili.Comune, Immobili.Acquisto, Immobili.Prezzo, Immobili.Data_ins,
 Immobili.Descrizione, Immobili.ID, Immagini.Id_Immobili, Immagini.Percorso, Immagini.Flag FROM Immobili 
 JOIN Immagini ON Immobili.ID = Immagini.Id_Immobili ".$were; 
//prima di usare il db verifica la query con un bel var_dump
// per vedere se viene fuori come vuoi tu
var_dump($query_ricerca);//poi lo togli
?>

prova, al massimo non funzia come la tua
 
Ultima modifica di un moderatore:
la soluzione proposta da borgo non dovrebbe fare una grinza, ti consiglio soltanto, per sicurezza, di filtrare i dati inviati tramite GET
 
Ciao, e grazie mille per le risposte.
Volevo solo fare una domanda riguardo i filtrare i dati:
io uso questo:
Codice:
if (get_magic_quotes_gpc()) 
{ 
    $tipo = stripslashes($tipo); 
} 
$tipo = mysql_real_escape_string($tipo);

è giusto oppure devo fare l'inverso?
Codice:
if (!get_magic_quote_gpc())
{
  $tipo = addslashes($tipo);
}

Ci sono altri filtri che posso applicare?
EDIT: Ho provato a non selezionare nessun campo e non mi restituisce alcun record..
Sapete come mai?

Grazie ciao
 
Ultima modifica:
Io solitamente, al momento dell'inserimento dei dati, mi avvalgo della funzione addslashes() così:
PHP:
<?php
$var = "Questa variabile sarebbe un po' pericolosa.";

if(!get_magic_quotes_gpc())
	$var = addslashes($var);

echo $var;
?>
E' inutile chiamare anche mysql_real_escape_string(), dopo...
 
ciao
alex (speedy gonzales) mi ha preceduto, però ti richedo una cosa:
da dove provengano tutti quei get?
nella pagina che chiama quella che hai postato hai qualcosa del tipo
<a href="pagina.php?tipo=pinco&c=pallo&prez=caio">xyz</a>
anche perchè non mi sembra, tu nel primo post parli di select, quindi devi avere un form (o qualche js che lo simula), allora metti action="post" e preleva i dati con $_POST è più sicuro

dimenticavo per alex:
se scrivessi $var = "Questa variabile sarebbe un pò pericolosa."; ci sarebbero meno pericoli
 
Ultima modifica:
Ciao,
in effetti chiedo scusa, ma non ho postato la form iniziale (che tra l'altro è una prova, perchè ci vorrei inserire un js):
Codice:
<form action="risultato.php" method="get">
Ricerca immobile:<br />
Tipo      <select name="tipo"> <option value="">Selezionane uno:
</option>
<option value="Appartamento">Appartamento</option>
<option value="Villa">Villa</option>
<option value="Cascina">Cascina</option>
<option value="Capannone">Capannone</option>
</select><br />
Contratto<select name="c"> <option value="">Qualsiasi</option>
<option value="Vendita">Vendita</option>
<option value="Affitto">Affitto</option>
</select><br />
Prezzo<select name="p"> <option value="">Qualsiasi</option>
<option value="fino100000">Fino a 100.000€</option>
<option value="+100000">Da 100.000€ a 200.000€</option>
<option value="oltre200000">Oltre 200.000€</option>
</select><br />
Superficie<select name="sup"> <option value="">Qualsiasi</option>
<option value="50">Fino a 50 mq</option>
<option value="80">Da 50 a 80 mq</option>
<option value="150">Da 80 a 150 mq</option>
<option value="+150">Oltre 150 mq</option>
</select><br />
Camere<select name="cam"> <option value="">Qualsiasi</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="+3">Più di 3</option>
</select><br />
Terrazza<select name="t"> <option value="">Qualsiasi</option>
<option value="tsi">Si</option>
<option value="tno">No</option>
</select><br />
Giardino<select name="t"> <option value="">Qualsiasi</option>
<option value="500">Fino a 500 mq</option>
<option value="+500">Oltre 500 mq</option>
</select><br />
<input type="hidden" name="Inviato" value="true" /> 
<input type="submit" name="Invia" value="Invia!">
</form>
in realtà sono legato al GET poichè ho anche questa funzione per la visualizzazione delle pagine disponibili:
Codice:
unction pagination_4($total_pages,$page){

    global $webpage;
    global $tipo;
    $pagination="";

        if($total_pages!=1){

       //Impostiamo il numero massimo di elementi visualizzabili all'apertura della pagina, in questo caso 20;

        $max = 20;

        //Usiamo questa variabile nel cilco for piu sotto;

        $max_links = $max+1;
        $h=1;

            //Se la pagina è > di $max_links

        if($page>$max_links){

            //Facciamo partire il nostro loop

            $h=(($h+$page)-$max_links);
        }

          //Se la pagina non è l'unica

        if($page>=1){

                //estendiamo il nosto range di link visualizzabili

            $max_links = $max_links+($page-1);
        }

            //Se il numero massimo di link visualizzabili, supera il numero totale delle pagine, allora il numero di links è =numero totale di pagine

        if($max_links>$total_pages){
            $max_links=$total_pages+1;
        }

            //Creiamo i link prima e prev
	$pg = "";
        if($page>1){
		$pagination.="<div id=\"footer\"><a href=". $webpage ."?page=". ($page-1) . ">Prev</a></div>";
        }

            //Creiamo le pagine linkate

        for ($i=$h;$i<$max_links;$i++){
            if($i==$page){
                $pagination.="<div id=\"footer\"><a>".$i."</a></div>";
            }
            else{
                $pagination.="<div id=\"footer\"><a href=".$webpage."?tipo=" . $tipo . "&amp;page=".$i.">".$i."</a></div>";
            }
        }

            //Creiamo i link Next buttons

        if(($page >="1")&&($page!=$total_pages)){
            $pagination.="<div id=\"footer\"><a href=".$webpage."?tipo=" . $tipo . "&amp;page=".($page+1).">Next</a></div>";
        }
    }

    //if one page of results

    else{
        $pagination.="";
    }
    
    return($pagination);
}
Difatti proprio ora sto impazzendo perchè ai link delle pagine devo annidare tutti gli if seguendo la logica sul quale hai basato la query.
(o almeno penso che così riesco a risolvere il problema).
 
Allora per la visualizzazione delle pagine ho modificato la funzione così
PHP:
	$pg = "";
        if($page>1){
		if($tipo != ""){
			if($pg == ""){
				$pg = "&amp;tipo=". $tipo;
			} else {
				$pg .= "&amp;tipo=". $tipo;
			}
		} 
		elseif($acquisto != ""){
			if($pg == ""){
				$pg = "&amp;c=". $acquisto;
			} else {
				$pg .= "&amp;c=". $acquisto;
			}
		}
		elseif($prezzo != "") {
			if($pg == ""){
				$pg = "&amp;p=". $prezzo;
			} else {
				$pg .= "&amp;p=". $prezzo;
			}
		}
		$pagination.="<div id=\"footer\"><a href=". $webpage ."?page=". ($page-1) . $pg .">Prev</a></div>";
        }

            //Creiamo le pagine linkate

        for ($i=$h;$i<$max_links;$i++){
            if($i==$page){
                $pagination.="<div id=\"footer\"><a>".$i."</a></div>";
            }
            else{
		if($tipo != ""){
			if($pg == ""){
				$pg = "&amp;tipo=". $tipo;
			} else {
				$pg .= "&amp;tipo=". $tipo;
			}
		} 
		elseif($acquisto != ""){
			if($pg == ""){
				$pg = "&amp;c=". $acquisto;
			} else {
				$pg .= "&amp;c=". $acquisto;
			}
		}
		elseif($prezzo != "") {
			if($pg == ""){
				$pg = "&amp;p=". $prezzo;
			} else {
				$pg .= "&amp;p=". $prezzo;
			}
		}
                $pagination.="<div id=\"footer\"><a href=".$webpage."?page=".$i.">". $i . $pg ."</a></div>";
            }
        }

            //Creiamo i link Next buttons

        if(($page >="1")&&($page!=$total_pages)){
		 if($tipo != ""){
			if($pg == ""){
				$pg = "&amp;tipo=". $tipo;
			} else {
				$pg .= "&amp;tipo=". $tipo;
			}
		} 
		elseif($acquisto != ""){
			if($pg == ""){
				$pg = "&amp;c=". $acquisto;
			} else {
				$pg .= "&amp;c=". $acquisto;
			}
		}
		elseif($prezzo != "") {
			if($pg == ""){
				$pg = "&amp;p=". $prezzo;
			} else {
				$pg .= "&amp;p=". $prezzo;
			}
		}
            $pagination.="<div id=\"footer\"><a href=".$webpage."?page=". ($page+1) . $pg .">Next</a></div>";
        }
    }

Ma ovviamente c'è sempre qualcosa che non va...
il link "Prev" va bene.
il link "Next" mi raddoppia le variabili passate, ad esempio se seleziono solo "Appartamento", mi ritrovo nel link "&tipo=Appartamento&tipo=Appartamento".
Poi se vado a pagina 2, il link della pagina 1 mi fa la stessa del link "Next".
Questa non la capisco proprio...
 
ciao,
guarda che non c'entra nulla nella stessa pagine possono convire diversi tipi di superglobali ($_POST, $_GET, $_SESSION....), non vedo la ragion per cui tu non possa mettere method="post"
tra l'altro provenendo tutti i post da valori predefiniti (select) fai meno fatica (e c'è meno bisogno) di filtrarli
 
ciao,
guarda che non c'entra nulla nella stessa pagine possono convire diversi tipi di superglobali ($_POST, $_GET, $_SESSION....), non vedo la ragion per cui tu non possa mettere method="post"
tra l'altro provenendo tutti i post da valori predefiniti (select) fai meno fatica (e c'è meno bisogno) di filtrarli

Scusa l'ignoranza, ma però allora non capisco come fare per lavorare con la funzione della creazione delle pagine...
 
Ciao a tutti,
secondo il consiglio di Borgo ho cambiato la form da GET a POST, ma ho mantenuto la funzione per la paginazione dei record via GET, così:
PHP:
function pagination_4($total_pages,$page){

    global $webpage;
    $pagination="";

        if($total_pages!=1){

       //Impostiamo il numero massimo di elementi visualizzabili all'apertura della pagina, in questo caso 20;

        $max = 20;

        //Usiamo questa variabile nel cilco for piu sotto;

        $max_links = $max+1;
        $h=1;

            //Se la pagina è > di $max_links

        if($page>$max_links){

            //Facciamo partire il nostro loop

            $h=(($h+$page)-$max_links);
        }

          //Se la pagina non è l'unica

        if($page>=1){

                //estendiamo il nosto range di link visualizzabili

            $max_links = $max_links+($page-1);
        }

            //Se il numero massimo di link visualizzabili, supera il numero totale delle pagine, allora il numero di links è =numero totale di pagine

        if($max_links>$total_pages){
            $max_links=$total_pages+1;
        }

            //Creiamo i link prima e prev
        if($page>1){
		$pagination.="<div id=\"footer\"><a href=". $webpage ."?page=". ($page-1) . ">Prev</a></div>";
        }

            //Creiamo le pagine linkate

        for ($i=$h;$i<$max_links;$i++){
            if($i==$page){
                $pagination.="<div id=\"footer\"><a>".$i."</a></div>";
            }
            else{
		$pagination.="<div id=\"footer\"><a href=". $webpage ."?page=". $i .">". $i . "</a></div>";
            }
        }

            //Creiamo i link Next buttons

        if(($page >="1")&&($page!=$total_pages)){

	    $pagination.="<div id=\"footer\"><a href=".$webpage."?page=". ($page+1) .">Next</a></div>";
        }
    }

    //if one page of results

    else{
        $pagination.="";
    }
    
    return($pagination);
}
Solo che ora, quando clicco su pagina 2, mi restituisce la pagina senza record; immagino che, avendo passato i valori tramite post, li perda andando sulla pagina successiva.
Dove sbaglio?
Grazie a tutti per la pazienza.
Ciao
 

Discussioni simili