0

我想从数据库运行一个 foreach 循环,但我不知道如何开始。我有一个从while循环生成的数组:

    /* mysql query for geting leave_type ID */

    $leaveType = mysql_query("
    SELECT `leave`.leave_type_id_leave_type,
      `leave`.staff_leave_application_staff_id_staff,
      `leave`.date,
      `leave`.date_updated,
      `leave`.active
    FROM `leave`
    WHERE `leave`.staff_leave_application_staff_id_staff = $iid
    GROUP BY `leave`.leave_type_id_leave_type   
    ");

    /* Now put all leave Type ID in an array */

   echo "<table>";
   $types = array();
    while($leaveFW = mysql_fetch_array( $leaveType )){
        $types[] = $leaveFW['leave_type_id_leave_type'];
    }
print_r($types);

现在我想运行一个 foreach 循环,它将在下面的代码中查询数组中的每个 ID。:

$leaveQ = mysql_query("SELECT Count(*) as total, monthname(date) as 
month FROM `leave`
WHERE `leave`.staff_leave_application_staff_id_staff = $iid 
and `leave`.leave_type_id_leave_type = $type"); 

我想在 foreach 循环中显示$leaveQ['month']和。$leaveQ['total']

可能是我的 foreach 这样,但如何获得$type['month']$type['total']

foreach ($types as $type)
{
    $leaveQ = mysql_query("SELECT Count(*) as total, monthname(date) as month
    FROM `leave` WHERE `leave`.staff_leave_application_staff_id_staff = $iid 
    and `leave`.leave_type_id_leave_type = $type");
}
4

4 回答 4

2

可能你想要这样的东西

foreach($types as $result)
{
    $iid  = $result['staff_leave_application_staff_id_staff'];
    $type = $result['leave_type_id_leave_type'];

    $leaveQ = mysql_query("SELECT Count(*) as total, monthname(date) as 
    month FROM `leave`
        WHERE `leave`.staff_leave_application_staff_id_staff = $iid 
     and `leave`.leave_type_id_leave_type = '".$leaveFW['leave_type_id_leave_type']."'");


    while($row = mysql_fetch_assoc($leaveQ))
    {
       echo $row['month']."<br>";
       echo $row['total']."<br>";
    }
 }
于 2013-03-22T08:48:11.127 回答
2

不要这样做!

  • mysql_ 函数自 PHP 5.5 起已弃用!
  • 这样做(获取一个查询,然后在 foreach 循环中为每一行运行另一个查询)是一种不好的方法,这在很多代码中常见于“网络...
  • 另外,我认为您想获得每个月的计数;在这种情况下,您必须为此使用 GROUP BY 子句

执行此操作的正确方法是使用 JOIN 操作,而不是对每一行进行查询,只需一个查询即可获取所有数据。

盲目地遵循该建议,不要改变太多,只需合并两个查询,您的查询应该如下所示:

SELECT Count(*) as total, monthname(date) as month, types.leave_type_id_leave_type
FROM `leave`
JOIN (SELECT DISTINCT `leave`.leave_type_id_leave_type
    FROM `leave`
    WHERE `leave`.staff_leave_application_staff_id_staff = $iid) as types 
  ON leave.leave_type_id_leave_type = types.leave_type_id_leave_type
WHERE `leave`.staff_leave_application_staff_id_staff = $iid 
GROUP BY monthname(date), types.leave_type_id_leave_type

您的方法的不同之处:

  • 内部查询与您的第一个查询几乎相同,但是
    • 而不是 GROUP BY,我使用了 DISTINCT - 在这种情况下,它是相同的,但我认为这更容易阅读 - 这是一个重要方面!
    • 我只为它选择了相关的列(leave_type_id_leave_type)
  • 我对外部查询进行了更多修改
    • JOIN 代替了“foreach”方法
    • 只有那些行被“计算在内”(在这种情况下,字面意思是:)),它们适用于内部查询
  • 这将返回每个月和每种类型的计数。

为了更好地做到这一点:

  • 使用正确参数化的准备好的语句:更好的性能,并且习惯它可以避免在适用的情况下进行 SQL 注入......
    • 您可以为此使用 PDO,它不被弃用...
  • 查看生成的查询,很容易看出这可以进一步简化,并且不需要内部查询,也摆脱了 $iid 上的一个过滤器

 

SELECT Count(*) as total, monthname(date) as month, leave_type_id_leave_type
FROM `leave`
WHERE `leave`.staff_leave_application_staff_id_staff = $iid
GROUP BY monthname(date), leave_type_id_leave_type

现在的区别:

  • 巨大的性能飞跃...
  • 少了很多,并且有很多可读的代码

编辑

这是 SQL 小提琴,看看它是如何工作的

于 2013-03-22T08:48:54.030 回答
0
   foreach($types as $type){
    $leaveQ = mysql_query("SELECT Count(*) as total, monthname(date) as 
    month FROM `leave`
    WHERE `leave`.staff_leave_application_staff_id_staff = $iid 
    and `leave`.leave_type_id_leave_type = $type"); 
    while($leave = mysql_fetch_assoc($leaveQ)){
    var_dump($leave['total'] , $leave['month']);
    }
   }
于 2013-03-22T08:48:39.883 回答
0

如果我理解正确,您想遍历从代码块中找到的类型,然后发出更多数据库查询并提取更多数据。

您基本上可以再次重用您的第一个代码块,并用 foreach 循环包装:

foreach($types as $type){
    $query = mysql_query("YOUR_SQL_USING_$TYPE");

    while($row = mysql_fetch_array( $query )){
        print_r($row);
        // or print($row['COLUMN_NAME']);...
    }    
}
于 2013-03-22T08:49:34.450 回答