2013-04-03 74 views
8

我有一个html表格,加载一个mySQL数据库表中的所有内容。我有关于mySQL表的列的下拉列表 - 当用户选择其中一个下拉列表时,它使用AJAX查询数据库。使用php变量创建一个动态mysql查询

我需要弄清楚如何动态构建查询,因为有时候下拉列表将是空的(即他们不想按该列进行过滤)。

这样做的最好方法是什么?

目前,我有这样的事情:

$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; 

,你能想象不工作,因为如果任何这些字段是空的 - 查询失败(或返回任何内容,而不是)。

很明显,创建这样一个'静态'查询,如果某些变量为空,真的会很难。

什么是动态创建该查询的最佳方式,以便它只输入非空的查询将被添加到查询中,以便它可以成功完成并显示适当的数据?

+0

你为什么不回应你的查询,看看有什么是错误的,当下拉列表是空的? –

+1

不要使用mysql_query,它已弃用。另外,你对sql注入产生了影响。 – Jonast92

+0

现在我只关心它的运作。这只是专门用于Intranet并使其工作。它永远不会看到外部世界。感谢您的关注,这是我知道的事情,但想看看我是否可以得到这个工作。 – Hanny

回答

29

只是检查变量包含的值,如果他们这样做,建立一个像这样的查询:

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

我曾考虑过这样的事情 - 但那里呢? 含义该语句必须包括第一个WHERE,但是对于所有后续的。最好的方法来做到这一点? – Hanny

+0

只需检查'$ sql'是否包含任何内容。如果是这样,使用它,但在使用'$ sql'之前添加单词'WHERE'。 – SeanWM

+0

检查我的编辑.. – 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); 
... 

但如果让你推表中的行名更好; $ _GET ['STATION_NETWORK'] ---一些这样的;

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

,或者尝试

$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);