首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP & MySql - array foreach

问PHP & MySql - array foreach
EN

Stack Overflow用户
提问于 2013-03-22 16:37:48
回答 4查看 5.5K关注 0票数 0

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

代码语言:javascript
复制
    /* 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查询以下代码。:

代码语言:javascript
复制
$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']。

可能是我的最爱,但如何获得$type['month']和$type['total']:

代码语言:javascript
复制
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");
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-03-22 16:48:11

也许你想要这样的东西

代码语言:javascript
复制
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>";
    }
 }
票数 2
EN

Stack Overflow用户

发布于 2013-03-22 16:48:54

不要这样做!

  • mysql_函数从PHP5.5开始就被弃用了!
  • 这样做(获取一个查询,然后在一个foreach循环中为每个行运行另一个查询)是一种糟糕的方法,通常可以在许多代码中看到‘net...
  • 另外,我认为您想要获取每个月的计数;在这种情况下,您必须对该

使用GROUP BY子句

正确的方法是使用连接操作,而不是对每一行使用一个查询,只使用一个查询来获取所有数据。

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

代码语言:javascript
复制
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)

​

对于内部query,我对外部查询进行了更多的计数,连接所做的事情取代了“”

  • 那些行被“计入计数”(在本例中,字面意思是:) ) (

​

  • 这将返回每个月和每种类型的计数。

为了让它变得更好:

SQL使用正确参数化的预准备语句:更好的性能,并且习惯它可以使您在适用的情况下避免注入……你可以使用PDO,它不是deprecated...,

  • 。

​

  • 查看结果查询,很容易看出这可以进一步简化,并且不需要内部查询,还去掉了$iid

上的一个过滤器

代码语言:javascript
复制
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

现在的区别:

  • 性能大幅提升……
  • 少了很多,还有很多可读的代码

编辑

Here is the SQL fiddle to see how this works

票数 2
EN

Stack Overflow用户

发布于 2013-03-22 16:48:40

代码语言:javascript
复制
   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']);
    }
   }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15565942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档