2012-01-15 115 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