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