我的代码提取了报告的详细信息,但我只希望显示详细信息,如果该特定报告与尝试查看它的用户相关联。我想知道在查询中添加第二个WHERE
子句是否更有效/正确,或者我是否应该使用PHP来检查相关的用户ID?我更喜欢后者,因为管理员可以更容易地访问所有记录。
<?php
$query = mysql_query("SELECT report_id, report_user, report_text
FROM reports
WHERE report_id = '$rid'
AND report_user = '$uid'");
$report = mysql_fetch_assoc($query);
?>
OR
<?php
$query = mysql_query("SELECT report_id, report_user, report_text
FROM reports
WHERE report_id = '$rid'");
$report = mysql_fetch_assoc($query);
if ($report['user'] !== $uid) {
// Access Denied
}
?>
提前致谢! 比利
答案 0 :(得分:5)
我认为你应该在查询选项中进行过滤。如果您的PHP代码中存在一些错误,它会更有效并且可以更好地保护用户隐私。关于查看报告的管理员能力,您可以动态地制作查询。
$sql = "SELECT report_id, report_user, report_text
FROM reports
WHERE report_id = ?";
if($userContext)
{
$sql .= " AND report_user = ?";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('dd', $rid, $uid);
}
else //admin context
{
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('d', $rid);
}
你做了什么确保绑定变量。
答案 1 :(得分:0)
最好的方法是使第一个查询动态,就管理员是否登录而言。像这样:
query = ".."
if (user != admin)
query .= " AND report_user = " . intval(user_id)
答案 2 :(得分:0)
假设您的表格已正确编入索引,则性能差异很小。有人可能认为SQL方法不易出错,因为它不依赖于PHP逻辑。另一方面,如果使用第二种方法,则更容易为用户提供有意义的错误消息,因为可以确切地确定没有要显示的报告的原因。在第一种方法中,您不知道报告是否不存在或者是否仅允许用户查看它。但是,我会选择第一个。
此外,您应该考虑使用PDO。也许你只是为了这个例子而使用了你所做的技术,但只是说。