5

我确信我无法解决这个问题是由于缺乏对 php 某些方面的了解,但我已经尝试解决它一个月了,但没有运气。这是问题的简化版本。

在我的数据库中,我有一个 members 表、一个 childrens 表(每个成员的孩子)和一个朋友请求表(其中包含孩子们发送给彼此的朋友请求)。

我正在尝试做的是使用以下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_id来完成count()工作。

于 2012-11-28T02:08:50.387 回答
0

只是为了澄清这里发生的事情。

解析脚本时完成“包含”处理。本质上它只是将包含文件中的文本复制到当前文件中。完成此操作后,将解析逻辑。

您应该将任何包含语句与您的主要逻辑分开。在大多数情况下,“包含”代码将包含一个或多个函数的定义。然后,您可以从程序主体的适当位置调用这些函数。

于 2012-11-28T02:20:46.527 回答
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 回答