2015-06-23 44 views
1

我正在構建一個小型框架來動態查詢數據庫並返回該查詢上的所有結果集。爲了使這個方法起作用,我必須處理返回多個結果集的過程,所以我將基於next_result()條件成立一段時間。下面的代碼工作正常,但是當我取消註釋第二個fetch()的同時,var_dump的next_result()總是返回true。我認爲這是一些有點bug或什麼的。但正因爲如此,我無法管理這些代碼的工作。動態bind_result錯誤解決方法

任何提示?任何解決方法?

public function query($database, $method, $parameters) { 

     $database -> connect(); 

     $sql = "CALL" . " " . $method . "(" . (count($parameters) === 0 ? "" : (str_repeat("?, ", count($parameters) - 2) . "?")) . ");"; 

     $stmt = $database -> connection -> prepare($sql); 

     if (count($parameters) > 0) { 
      call_user_func_array(array($stmt, 'bind_param'), $parameters); 
     } 

     $stmt -> execute(); 
     $stmt -> store_result(); 

     // i will have a while here 

     $i = 0; 

     $metadata = $stmt -> result_metadata(); 
     $fields = $metadata -> fetch_fields(); 

     $columns = array(); 
     foreach ($fields as $field) { 
      $j[$field -> name] = ""; 
      $columns[$field -> name] = &$j[$field -> name]; 
     } 

     call_user_func_array(array($stmt, 'bind_result'), $columns); 

     $rows[$i] = array(); 

     while ($stmt -> fetch()) { 
      $row = new stdClass(); 
      foreach ($columns as $key => $value) { 
       $row -> $key = $value; 
      } 
      $rows[$i] = $row; 
     } 

     $i++; 

     var_dump($stmt -> next_result()); 

     $metadata = $stmt -> result_metadata(); 
     $fields = $metadata -> fetch_fields(); 

     $columns = array(); 
     foreach ($fields as $field) { 
      $j[$field -> name] = ""; 
      $columns[$field -> name] = &$j[$field -> name]; 
     } 

     call_user_func_array(array($stmt, 'bind_result'), $columns); 

     $rows[$i] = array(); 

     /*while ($stmt -> fetch()) { 
      $row = new stdClass(); 
      foreach ($columns as $key => $value) { 
       $row -> $key = $value; 
      } 
      $rows[$i] = $row; 
     }*/ 

     var_dump($stmt -> next_result()); 

     $stmt -> free_result(); 
     $stmt -> close(); 

     $database -> disconnect(); 

     return $rows;   

    } 

回答

1

我發現基於所述元數據變量爲假的溶液:

public function query($database, $method, $parameters) { 

     $database -> connect(); 

     $sql = "CALL" . " " . $method . "(" . (count($parameters) === 0 ? "" : (str_repeat("?, ", count($parameters) - 2) . "?")) . ");"; 

     $stmt = $database -> connection -> prepare($sql); 

     if (count($parameters) > 0) { 
      call_user_func_array(array($stmt, 'bind_param'), $parameters); 
     } 

     $stmt -> execute(); 
     $stmt -> store_result(); 

     $i = 0; 

     while ($metadata = $stmt -> result_metadata()) { 

      $fields = $metadata -> fetch_fields(); 

      $columns = array(); 
      foreach ($fields as $field) { 
       $j[$field -> name] = ""; 
       $columns[$field -> name] = &$j[$field -> name]; 
      } 

      call_user_func_array(array($stmt, 'bind_result'), $columns); 

      $rows[$i] = array(); 

      while ($stmt -> fetch()) { 
       $row = new stdClass(); 
       foreach ($columns as $key => $value) { 
        $row -> $key = $value; 
       } 
       $rows[$i] = $row; 
      } 

      $i++; 
      $stmt -> next_result(); 

     } 

     $stmt -> free_result(); 
     $stmt -> close(); 

     $database -> disconnect(); 

     return $rows;   

    } 
+1

爲此需要2個東西[5.5.3 MYSQL或更高(http://dev.mysql.com /doc/refman/5.5/en/c-api-prepared-call-statements.html)和 [PHP 5.3 for mysqlnd支持](http://php.net/manual/en/intro.mysqlnd.php) - 這是一個編譯時間設置,因此如果您使用的是共享主機,則可能沒有此選項。 – curlyhairedgenius