5

multi_query を使用して、テーブルに対してかなり大量の更新/挿入を実行しようとしています。合計で最大 14,000 のクエリがありますが、関数は最大 480 しか実行されず、エラーなしで停止し、PHP は以下のスニップを超えてスクリプトを続行します。

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);
}
4

1 に答える 1

0

mysqli::multi_query は、最初のステートメントが失敗した場合にのみ false を返します。セット内の他のクエリからエラーを取得するには、最初に mysqli::next_result() を呼び出す必要があります。これは while() が行っていることです。

ただし、mysqli::next_result() は失敗すると false を返すため、ループが終了し、「インポートが完了しました」というメッセージが表示されます。おそらく、成功メッセージを設定する前にエラーをチェックする必要があり、エラーが空白の場合にのみ成功を返します。

以下は、ステートメントの後半にエラーがあった場合、少なくともエラーを表示する必要があります。

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);
}
于 2011-01-25T04:46:37.223 に答える