【问题标题】:PHP: help with this logicPHP:帮助这个逻辑
【发布时间】:2010-11-16 13:13:20
【问题描述】:

我有问题。我有一张支持票 (wh_task) 表。每个任务都有一个 date_completed (d/m/Y) 和 has_met_sla 字段(0 或 -1)。我想允许用户按 date_completed 搜索此表并根据结果显示图表。

图表数据必须如下所示,以便我可以填充条形图(融合图表):

年份:2010 |月份:11 月 | SLA 满足:12 | SLA 未命中:2

年份:2010 |月份:十月 | SLA 满足:15 | SLA 未命中:1

图表将在 x 轴上显示数字,在 y 轴上显示“2010 年 11 月”。沿 y 的每个月有 2 列,满足和未满足。

所以,我可以毫无问题地创建这种图表,但它生成的数据我很难想出。以下是我的查询:

        $tsql = "SELECT task_id, has_met_service_level_agreement, date_completed ".
                "FROM wh_task ".
                "WHERE (task_status_id = 5) AND (account_id =$atid)";

        $stmt = sqlsrv_query( $conn, $tsql);
        if( $stmt === false)
        {
                 echo "Error in query preparation/execution.\n";
                 die( print_r( sqlsrv_errors(), true));
        }


        //SLA counters
        $met = 0;
        $missed = 0;



        /* Retrieve each row as an associative array and display the results.*/
        while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC))
        {
            $date = $row['date_completed'];
            $monthnumber = date_format($date, "n");
            $year = date_format($date, "Y");
            $hasmetsla = $row['has_met_service_level_agreement'];

        }


    }

你能帮我看看这里的逻辑吗?我猜我需要将数据存储在一个包含月份、年份、满足总计和未满足总计的数组中。然后对于每个任务检查数组中是否已经存在年月组合,如果存在则根据 $hasmetsla 修改总计,如果不将其添加到数组中??

谢谢大家!

琼斯

【问题讨论】:

  • 我也在采取必要的 SQL 注入预防措施......
  • 不,你不是。您没有参数化您的查询。在这种特殊情况下,您可以避免将 $atid 显式转换为整数,但参数化查询是更好的解决方案 - 它们适用于任何数据类型,并且几乎适用于所有情况。
  • 不,我只是没有将它包含在我的代码片段中,但我首先检查数据并删除不需要的东西..

标签: php arrays multidimensional-array logic


【解决方案1】:

我认为你最好在 SQL 中进行这种处理。使用两步解决方案:首先,找到一个查询,为您提供每一行的年、月和 sla_met。把它放在一个视图中。然后对该视图进行查询,使用 group_by、sum() 和 count() 的巧妙组合来计算所需的结果:

CREATE VIEW vw_sla AS SELECT DATEPART(year, date_completed) AS year, DATEPART(month, date_completed), CASE has_met_service_level_agreement WHEN 0 THEN 0 ELSE 1 END as sla_met

SELECT year, month, sum(sla_met), count(*) - sum(sla_met) FROM vw_sla GROUP BY year, month ORDER BY year DESC month DESC

您需要做的就是从数据库中获取数据,并将其显示在表格中。

【讨论】:

    【解决方案2】:

    如果我必须在 PHP 中执行此操作,我会这样做(使用 SQL 会是更好的选择,但这是事后执行此操作的一种方法):

    首先,我会设置一个具有以下结构的多维数组:

    array(
        'year1' => array(
            'month1' => array(
                'met' => 0,
                'missed' => 0,
            ),
        ),
    ),
    

    然后,我将更改 while 循环以执行以下操作:

    $yearInfo = array();
    while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC)) {
        $date = $row['date_completed'];
        $monthnumber = date_format($date, "n");
        $year = date_format($date, "Y");
        $hasmetsla = $row['has_met_service_level_agreement'];
        if (!isset($yearInfo[$year])) {
            $yearInfo[$year] = array(
                $monthnumber => array(
                    'met' => 0, 
                    'missed' => 0
                )
            );
        } elseif (!isset($yearInfo[$year][$monthnumber])) {
            $yearInfo[$year][$monthnumber] = array(
                'met' => 0,
                'missed' => 0,
            );
        }
        $key = $hasmetsla ? 'met' : 'missed';
        $yearInfo[$year][$monthnumber][$key]++;
    }
    

    然后,当你显示:

    $data = '';
    foreach ($yearInfo as $year => $months) {
        foreach ($months as $month => $status) {
            $data .= 'Year: '.$year.' | '.
                  'Month: '.$month.' | '.
                  'SLA Met: '.$status['met'].' | '.
                  'SLA Missed: '.$status['missed']."\n";
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-07
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多