2017-06-17 75 views
0

我一直在摸索這個PHP代碼很長一段時間。我想實現像通過一個循環循環每個結果給出了多個不正確的結果

- >獲取每一個狀態
- >獲取用戶的好友列表
每個用戶 - 從在用戶的好友列表

,並重復每個用戶>顯示狀態直到沒有更多。我一直在尋找更多的解決方案,這真的讓我感到困擾。這裏是我試過的代碼:

編輯:發佈架構的要求 https://kjf-tech.net/files/schema.png

<?php 
$connect = new MySQLi($DBhost,$DBuser,$DBpass,$DBname); 
$querya = "SELECT * FROM statuses ORDER BY `id` DESC"; 
$result = mysqli_query($connect, $querya); 
$ALLDATA = array(); 

$DBcon2 = new MySQLi($DBhost,$DBuser,$DBpass,$DBname); 
if ($DBcon2->connect_errno) { 
    die("ERROR : -> ".$DBcon2->connect_error); 
} 


while ($record = mysqli_fetch_array($result, MYSQLI_ASSOC)) { 
    array_push($ALLDATA, $record); 
     $queryb = "SELECT * FROM friendslist WHERE idOfPerson1='".$record['idOfUser']."' OR idOfPerson2='".$record['idOfUser']."' OR idOfPerson2='".$userRow['user_id']."' OR idOfPerson1='".$userRow['user_id']."' ORDER BY `id` DESC"; 
     $result2 = mysqli_query($connect, $queryb); 
     $ALLDATA2 = array(); 

    while ($record2 = mysqli_fetch_array($result2, MYSQLI_ASSOC)) { 
     array_push($ALLDATA2, $record2); 

      if($record['idOfUser'] == $userRow['user_id']) { 
      echo '<div>You Posted on '.$record['whenPosted'].'<br />'.$record['content'].'</div>'; 
      } 
      elseif($record2['idOfPerson1'] == $userRow['user_id']) { 
      $query2 = $DBcon2->query("SELECT * FROM tbl_users WHERE user_id='".$record2['idOfPerson2']."'"); 
      $userRow2=$query2->fetch_array(); 
      echo '<div>'.$userRow2['username'].' Posted on '.$record['whenPosted'].'<br />'.$record['content'].'</div>'; 
      } 
      elseif($record2['idOfPerson2'] == $userRow['user_id']) { 
      $query2 = $DBcon2->query("SELECT * FROM tbl_users WHERE user_id='".$record2['idOfPerson1']."'"); 
      $userRow2=$query2->fetch_array(); 
      echo '<div>'.$userRow2['username'].' Posted on '.$record['whenPosted'].'<br />'.$record['content'].'</div>'; 
      } 
     } 
mysqli_free_result($result2); 
} 


$DBcon2->close(); 
mysqli_free_result($result); 

?> 
+0

您需要做的第一件事是在數據庫模式中多加一些思考。它看起來不正常。如果您的模式經過深思熟慮,則實現起來要容易得多。你可以發佈一個最小模式,顯示錶 –

+0

之間的關係好吧,我更新了我的文章。我不知道它的最小值是多少:C – KJF

+0

啊,好的。我會提出一個建議。 –

回答

0

你的架構看起來不錯,但讓我們再來看一下關係。爲了方便起見,我將重新命名一些列。

Users: 
+- user_id 
| user_name 
| 
| 
| Friendships: 
| fid 
+- user_id 
| friend_id --------+ 
| friendship_start | 
|     | 
|     | 
| Statuses:   | 
| sid    | 
+- user_id ----------+ 
    post_date 
    content 

如果你只是想找到你的朋友的狀態,查詢將這樣看:

SELECT statuses.content 
FROM friendships, statuses 
WHERE friendship.user_id=? AND 
    friendships.friend_id = statuses.user_id 

你會的,當然,bind適當user_id值,當你->prepare()聲明。

(爲正確的方式做SQL見http://php.net/manual/en/mysqli.prepare.php。你永遠不要想要做類似的mysql_query( 「SELECT * FROM表其中id =」。$ _ POST [ '身份證']),因爲它對SQL注入開放)

不幸的是,這不包括你自己在查詢結果中的狀態。我們必須在查詢中做更多的工作...

SELECT statuses.content 
FROM friendships, statuses 
WHERE 
    (friends.user_id = ? AND 
    friends.friend_id = stuatuses.user_id) 
    OR 
    statuses.user_id = ? 
ORDER BY statuses.post_date DESC 

到目前爲止,這麼好......但我們沒有名稱和發佈日期。發佈日期很簡單,只需添加到選擇: SELECT statuses.content, statuses.post_date

要添加名稱,我們必須從用戶也獲得數據。

SELECT users.user_name, statuses.content, statuses.post_date 
FROM users, friendships, statuses 
WHERE 
    users.user_id = ? AND 
    (
    (users.user_id = friendships.user_id AND 
     friendships.friend_id = statuses.user_id) 
    OR 
    statuses.user_id = users.user_id 
) 
ORDER BY statuses.post_date DESC 

而你有它;數據庫爲您完成所有工作。不需要嵌套查詢等。這隻會給你簡單的列表打印在你的頁面上。請記住,這是我的頭頂,所以如果我忽略了某些東西,你可能需要調整它。

+0

嘿!非常感謝!我不得不擺弄SQL和PHP代碼來解決一些問題。它首先複製了用戶的帖子,但是我修復了這個問題。再次感謝您:D – KJF

+0

優秀:)很高興有幫助。 –