添加第二个WHERE子句或用PHP解析结果?

时间:2012-01-15 16:20:33

标签: php mysql where

我的代码提取了报告的详细信息,但我只希望显示详细信息,如果该特定报告与尝试查看它的用户相关联。我想知道在查询中添加第二个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
}
?>

提前致谢! 比利

3 个答案:

答案 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。也许你只是为了这个例子而使用了你所做的技术,但只是说。