読者です 読者をやめる 読者になる 読者になる

Keep It Real BLOG

ソフトウェアエンジニア。1児の父。 酒、ラーメン、サッカー好き。旅行も好きですが、普段は出不精で大抵たまプラーザ界隈に居ます。

Code Igniterでストアドプロシージャを使用するとエラーになる件

f:id:naohide_a:20151202195340j:plain Code Igniterでストアドプロシージャを使用すると、 Commands out of sync とエラーが出る為、調査しました。

結果として、CIのdbdriverにmysqlを設定していること、CIのメインシステムのDBをいじるところに関数を追加することで対処出来ました。 以下が、解決方法です。

application/config内のdatabase.phpで、mysqlをmysqliに変更。

$db['default']['dbdriver'] = 'mysqli';

system/database/drivers/mysqliのmysqli_result.phpに、以下の関数を追加。

    /**
     * Next the result
     *
     * @return  null
     */
    function next_result()
    {
        if (is_object($this->conn_id))
        {
            mysqli_next_result($this->conn_id);
        }
    }

あとは、model側で上記の関数を挟みながら実行するだけです。

$sql = "CALL stad()";
$query = $this->db->query($sql);
$res = $query->result_array();
$query->next_result();
$query->free_result();

return $res;

結構手こずりましたが、これで一応動くようになりました。

あと、これは別件ですが、ストアドでデータを貯めてたりすると、Thread stack overrunで怒られたりします。 その場合は、my.cnf内のthread_stackの容量を増やして上げましょう。