2013-04-03 10 views
8

Ho una tabella html che carica tutto in una tabella di database mySQL. Ho elenchi a discesa che riguardano le colonne di quella tabella mySQL - quando l'utente seleziona uno dei menu a discesa utilizza AJAX per interrogare il database.Creare una query mysql dinamica utilizzando le variabili php

Ho bisogno di capire come compilare la query in modo dinamico perché a volte i menu a discesa saranno vuoti (cioè non vogliono filtrare da quella colonna).

Qual è il modo migliore per farlo?

Attualmente ho qualcosa di simile:

$stationFilter = $_GET['station']; 
    $verticalFilter = $_GET['vertical']; 
    $creativeFilter = $_GET['creative']; 
    $weekFilter = $_GET['week'];  

    $result = mysql_query("SELECT * FROM $tableName WHERE STATION_NETWORK = '$stationFilter' AND VERTICAL = '$verticalFilter' AND CREATIVE = '$creativeFilter' AND WK = '$weekFilter'"); 
    $data = array(); 
    while ($row = mysql_fetch_row($result)) 
     { 
     $data[] = $row; 
     } 
    $finalarray['rowdata'] = $data; 

Che si può immaginare non funziona perché se uno qualsiasi di questi campi sono vuoti - l'interrogazione fallisce (o non restituisce nulla, piuttosto).

Ovviamente la creazione di una query "statica" del genere rende davvero difficile se alcune variabili sono vuote.

Qual è il modo migliore per creare dinamicamente quella query in modo che entri solo quelli che non sono vuoti vengono aggiunti alla query in modo che possa completare e visualizzare correttamente i dati appropriati?

+0

Perché non eco la query per vedere ciò che è sbagliato quando discesa è vuota? –

+1

Non usare mysql_query, è deprecato. Inoltre, sei inviolabile alle iniezioni di SQL. – Jonast92

+0

In questo momento sono solo preoccupato di renderlo operativo. Questo è solo specificamente per intranet e per farlo funzionare. Non vedrà mai il mondo esterno. Grazie per la preoccupazione, è qualcosa di cui sono a conoscenza, ma voglio vedere se riesco a farlo funzionare. – Hanny

risposta

29

Basta controllare se le variabili contengono un valore e se lo fanno, costruire la query in questo modo:

unset($sql); 

if ($stationFilter) { 
    $sql[] = " STATION_NETWORK = '$stationFilter' "; 
} 
if ($verticalFilter) { 
    $sql[] = " VERTICAL = '$verticalFilter' "; 
} 

$query = "SELECT * FROM $tableName"; 

if (!empty($sql)) { 
    $query .= ' WHERE ' . implode(' AND ', $sql); 
} 

echo $query; 
// mysql_query($query); 
+0

Avevo preso in considerazione qualcosa del genere - ma per quanto riguarda il DOVE? Significato la dichiarazione deve includere DOVE per il primo - ma AND per tutti quelli successivi. Il modo migliore per farlo? – Hanny

+0

Basta controllare se '$ sql' contiene qualcosa. Se lo fa, usalo ma aggiungi la parola 'WHERE' prima di usare' $ sql' – SeanWM

+0

Controlla la mia modifica .. – SeanWM

0
$filter = array(); 

if ($_GET['station'] != '') 
{ $filter[] = 'STATION_NETWORK = '.$_GET['station'];} 
if ($_GET['vertical'] != '') 
{ $filter[] = 'VERTICAL = '.$_GET['vertical'];} 
if ($_GET['creative'] != '') 
{ $filter[] = 'CREATIVE = '.$_GET['creative'];} 
if ($_GET['week'] != '') 
{ $filter[] = 'WK = '.$_GET['week'];} 

$query = 'SELECT * FROM $tableName WHERE '.implode(' AND ', $filter); 
$result = mysql_query($query); 
... 

ma meglio se in GET ti ha spinto nome di tabelle righe; $ _GET ['STATION_NETWORK'] --- un po 'come questo;

then you make 
foreach ($_GET as $key => $value) 
{ 
    if ($value != '') 
    { $filter[] = $key.' = '.$value;} 
} 

o provare

$filter = array('STANTION_NETWORK' => $_GET['station'], 
       'VERTICAL' => $_GET['vertical'], 
       'CREATIVE' => $_GET['creative'], 
       'WK' => $_GET['week']); 
$query_array = array(); 

foreach ($filter as $key => $value) 
{ 
    if ($value != '') 
    { $query_array[] = $key.' = '.$value;} 
} 
$query = 'SELECT * FROM $tableName WHERE '.implode(' AND ', $query_array); 
$result = mysql_query($query); 
Problemi correlati