使用 php 变量创建动态 mysql 查询

Posted

技术标签:

【中文标题】使用 php 变量创建动态 mysql 查询【英文标题】:Create a dynamic mysql query using php variables 【发布时间】:2013-03-25 12:32:01 【问题描述】:

我有一个 html 表,可以加载 mysql 数据库表中的所有内容。我有与该 mySQL 表的列相关的下拉列表 - 当用户选择其中一个下拉列表时,它使用 AJAX 查询数据库。

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

最好的方法是什么?

目前我有这样的事情:

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

您可以想象这不起作用,因为如果这些字段中的任何一个为空 - 查询将失败(或者不返回任何内容)。

显然,如果某些变量为空,那么创建这样的“静态”查询确实会变得很困难。

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

【问题讨论】:

当下拉列表为空时,您为什么不回显您的查询以查看问题所在? 不要使用 mysql_query,它已被弃用。另外,你很喜欢 sql 注入。 现在我只关心让它运行起来。这仅适用于 Intranet 并使其正常工作。它永远不会看到外部世界。感谢您的关注,这是我所知道的,但我想看看我是否可以让它正常工作。 【参考方案1】:
$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 中推送表行的名称会更好; $_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);

【讨论】:

【参考方案2】:

只需检查变量是否包含值,如果包含,则像这样构建查询:

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

【讨论】:

我曾考虑过类似的事情 - 但是 WHERE 呢?这意味着该语句必须包含第一个的 WHERE - 但所有后续的语句都包含 AND。最好的方法是什么? 只需检查$sql 是否包含任何内容。如果是,请使用它,但在使用 $sql 之前添加单词 WHERE 完美。太棒了 - 这真的很有帮助!谢谢! SQL 注入无处不在

以上是关于使用 php 变量创建动态 mysql 查询的主要内容,如果未能解决你的问题,请参考以下文章

使用变量选项构建 PHP/MySQL 搜索查询 [重复]

使用来自 PHP 的 UDF MySQL 查询

PHP MYSQL $行[$变量]

PHP MYSQL 动态选择框

带有 MySql 数据库的动态 PHP 网站;如何为此创建站点地图?

mysql使用包含变量的mysql查询创建视图