【问题标题】:PHP & MySql - array foreach [duplicate]PHP & MySql - 数组 foreach [重复]
【发布时间】:2013-03-22 08:37:47
【问题描述】:

我想从数据库运行一个 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");
}

【问题讨论】:

    标签: php mysql foreach while-loop


    【解决方案1】:

    也许你想要这样的东西

    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>";
        }
     }
    

    【讨论】:

    • 谢谢它的工作,但为什么你在查询中使用$leaveFW['leave_type_id_leave_type']$result 将返回一个 ID。并且不需要设置$iid和$type,$iid是全局变量。
    • @user1983017 这行是什么意思..“现在我想运行一个 foreach 循环,它将查询数组中每个 ID 的以下代码。:”然后..请澄清一下,我会编辑我的答案
    【解决方案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
    

    您的方法的不同之处:

    • 内部查询与您的第一个查询几乎相同,但
      • 我使用 DISTINCT 而不是 GROUP BY - 在这种情况下,它是相同的,但我认为这更容易阅读 - 这是一个重要方面!
      • 我只为它选择了相关的列(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
    

    现在的区别:

    • 性能大幅提升...
    • 代码少得多,可读性强

    编辑

    Here is the SQL fiddle to see how this works

    【讨论】:

    • 确实是非常有用的信息,但它不能解决我的问题。无论如何 +1 以获得良好的信息
    【解决方案3】:
       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']);
        }
       }
    

    【讨论】:

      【解决方案4】:

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

      你基本上可以再次重用你的第一个代码块,用 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']);...
          }    
      }
      

      【讨论】:

      • 虽然这解决了 OP 的问题,但我认为这不是在这种情况下采取的正确方法,而且这个答案并不能帮助 OP 以正确的方式做到这一点。
      • @ppeterka 我承认你的意见。
      猜你喜欢
      • 2021-05-30
      • 2019-02-11
      • 1970-01-01
      • 1970-01-01
      • 2018-03-01
      • 2015-11-09
      • 2015-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多