2014-07-20 2 views
0

저는 홈 서버에서 사용할 페이스 북과 비슷한 소셜 네트워크를 만들기 위해 노력해 왔습니다. 그러나 사용자 프로필의 알림 탭에 친구 요청을 표시하는 데 문제가 있습니다.친구 요청 표시

<?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

를 사용해보십시오. 당신은 당신의 친구 테이블 업데이트 : 방금 마지막 행을 업데이트 의미

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

다음 $dbFrom 값에서 오는 경우

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

합니다. $dbForm도 2 가지 형식으로 게시하시는 것이 좋습니다.

PS : PDO를 사용하고 시작하십시오.

+0

+1을 사용하여 PDO를 제안했습니다. – luschn

3
  • Prepared Statements를 사용하십시오. SQL 인젝션에 대해 보안되지 않습니다 (추가 정보 : How can I prevent SQL injection in PHP?).
  • 문자열을 사용하여 상태를 설정하지 마십시오. 숫자 값을 사용하여 상태를 정의하십시오. 따라서 처리가 훨씬 쉬워집니다.
  • 작은 따옴표 '을 사용하여 소스 코드에서 HTML에 대해 큰 따옴표 "을 모두 피할 필요가 없습니다. 코딩 지침에서 종종 권장되는 문자열 연결을위한 대체 방법이 있습니다.
  • 인라인 CSS 포매팅은 더 이상 사용되지 않습니다. 대신 외부 CSS 스타일 시트를 사용하십시오.
  • 전체 데이터 집합이 필요하지 않은 경우 데이터베이스에서 전체 데이터 집합을 가져 오지 마십시오. 항상 필요한 데이터 만 가져옵니다. *을 사용하는 것은 좋지 않습니다. 예 : $row['Status']$row['id']이 필요하지 않지만 아무 이유없이 변수에 저장하십시오.
  • @ 연산자를 사용하지 마십시오. 대신 POST 데이터의 유효성을 검사하십시오.
  • for 루프는 의미가 없습니다. 그것은 하나 이상의 런 - 스루를 가질 수 없습니다.
  • 현재 중요한 문제를 해결하기 위해 시스템에서 현재 처리중인 친구 요청을 고유하게 식별하기 위해 친구 요청에 ID를 할당합니다.
  • 또한 쿼리에서 사용자 이름을 사용하지 말고 사용자 ID를 사용하십시오. 그렇지 않으면 주제 데이터베이스 정규화와 관련하여 문제가 발생할 수 있습니다.
  • notifications.php로 돌아가려면 header()를 사용할 필요가 없습니다. POST 데이터의 유효성을 검사하고 이에 따라 친구 요청을 업데이트 한 후 notifications.php보기를 쉽게 만들 수 있습니다.
+2

유형 안전 비교는 필요하지 않지만 어쨌든 사용하는 것이 좋습니다. 그래도 나는 나머지 부분에 동의한다. 내게서 +1 +1 : – luschn

+0

@luschn : 동의했다. 타입 안전 비교 결과에 대해서도 읽었다. 나에게 의미가있다, 나는 나의 대답을 고쳐 줄 것이다. – chrisp

+0

의견에 감사드립니다. 내 결정 뒤에 합리성을 발견 할 수 있기 때문에, 홈 서버이기 때문에 mysql 주입에 대해 걱정하지 않아도된다. 또한 전체 데이터 집합을 검색하여 요청에 다른 양상을 추가하는 것이 더 쉬워지면 되돌아 가서 추가하는 것을 막을 수 있습니다. 그리고 마지막으로 실험 목적으로 for-loop를 사용했습니다. 다시 한 번 감사드립니다. –