2011-05-02 75 views
1

我得到了报告列表。默认情况下,报告列表将显示所有没有过滤的报告。当下拉过滤器点击时,它会按名称过滤结果。 anyidea如何解决它?php过滤器由用户

function getReportSingleMonth($month, $year, $id_user=NULL) { 
    $month = $db->real_escape_string($month); 
    $year = $db->real_escape_string($year); 
    $db->query("SELECT * FROM user WHERE MONTH(date)='$month' AND YEAR(date)='$year' AND id_user='$id_user'"); 
} 

HTML部分:

<form method="post" name="report_filter" action="<?= $_SERVER['PHP_SELF'];?>?report&month=<?= $_GET['month'];?>&year=<?= $_GET['year'];?>"> 
<div align="right"><select name="user_name" onchange="report_filter.submit();"><option value="--">Filter by:</option><option value="1">Andi</option>M<option value="2">Jenny</option><select></div>  
<? if(isset($_POST['user_name'])): 
    $admin->getReportSingleMonth($_GET['month'], $_GET['year'], $_POST['user_name'])  
else : 
    $admin->getReportSingleMonth($_GET['month'], $_GET['year']); 
endif; 
?> 
</form> 
+0

你可以发布实际的HTML输出吗? – 2011-05-02 18:23:40

+0

是否结束''是一个错字? – oblig 2011-05-02 18:31:06

回答

1

在旧版本的MySQL中,您不能在整数值周围加引号。尝试切换这一行:

$db->query("SELECT * FROM user WHERE MONTH(date)='$month' AND YEAR(date)='$year'" AND id_user=$id_user"); 

再来看,我注意到,你并不总是要通过一个user_id。考虑到这一点的功能应改为:

function getReportSingleMonth($month, $year, $id_user=NULL) { 
    $month = $db->real_escape_string($month); 
    $year = $db->real_escape_string($year); 
    $query = "SELECT * FROM user WHERE MONTH(date)='$month' AND YEAR(date)='$year'"; 
    if (is_int($id_user)) { 
     $query .= ' and id_user=' . $id_user; 
    } 
    $db->query($query); 
} 

现在查询id_user部分,只有当它被传递给函数添加。

我还建议使用sprintf

+0

非常感谢。但似乎仍然无法正常工作。我得到另一行'GROUP BY时间ORDER BY time ASC'。我应该在哪里放行? – tonoslfx 2011-05-02 20:16:38

+0

感谢排序;) – tonoslfx 2011-05-02 20:25:48

0

我认为问题是,你需要改变这一点:


$admin->getReportSingleMonth($_GET['month'], $_GET['year'], $_POST['user_name']); 

它看起来像你的功能接到报告,需要为用户ID(假设一个整数值),并且您似乎正在使用$ _POST ['user_name']值向其发送一个字符串。

0

这里有一些(可能的)问题:

  1. getReportSingleMonth()似乎做过滤$month$year但不$id_user(即SQL injection
  2. 正如其他人指出, ,请引用SQL查询中的id_user值。
  3. 您不关闭<select>标记。
  4. 您有<option value="--">将被视为预期的用户选项(更改为value="")。