2011-01-21 1 views
5

私は、かなり多量の更新/挿入をmulti_queryを使用してテーブル上で実行しようとしています。そこ〜14,000クエリは合計ですが、機能だけで480〜実行し、それがエラーなしで停止し、PHPは、以下のスニップを超えてスクリプトを継続:最初のステートメントが失敗した場合mysqli :: multi_queryが特定の行の後に停止するのはなぜですか?

if($this->db->conn_id->multi_query($sql)){ 
    do{ 
     // echo $line.' '.mysqli_sqlstate($this->db->conn_id).'<br>'; 
    }while($this->db->conn_id->more_results() && $this->db->conn_id->next_result()); 
    $this->message->set('Import complete.','success',TRUE); 
}else{ 
    $this->message->set('Import could not be completed. '.mysqli_error($this->db->conn_id),'error',TRUE); 
} 
+1

クエリが約480行に達するまでの時間(秒単位)はどれくらいですか? CIはエラーをログファイルに記録しますか? – joelcox

+0

@ Xoc失敗する前にクエリが1秒未満実行されます。 – Erik

答えて

0

mysqliのは:: multi_queryのだけはfalseを返します。あなたのセット内の他のクエリからエラーを取得するには、まずmysqli :: next_result()を呼び出す必要があります。これはdo while()がやっていることです。

しかし、mysqli :: next_result()は失敗するとfalseを返すので、ループが終了し、 'Import complete'メッセージが表示されます。成功メッセージを設定する前にエラーをチェックする必要があり、エラーが空白の場合にのみ、成功を返します。

文章の後にエラーがあった場合は、少なくとも次のようにエラーを表示する必要があります。

if($this->db->conn_id->multi_query($sql)){ 
    do{ 
     // echo $line.' '.mysqli_sqlstate($this->db->conn_id).'<br>'; 
    } while($this->db->conn_id->more_results() && $this->db->conn_id->next_result()); 

    if ($error = mysqli_error($this->db->conn_id)) { 
     $this->message->set('Import could not be completed. ' . $error,'error',TRUE); 
    } else $this->message->set('Import complete.','success',TRUE); 
} else { 
    $this->message->set('Import could not be completed. '.mysqli_error($this->db->conn_id),'error',TRUE); 
} 
+0

実際には、クエリ自体にエラーはありません。私はSQLファイルの内容を渡しているし、それはコマンドラインまたはGUIツールを介して正常に実行されます。 – Erik

関連する問題