显示好友请求


Displaying Friend Requests

我一直致力于在我的家庭服务器上使用一个类似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");
    }
    ?>

问题是,如果存在多个通知,最后一个通知将是接受或拒绝的通知。请帮忙,非常感谢。

  • 使用准备好的语句。你不能防止SQL注入(更多信息:如何在PHP中防止SQL注入?)。
  • 不要使用字符串来设置状态。使用数值来定义状态。这使得它更容易处理。
  • 使用单引号'来避免在源代码中转义HTML的所有双引号"。还有一些字符串连接的替代方法,这些方法通常在编码指南中被推荐。
  • 内联CSS格式已弃用。使用外部CSS样式表代替。
  • 当你不需要完整的数据集时,不要从数据库中获取整个数据集。总是只获取你需要的数据。不建议使用*。例如,您不需要$row['Status']$row['id'],但仍然将其保存在一个变量中。
  • 不要使用@操作符。验证你的POST-data。
  • 你的for循环没有任何意义。它永远不会有超过一个运行。
  • 为了解决你当前的主要问题,我会为好友请求分配id,以便唯一地标识系统当前正在处理的好友请求。
  • 另外,不要在查询中使用用户名,而是使用userID。否则,您将面临主题数据库规范化方面的问题。
  • 不需要使用header()返回到notification .php。在验证post数据并相应地更新好友请求之后,您可以轻松地继续构建notification .php-view。

如果这两个代码样本存在于一个文件中,那就解释了您的问题。你更新了你的好友表:

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

如果$dbFrom值来自:

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

意味着你只更新最后一行。我建议你也把你的$dbForm和这两张表格一起寄上。

also尝试使用这个

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