2017-06-17 21 views
0

私はこのPHPコードについて長い間頭を悩ましてきました。私はループをループして各結果が複数の不正な結果を返す

ような何かを達成しようとしています - >各ステータスを取得
- >ユーザの友人リスト
内の各ユーザを取得 - ユーザーのフレンドリスト

繰り返しである各ユーザから>ディスプレイのステータスをそれがなくなるまで。私はより多くの日のための解決策を探していて、それは本当に私を悩ましています。ここで私が試したコードは次のとおりです。

EDIT:要求された 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

あなたのスキーマが良いように見えますが、のは、関係をもう一度見てみましょう。私は便宜のためにいくつかの列の名前を変更します。当然の

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

をあなたは考え、bind適切なuser_id値あなたが文を->prepare()

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

あなたがちょうどあなたの友人のステータスを見つけたい場合は、クエリは、このようになります。

(SQLを実行する適切な方法についてhttp://php.net/manual/en/mysqli.prepare.phpを参照してください。あなたがこれまでがするmysql_queryような何かをしたくない( "=テーブルからどこのid *選択"。$ _ POST [ 'ID'])ので、

残念ながら、残念ながら、これはクエリの結果にあなた自身のステータスを含みません。クエリについてもう少し作業をしなければならないでしょう...

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

優秀:援助してうれしいです。 –

関連する問題