Query diversa a seconda del $_GET

  • Creatore Discussione Creatore Discussione skoien
  • Data di inizio Data di inizio

skoien

Nuovo Utente
30 Nov 2013
10
0
0
VA
Ragazzi eccomi qui...cerco disperatamente un aiuto per quanto riguarda una pagina che sto creando...
La pagina contiene un form con due campi select (tipologia,regione). I campi select dispongono della funzione onchange.

In soldoni:
.se nella select seleziono "Cani" viene eseguita la query "select * from annunci where tipologia=cani"

Il problema è che non riesco a far eseguire la query corretta nel caso che seleziono anche la Regione...che dovrebbe diventare:
.se nella select seleziono "Cani" e come Regione "Lombardia" viene eseguita la query "select * from annunci where tipologia=cani AND regione=lombardia"
Attualmente se seleziono solo i cani della lombardia mi escono anche quelli presenti in piemonte...

Come posso fare per rendere universale il GET e costruire la query a seconda di quello che sceglie l'utente?
Non sono un esperto di PHP, quindi chiedo gentilmente di fornirmi aiuto nel piu' semplice dei modi
Attualmente utilizzo questo codice:

Codice PHP:
PHP:
<?php
// se l'utente seleziona solo la tipologia
if (isset($_GET['tipologia'])) {
$annunci=mysql_query("SELECT * FROM annunci WHERE tipologia='$_GET[tipologia]' ORDER BY id DESC");
}
// se l'utente seleziona solo la regione
elseif (isset($_GET['regione'])) {
$annunci=mysql_query("SELECT * FROM annunci WHERE regione='$_GET[regione]' ORDER BY id DESC");
}
// nel caso sono selezionati entrambi i campi select
elseif (isset($_GET['tipologia']) AND (isset($_GET['regione']))) {
$annunci=mysql_query("SELECT * FROM annunci WHERE tipologia='$_GET[tipologia]' AND regione='$_GET[regione]' ORDER BY id DESC");
}
// se non è stato selezionato niente, seleziona tutti gli annunci
else {
$annunci=mysql_query("SELECT * FROM annunci ORDER BY id DESC");
}
$tot=mysql_num_rows($annunci);
if ($tot==0) { echo "
                            <div class=\"alert alert-info\">
                                <i class=\"icon-info-sign\"></i>
                                Spiacente, non ci sono annunci con i criteri selezionati!
                            </div>
"; }
else {
while ($row_show=@mysql_fetch_assoc($annunci)) {
[...] omissis [...]


Grazie!!!
 
Ciao, benvenuto!
Ti conviene impostare lo script cosi:
PHP:
<?php
$query = "SELECT * FROM annunci WHERE 1";
if (isset($_GET['tipologia'])) {
    $query .= " && tipologia='" . $_GET['tipologia'] . "'";
}
if (isset($_GET['regione'])) {
    $query .= " && regione='" . $_GET['regione'] . "'";
}
$query .= " ORDER BY id DESC";

$result = mysql_query($query);
?>
Aggiungi dei controlli sui campi GET, sei a rischio di SQL INJECTION e abbandona l'estensione mysql
 
ciao grazie, comunque ho risolto con !isset al posto di else...cosa ne pensi?

PHP:
<?php
$tipologia=mysql_real_escape_string($_GET['tipologia']);
$regione=mysql_real_escape_string($_GET['regione']);
if (isset($_GET['tipologia'])) {
$annunci=mysql_query("SELECT * FROM annunci WHERE tipologia='$_GET[tipologia]' ORDER BY id DESC");
}
if (isset($_GET['regione'])) {
$annunci=mysql_query("SELECT * FROM annunci WHERE regione='$_GET[regione]' ORDER BY id DESC");
}
if (isset($_GET['tipologia']) AND (isset($_GET['regione']))) {
$annunci=mysql_query("SELECT * FROM annunci WHERE tipologia='$_GET[tipologia]' AND regione='$_GET[regione]' ORDER BY id DESC");
}
if (!isset($_GET['tipologia']) AND (!isset($_GET['regione']))) {
$annunci=mysql_query("SELECT * FROM annunci ORDER BY id DESC");
}
$tot=mysql_num_rows($annunci);
?>
 
Non mi convince il passaggio di valore tramite GET
poi in teoria se invii la regione non invii la tipologia e viceversa
i valori dovrebbero essere inviati entrambi in ogni caso ma regione potrebbe essere vuoto quindi occorre un controllo in piu
Codice:
if (isset($_GET['regione']) && !empty($_GET['regione'])) {
prova il codice che ti ho postato : è più ordinato e se un giorno dovrai aggiungere un altro filtro non diventi matto
 
Scusa l'ignoranza....siccome non sono epserto di PHP, non è che mi fai un esempio di come potrei gestire il discorso dei controlli di sicurezza...
 
Intanto sarebbe meglio usare il method POST per evitare di poter modificare direttamente la stringa dell'url
poi va bene come hai fatto
PHP:
$tipologia=mysql_real_escape_string($_POST['tipologia']);
ma dovresti usare la variabile ripulita nella query
PHP:
tipologia='$tipologia'
 
Già avevo provato a fare con post, ma se non lo faccio con get non funziona piu' niente....stessa cosa per la variabile ripulita...non succede nulla...
 
Sicuramente avrai sbagliato qualcosa nel codice Postalo che al massimo lo correggiamo
Io lo farei cosi
PHP:
<?php
$query = "SELECT * FROM annunci WHERE 1";
if (isset($_POST['tipologia']) && !empty($_POST['tipologia'])) {
    $query .= " && tipologia='" . mysql_real_escape_string($_POST['tipologia']) . "'";
}
if (isset($_POST['regione']) && !empty($_POST['regione'])) {
    $query .= " && regione='" . mysql_real_escape_string($_POST['regione']) . "'";
}
$query .= " ORDER BY id DESC";

$result = mysql_query($query);
?>
<form method="POST" action="<?php echo $_SERVER['PHP_SELF'] ?>">  
    Tipologia
    <select name="tipologia" onchange="this.form.submit()">
        <option value=""></option>
        <option value="cani"
        <?php
        if (isset($_POST['tipologia']) && $_POST['tipologia'] == "cani") {
            echo " selected = 'selected'";
        }
        ?>
                >Cani</option>
    </select>    
    Regione
    <select name="regione" onchange="this.form.submit()">
        <option value=""></option>
        <option value="lombardia"
        <?php
        if (isset($_POST['regione']) && $_POST['regione'] == "lombardia") {
            echo " selected = 'selected'";
        }
        ?>
                >Lombardia</option>
    </select>
</form>
<?php
while ($row = mysql_fetch_array($result)) {
    // dati
}
?>
 

Discussioni simili