php按用户过滤

时间:2011-05-02 18:20:04

标签: php drop-down-menu

我有一份报告清单。默认情况下,报告列表将显示所有报告而不进行过滤。当下拉过滤器点击时,它将按名称过滤结果。 anyidea如何解决它?

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>

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

我认为问题是你需要改变这个:


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

看起来您获取报告的功能需要作为用户ID(假设为整数值),并且您似乎使用$ _POST ['user_name']值向其发送字符串。

答案 2 :(得分:0)

以下是一些(可能的)问题:

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