php过滤器由用户
问题描述:
我得到了报告列表。默认情况下,报告列表将显示所有没有过滤的报告。当下拉过滤器点击时,它会按名称过滤结果。 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>
答
在旧版本的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
答
我认为问题是,你需要改变这一点:
$admin->getReportSingleMonth($_GET['month'], $_GET['year'], $_POST['user_name']);
它看起来像你的功能接到报告,需要为用户ID(假设一个整数值),并且您似乎正在使用$ _POST ['user_name']值向其发送一个字符串。
答
这里有一些(可能的)问题:
- 你
getReportSingleMonth()
似乎做过滤$month
和$year
但不$id_user
(即SQL injection) - 正如其他人指出, ,请引用SQL查询中的
id_user
值。 - 您不关闭
<select>
标记。 - 您有
<option value="--">
将被视为预期的用户选项(更改为value=""
)。
你可以发布实际的HTML输出吗? – 2011-05-02 18:23:40
是否结束''是一个错字? – oblig 2011-05-02 18:31:06