5

この問題を解決できないのは、php のいくつかの側面に関する知識が不足しているためだと確信していますが、1 か月間解決しようとしても運がありません。これは問題の単純化されたバージョンです。

私のデータベースには、メンバー テーブル、子供テーブル (各メンバーの子供)、およびフレンド リクエスト テーブル (これには、子供が互いに送信するフレンド リクエストが含まれます) があります。

私がやろうとしているのは、次のwhileループを使用して特定の親の子を表示することです....

$query = "SELECT * From children " . <br>
         "WHERE parent_member_id = $member_id";     <br>  
$result = mysql_query($query) <br>
      or die(mysql_error());<br>
$num_children = mysql_num_rows($result);<br>
echo $num_children;<br>
while($row = mysql_fetch_array($result)){<br>
   $first_name = $row['first_name'];<br>
   $child_id = $row['child_id'];<br>

<div>echo $first_name<br>

}

このwhileループは完全に機能し、次のように表示されます...

1) ケネス
2) ラリー

私がやろうとしているのは、各子供が自分の名前の横に持っている友達リクエストの数も表示することです...このように

ケネス (2)
ラリー (5)

これを行うために、元の while ループに次の変更を試みました...

$query = "SELECT * From children " .<br>
         "WHERE parent_member_id = $member_id";<br>



$result = mysql_query($query) <br>
      or die(mysql_error());<br>
$num_movies = mysql_num_rows($result);<br>
echo $num_movies;<br>
while($row = mysql_fetch_array($result)){<br>

   $first_name = $row['first_name'];<br>
   $child_id = $row['child_id'];<br>

echo $first_name; include('counting_friend_requests.php') ;

}

このバージョンでは、含まれているスクリプトは次のようになります...

$query = "SELECT <br>children.age,children.child_id,children.functioning_level,children.gender,children.parent_member_id,children.photo, children.first_name,friend_requests.request_id " .
         "FROM children, friend_requests " .
         "WHERE children.child_id = friend_requests.friend_two " .
         "AND friend_requests.friend_one = $child_id"; <br>

$result = mysql_query($query)<br>
  or die(mysql_error());<br>
$count = mysql_num_rows($result);<br>
if ($count==0)<br>
  {<br>
  $color = "";<br>
  }<br>
else<br>
  {<br>
  $color = "red";<br>
  }<br>
echo span style='color:$color' ;<br>
echo $count;<br>
echo /span;<br>

再びこのwhileループが機能し始めますが、含まれているファイルにより、最初のレコードが返された後にループが停止し、次の出力が生成されます...

ケネス (2)

私の質問は、while ループを中断せずに目的の結果を表示する方法はありますか? 誰かが私を正しい方向に向けることさえできれば幸いです!!

4

3 に答える 3

2

疫病のようなコードでサブ クエリを実行することは避けてください。レコードの数が増えると、データベース エンジンがダウンするからです。<members> + 1クエリを考えます。

次のようにクエリを作成して、必要な結果を直接取得できます (テストされていません)。

SELECT child_id, first_name, COUNT(friend_two) AS nr_of_requests
From children
LEFT JOIN friend_requests ON friend_one = child_id OR friend_two = child_id
WHERE parent_member_id = $member_id
GROUP BY child_id, first_name;

いずれかのフレンド列に基づいて、childrenテーブル レコードを結合します。friend_requests次に、に基づいてグループ化しchild_idcount()作業を行います。

于 2012-11-28T02:08:50.387 に答える
0

ループするたびに php ファイルを含める必要はありません。メソッド getFriendRequestCount() を持つ Person クラスを作成してみてください。このメソッドは、すべてのデータベースを使用できます。これはまた、友達リクエストや名前などの配列を返すことができる getGriendRequests() のようなメソッドを作成できることを意味します。次に、 count($myPerson->getFriendRequests()) を使用して番号を取得できます。何千ものオプション!

始めるのに最適な場所、http://php.net/manual/en/language.oop5.php

単純なクラスの別の例http://edrackham.com/php/php-class-tutorial/

例えば。

include ('class.Person.php');  
while(loop through members)
    $p = new Person(member_id)
    echo $p->getName()
    echo $p->getFriendRequestCount()
    foreach($p->getFriendRequests as $fr)
         echo $fr['Name']

Person クラスでは、データベースからメンバーを取得してプライベート変数に保存するコンストラクターが必要です。その後、その変数に関数からアクセスして、そのメンバーに対して SQL クエリを実行できます。

于 2012-11-28T02:05:44.787 に答える
0

ここで何が起こっているのかを明確にするだけです。

「インクルード」処理は、スクリプトが解析されるときに行われます。基本的に、インクルード ファイルから現在のファイルにテキストをコピーするだけです。これが完了すると、ロジックが解析されます。

インクルード ステートメントは、メイン ロジックとは別に保持する必要があります。ほとんどの場合、「include」されたコードには、1 つ以上の関数の定義が含まれます。これらの関数は、プログラムの本体の適切な場所から呼び出すことができます。

于 2012-11-28T02:20:46.527 に答える