2014-07-20 88 views
0

我一直致力於製作類似於Facebook的社交網絡,以便在我的家庭服務器上使用。但是,我遇到了在用戶配置文件的通知選項卡中顯示好友請求的問題。顯示好友請求

<?php 
    //Check for notifications script 
    $Request = "Requests"; 
    $Pending = "Pending"; 
    $nCheck = mysqli_query($Connect,"SELECT * FROM friends WHERE rTo = '$Uname' AND Status = '$Pending'"); 
    $nNum = mysqli_num_rows($nCheck); 
    if($nNum != 0){ 
     if($nNum === 1){ 
      $Request = "Request"; 
     } 
     else 
     { 
      $Request = "Requests"; 
     } 
     echo"<p style=\"font-family: Tahoma; margin-left: 20px;\">You Have <b>$nNum</b> Friend $Request</p><hr />"; 
     while($row = mysqli_fetch_assoc($nCheck)){ 
      $dbFrom = $row['rFrom']; 
      $dbId = $row['id']; 
      $dbStatus = $row['Status']; 
      for($i = 0; $i < 1; $i++){ 
       echo"<p style=\"font-family: Tahoma; margin-left: 20px;\">$dbFrom wants to be your friend <form action=\"\" method=\"POST\"><input type=\"submit\" name=\"A\" value=\"Accept\"></form> <form action=\"\" method=\"POST\"><input type=\"submit\" name=\"D\" value=\"Decline\"></form></p>"; 
      } 
     } 
    } 
    else 
    { 
     echo "<p style=\"font-family: Tahoma; margin-left: 20px;\">You Have <b>0</b> Friend $Request</p>"; 
    } 
    ?> 

然後這是形式的接受/拒絕:

<?php 
    //Accept/Decline Friend Request Script 
    $Accepted = @$_POST['A']; 
    $Declined = @$_POST['D']; 
    $A = "Accepted"; 
    $D = "Declined"; 
    if($Accepted){ 
     $addFriend = mysqli_query($Connect,"UPDATE friends SET Status = '$A' WHERE rTo = '$Uname' AND rFrom = '$dbFrom'"); 
     header("Location: Notification.php"); 
    } 
    else if($Declined){ 
     $addFriend = mysqli_query($Connect,"UPDATE friends SET Status = '$D' WHERE rTo = '$Uname' AND rFrom = '$dbFrom'"); 
     header("Location: Notification.php"); 
    } 
    ?> 

的問題是,如果超過一個通知,最近一次通知將是被接受或拒絕的一個。請大家幫忙,非常感謝。

回答

0

也 嘗試,如果在一個文件中都存在的代碼示例,這可以解釋你的問題,使用此

$A = "Accepted"; 
$D = "Declined"; 
if($Accepted){ 
    $addFriend = mysqli_query($Connect,"UPDATE friends SET Status = '$A' WHERE id='$dbId' AND rFrom = '$dbFrom'"); 
    header("Location: Notification.php"); 
} 
else if($Declined){ 
    $addFriend = mysqli_query($Connect,"UPDATE friends SET Status = '$D' WHERE id='$dbId' AND rFrom = '$dbFrom'"); 
    header("Location: Notification.php"); 
} 
1

。 你更新你的朋友表:如果$dbFrom值來自

$addFriend = mysqli_query($Connect,"UPDATE friends SET Status = '$A' WHERE rTo = '$Uname' AND rFrom = '$dbFrom'"); 

while($row = mysqli_fetch_assoc($nCheck)){ 
$dbFrom = $row['rFrom']; 

,這意味着你只需要更新的最後一排。 我建議你用這兩種形式發佈你的$dbForm

PS:並開始使用PDO。

+0

+1用於提示PDO :) – luschn

3
  • 。利用預處理語句。您沒有針對SQL注入進行保護(詳細信息:How can I prevent SQL injection in PHP?)。
  • 請勿使用字符串設置狀態。使用數值來定義狀態。這使它更容易處理。
  • 製作使用單引號'的,以避免逃避所有的雙引號"用於在HTML源代碼。在編碼指南中經常推薦使用字符串連接的替代方法。
  • 內聯CSS格式化已棄用。改爲使用外部CSS樣式表。
  • 當您不需要完整的數據集時,不要從數據庫中獲取整個數據集。始終只提取您需要的數據。不推薦使用*。例如。你不需要$row['Status']$row['id'],但仍然無故將其保存在變量中。
  • 請勿使用@運算符。改爲驗證您的POST數據。
  • 你的for循環沒有任何意義。它永遠不會有超過一次的貫穿。
  • 爲了解決當前的重大問題,我會分配ID給朋友,要求以唯一確定哪些好友請求的系統目前正在處理。
  • 此外,不要在查詢中使用用戶名,而應使用用戶ID。否則,您將面臨主題數據庫規範化方面的問題。
  • 沒有必要使用header()返回到notifications.php。驗證POST數據並相應地更新您的朋友請求後,您可以輕鬆地繼續構建notifications.php視圖。
+2

類型安全比較可能不是必需的,但無論如何它都很好用。我同意其餘的,所以+1我:) – luschn

+0

@luschn:同意,也讀了關於類型安全比較的更好的表現。現在對我有意義,我會解決我的答案。 – chrisp

+0

感謝您的反饋。只是這樣你才能在我的決定中找到一些合理性,我不擔心mysql注入,因爲它是一個家庭服務器。此外,我還檢索了整個數據集,因此我可以更容易地向請求添加不同方面,這會阻止我回去並添加它。最後,爲了實驗的目的,我有了for循環。再次感謝 –