【问题标题】:How to create json from mysqli_multi_query resultsets? [duplicate]如何从 mysqli_multi_query 结果集中创建 json? [复制]
【发布时间】:2018-01-19 09:01:55
【问题描述】:

我正在尝试使用来自mysqli_multi_query() 的 php 和 ajax 将数据显示到引导数据表(4 列)。

我无法让第二个查询与 UNIONINNER JOIN 一起使用。 我不是程序员,几乎可以得到正确的结果,但由于某种原因,第一个查询返回“null”值。

我该如何改变呢?

这是一个日志示例和我的代码:

PHP 注意:未定义的偏移量:第 26 行的 2 PHP 注意:未定义的偏移量:第 27 行上的 3 {"sEcho":1,"iTotalRecords":1,"iTotalDisplayRecords":1,"aaData":{"CommonInverterData":[{"Date":null,"Generated":null,"Export":"0.9921563111569116", "导入":"1.8864974578334937"}

/* Database connection start */ 
include ('db.php');

$conn = mysqli_connect($hn, $un, $pw, $db) or die("Connection failed: " . mysqli_connect_error());

/* Database connection end */

$sql = "SELECT m.`date`, `day_energy`
        FROM `CommonInverterData`
        JOIN ( SELECT `date`, MAX(`time`) 'maxtime'
        FROM `CommonInverterData`
        GROUP BY `date`) m
        ON m.maxtime = `CommonInverterData`.`time`
        AND m.`date` = `CommonInverterData`.`date`;";

$sql .= "SELECT ABS(SUM((CASE WHEN `P_Grid`<0 THEN `P_Grid` ELSE 0 END) / 60000 )) as 'Export', SUM((CASE WHEN `P_Grid`>=0 THEN `P_Grid` ELSE 0 END) / 60000 ) as 'Import' FROM `PowerFlowRealtimeData` GROUP BY `date`;";

if (mysqli_multi_query($conn, $sql) or die(mysqli_error($conn))) {
    do {
        if ($result=mysqli_store_result($conn)) {
            $data = array();
            while( $rows = mysqli_fetch_row($result) ) {
                $data[] = array(
                    'Date' => $rows[2],
                    'Generated' => $rows[3],
                    'Export' => $rows[0],
                    'Import' => $rows[1],
                );
            } mysqli_free_result($result);
        }
    } while (mysqli_next_result($conn));
}
mysqli_close($conn);

$return = array(
    "sEcho" => 1,
    "iTotalRecords" => count($data),
    "iTotalDisplayRecords" => count($data),
    "aaData"=>$data);

echo json_encode($return);

【问题讨论】:

    标签: php json mysqli mysqli-multi-query multiple-resultsets


    【解决方案1】:
    1. 您没有检查mysqli_more_results()

    2. 您尝试访问每个结果集中的 4 个元素,尽管每个查询只提供了两个元素。

    我已将您的 sn-p 与 a generalized code block that I built a while ago that helps people to understand and debug mysqli_multi_query() 混合在一起。如果执行后仍然有问题,此代码块应该可以帮助您找出原因。

    $sql=["SELECT m.`date`, `day_energy`
            FROM `CommonInverterData`
            JOIN ( SELECT `date`, MAX(`time`) 'maxtime'
            FROM `CommonInverterData`
            GROUP BY `date`) m
            ON m.maxtime = `CommonInverterData`.`time`
            AND m.`date` = `CommonInverterData`.`date`",
          "SELECT ABS(SUM((CASE WHEN `P_Grid`<0 THEN `P_Grid` ELSE 0 END) / 60000 )) as 'Export',
            SUM((CASE WHEN `P_Grid`>=0 THEN `P_Grid` ELSE 0 END) / 60000 ) as 'Import'
            FROM `PowerFlowRealtimeData` GROUP BY `date`"
        ];
    
    if(mysqli_multi_query($conn,implode(';',$sql))){
        do{
            // echo "<br><br>",key($sql),": ",current($sql);  // display key:value @ pointer
            if($result=mysqli_store_result($conn)){   // if a result set
                while($rows=mysqli_fetch_row($result)){
                    // echo "<br>Cols: {$rows[0]}, {$rows[1]}";
                    if(key($sql)===0){  (first query)
                        $tmp1[]=['Date'=>$rows[0],'Generated'=>$rows[1]];
                    }else{  // key($sql)===1 (second query)
                        $tmp2[]=['Export'=>$rows[0],'Import'=>$rows[1]];
                    }
                }
                mysqli_free_result($result);
            }
            // echo "<br>Rows = ",mysqli_affected_rows($conn); // acts like num_rows on SELECTs
        } while(next($sql) && mysqli_more_results($conn) && mysqli_next_result($conn));
    }
    if($mysqli_error=mysqli_error($conn)){
        echo "<br><br>",key($sql),": ",current($sql),"Syntax Error:<br>$mysqli_error";  // display array pointer key:value
    }
    mysqli_close($conn);
    
    $data=array_replace_recursive($tmp1,$tmp2);  // blend the temporary arrays together
    $return = array(
        "sEcho" => 1,
        "iTotalRecords" => count($data),
        "iTotalDisplayRecords" => count($data),
        "aaData"=>$data);
    
    echo json_encode($return);
    

    事实是:mysqli_multi_query() 不是这种情况下的最佳实践。如果这是我的任务/项目,我会尝试将查询合并到一个调用中(并避免完全调用 mysqli_multi_query())。

    这里有一个链接,我建议使用 UNION 查询可以做什么:https://stackoverflow.com/a/34758622/2943403 如果您走这条路,请记住,您仍将每行生成 2 列(而不是 4 列)。

    正如 YourCommonSense 建议的那样,JOIN 将是最佳实践,因为您将能够每行生成 4 列并简化结果集处理。重复 YCS,这值得提出一个新问题,其中包含有关您的数据库表和所需输出的单独/附加详细信息。如果您想收到关于如何编写查询的高质量响应,请务必包含所有涉及的表的 sqlfiddle 并解释表关系。

    【讨论】:

    • 为什么您认为在这种情况下使用多重查询有意义?
    • @YourCommonSense 我没有,但我不会强迫 OP 的手。我建议使用另一种方法。我对 OP 的数据结构和查询不够了解(或不愿深入研究),因此无法提供特定的替代方案。
    • 嗨 mickmackusa,感谢您的脚本。您的代码正在运行,返回 4 列,但仅返回 1 行,即今天的日期,到目前为止应该有 12 行。
    • 我已经设法通过 LEFT JOIN 返回到我的 php 脚本并使用单个查询来获得我的结果。谢谢大家。
    【解决方案2】:

    不要乱用mysqli_multi_query()。

    运行一个查询,将结果收集到数组中。
    运行另一个查询,将结果收集到数组中。
    将结果合并到一个简单的循环中。
    问题解决了。提供最简单的工具。

    而最明智的解决方案是使用实际的 JOIN。为什么你应该问一个 SQL 问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多