2012-01-15 111 views
0

我的代码会提取报告的详细信息,但如果该特定报告与试图查看该报告的用户相关联,我只希望显示详细信息。我想知道是否为查询添加第二个WHERE子句更有效率/正确,或者我应该只使用PHP来检查关联的用户ID?我更喜欢后者,因为管理员可以更容易地访问所有记录。添加第二个WHERE子句或用PHP解析结果?

<?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

我不认为**一个**的查询是一个好主意。 – Nazariy 2012-01-15 16:26:42

回答

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); 
} 

无论你做什么都确保绑定你的变量。

+0

+1对于bind_param – Aaron 2012-01-15 16:35:56

0

最好的办法是将第一个查询设置为动态,以便管理员是否登录。类似这样的:

query = ".." 

if (user != admin) 
    query .= " AND report_user = " . intval(user_id) 
0

假设您的表格已正确编制索引,性能差异很小。有人可能会说SQL方法不太容易出错,因为它不依赖于你的PHP逻辑。另一方面,如果您使用第二种方法,则为用户提供有意义的错误消息更容易,因为可以准确确定为什么没有要显示的报告。在第一种方法中,您不知道报告是否存在,或者用户是否被禁止查看。然而,我会去第一个。

另外,您应该考虑使用PDO。也许你只是为了这个例子而使用了你所做的技术,但只是说。

+0

谢谢。而关于PDO,计划是在网站上线后将所有内容都转换成网页。我知道这并不理想,但我已经落伍了,我无法花时间学习新的方法。我正在学习,因为我足够了。尽管如此,我的确很欣赏这个输入。 - 比利 – JeepFreak 2012-01-15 17:33:02