2014-07-20 62 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循环。再次感谢 –