2017-08-11 81 views
0

我想顯示數據引導數據表(4列)使用PHP和AJAX從mysqli_multi_query()如何從mysqli_multi_query結果集創建json?

我無法獲得與UNIONINNER JOIN一起使用的第二個查詢。 我不是程序員,幾乎得到了正確的結果,但由於某種原因,第一個查詢返回「null」值。

我該如何改變這種情況?

下面是一個日誌的示例和我的代碼:

PHP通知:未定義偏移:2,在行26 PHP通知:未定義偏移量:3第27行 { 「sEcho」:1,「iTotalRecords 「:1,」iTalDisplayRecords「:1,」aaData「:{」CommonInverterData「:[{」Date「:null,」Generated「:null,」Export「:」0.9921563111569116「,」Import「:」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); 

回答

0
  1. 您沒有檢查mysqli_more_results()

  2. 儘管每個查詢只提供了兩個,但您試圖訪問每個結果集中的4個元素。

我混你的代碼片段,其中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並解釋表關係。

+0

爲什麼您認爲在這種情況下使用多查詢有意義? –

+0

@YourCommonSense我沒有,但我不會強迫OP的手。我建議使用另一種方法。我對OP的數據結構和查詢不夠了解(或苦於深入研究),足以打擾提供一種特定的選擇。 – mickmackusa

+0

嗨米克馬庫薩,謝謝你的劇本。 你的代碼正在工作,返回4列,但只有1行,這是今天的日期,到目前爲止應該有12行。 – whismerhill

0

不要亂用mysqli_multi_query()。

運行一個查詢,將結果收集到數組中。
運行其他查詢,將結果收集到數組中。
在一個簡單的循環中結合了結果。
問題解決。使用最簡單的工具。

鑑於最明智的解決方案將使用實際的JOIN。因爲你應該問一個SQL問題。