2017-06-17 72 views
0

美好的一天大家!解決方法嵌套while - >獲取

目前我正在嘗試爲我的問題找到解決方法。就我而言,MySqli不支持嵌套的fetch'es,因此我的功能不太適用。我試圖找到解決辦法,但沒有運氣。我現在的代碼:

function viewQuestionnaire($id){ 

    $questionStmt = $this->connection->prepare("SELECT id, type, name FROM TAP_questions WHERE questionnaire_id=?;"); 
    $questionStmt->bind_param("i", $id); 
    $questionStmt->bind_result($id, $type, $name); 
    $questionStmt->execute(); 
    $result = array(); 

    while ($questionStmt->fetch()) { 
     $questions = new StdClass(); 
     $questions->question_id = $id; 
     $questions->question_type = $type; 
     $questions->question_options = array(); 
     $questions->question_name = $name; 
     if($questions->question_type=="2"){ 
      $stmtOptions= $this->connection->prepare("SELECT id, options FROM TAP_options WHERE question_id=?;"); 
      $stmtOptions->bind_param("i", $id); 
      $stmtOptions->bind_result($qu_id, $qu_opt); 
      $stmtOptions->execute(); 
      while ($stmtOptions->fetch()) { 
       $options = new StdClass(); 
       $options->option_id = $qu_id; 
       $options->option_name = $qu_opt; 
       array_push($questions->question_options, $options); 
      } 

      $stmtOptions->close(); 
     } 

     array_push($result, $questions); 
    } 

    $questionStmt->close(); 


    return $result; 
} 

正如你所看到的,我試圖從數據庫中獲取值,具體取決於問題類型。如果問題類型是「2」,我需要從另一個表中獲取「附加」值。我怎麼做?

弗拉德

+0

做(嵌套)提取沒有限制。 – hakre

+0

你不能有兩個同時的查詢,因爲默認情況下mysqli使用非緩衝查詢(對於準備好的語句;這與vanilla mysql_query相反)。 –

+0

但你可以告訴使用緩衝查詢,這應該是可控制的。 – hakre

回答

0

我有或多或少與此問題的兩個星期前,發現了兩個工作方案:

1)嵌套查詢,但使用/初始化兩種不同的連接爲他們(即使是到相同的數據庫)

2.)首先做一個查詢,將結果保存到一個數組中,然後在另一個查詢中使用該數組。

+0

你不需要自己創建一個數組,你可以告訴驅動程序緩衝結果:http://php.net/manual/en/mysqli-stmt.store-result.php – hakre

+0

是的,基本上我的意思是(我不是指「創建一個數組來保存數據」,而是「使用php函數將結果保存在數組中」) – Johannes

0

如果你緩衝結果,你可以運行第二個查詢w/o丟失第一個查詢的結果。

在Mysqli中,您通過mysqli_stmt::store_result method緩衝執行準備語句(默認爲無緩衝)的結果。

... 

$questionStmt = $connection->prepare(
    "SELECT id, type, name FROM TAP_questions WHERE questionnaire_id=?;" 
); 
$questionStmt->bind_param("i", $id); 
$questionStmt->bind_result($id, $type, $name); 
$questionStmt->execute(); 

/* store result */ 
$questionStmt->store_result(); 

... 

/* free result */ 
$questionStmt->free_result(); 

$questionStmt->close(); 

...