基于传递的变量值mysql向WHERE子句添加条件

时间:2015-03-31 21:45:59

标签: mysql

我是一名相对新手,可以帮助解决这个问题。

这将用于搜索过滤器情况。 用户需要搜索一个值以及搜索表单传递的一个或多个其他值。

$name = $_POST['name'];
$sdate = $_POST['sdate'];
$startdate = $_POST['startdate'];
$enddate = $_POST['enddate'];
$vehicle = $_POST['vehicle'];
$triptype = $_POST['triptype']; 

如果这些值中的任何一个是''我不希望它们出现在查询中,如果它们包含一个值,我确实希望它们出现在查询中。

SELECT * FROM form_data WHERE `resp_person` = '$name', 
 IF $sdate != '' then `sdate` = '$sdate', 
 IF $startdate != '' then `sdate` = *all values between $startdate and $enddate*, 
 IF $triptype != '' then `triptype` = '$vehicle', 
 IF $vehicle != '' then `vehicle` = '$vehicle', `sdate`  
ORDER BY `sdate` DESC, `stime` DESC")

我知道代码是错误的,但它应该让你很好地了解我想要完成的任务。任何指导将不胜感激。

2 个答案:

答案 0 :(得分:1)

更好的方法是不使用字符串连接来构建整个查询,而是使用支持预处理语句的SQL库,例如PDO。

$pdo = new PDO('... connection string ...', username, password);
$where = '';
$possible_values = array('name', 'sdate', 'startdate', 'enddate', 'vehicle', 'triptype' );
$params = array();
foreach($possible_values as $val)
{
    if(isset($_POST[$val]))
    {
        $params[] = $_POST[$val];
        if($where == '')
        {
            $where = "WHERE $val = ?";
        }
        else
        {
            $where .= " AND $val = ?";
        }
    }
}
$stmt = $pdo->prepare("SELECT * FROM form_data " . $where);
$stmt->execute($params);

答案 1 :(得分:0)

在这种情况下,我更喜欢将问题分成几部分......

$wheres = array();   // Collect things to AND together
if ($searchterm != 'All')  $wheres[] = "subject LIKE '%searchterm'";
if (...)  $wheres[] = "...'";
...
if (count($wheres) > 0)
    $where_str = "WHERE " . implode(' AND ', $wheres);
else
    $where_str = '';

$order_str = (...) ? "ORDER BY ..." : '';

$limit_str = $limit ? "LIMIT $limit" : '';

$query = "SELECT ... FROM foo $where_str $order_str $limit_str";

哦,不要忘记使用从表单中传入的任何数据中的字符串转义 - 否则用户可以对SQL语句做一些讨厌的事情!