我是一名相对新手,可以帮助解决这个问题。
这将用于搜索过滤器情况。 用户需要搜索一个值以及搜索表单传递的一个或多个其他值。
$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")
我知道代码是错误的,但它应该让你很好地了解我想要完成的任务。任何指导将不胜感激。
答案 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语句做一些讨厌的事情!