我有一份报告清单。默认情况下,报告列表将显示所有报告而不进行过滤。当下拉过滤器点击时,它将按名称过滤结果。 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>
答案 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)
以下是一些(可能的)问题:
getReportSingleMonth()
似乎过滤了$month
和$year
,但没有$id_user
(即SQL injection)id_user
值。<select>
代码。<option value="--">
会被视为预期的用户选项(更改为value=""
)。