2006.08.25 Friday
【SQLite】PDOStatementは開放しないとだめなこともある
PHPではリソースの開放をセッション終了時に自動でやってくれますが、場合によっては(DBがらみ)だと途中でやらないとだめなこともありますな!という例を見つけたのでメモとして残しておきます。
基本的にはオブジェクトの開放はPHPに任せた方が良いらしいです
●行フェッチを行った場合、その参照したテーブルを更新するようなSQLがある場合同一トランザクション上では下記のようなエラーで停止しました。
ソースコード抜粋
これは tmp_output テーブル中の[登録時刻]が、$time_close(閉店時間)よりちいさければテーブル内の それ以前の[登録時刻]の値を入れようとした時のものです。カーソルを作った時点でのtmp_outputテーブルでレコードを挿入(置換)しようと しているので、エラーがでるようです。PDOStatementには開放するためのコマンドがないので、普通にいつ開放すべきかを考えていませんでしたが、 この辺は考慮しておく必要があるかなと思いました。このバグを見つけるまでに半日かかりました
自己れすです: PHPのマニュアルサイトに
PDO::query() を次にコールする前に 結果セット内の全てのデータを取得しない場合、そのコールは失敗します。 PDOStatement::closeCursor() をコールし、 次に PDO::query() をコールする前に PDOStatement オブジェクトに関連付けられたリソースを解放してください。
とありました。(汗
基本的にはオブジェクトの開放はPHPに任せた方が良いらしいです
●行フェッチを行った場合、その参照したテーブルを更新するようなSQLがある場合同一トランザクション上では下記のようなエラーで停止しました。
ソースコード抜粋
これは tmp_output テーブル中の[登録時刻]が、$time_close(閉店時間)よりちいさければテーブル内の それ以前の[登録時刻]の値を入れようとした時のものです。カーソルを作った時点でのtmp_outputテーブルでレコードを挿入(置換)しようと しているので、エラーがでるようです。PDOStatementには開放するためのコマンドがないので、普通にいつ開放すべきかを考えていませんでしたが、 この辺は考慮しておく必要があるかなと思いました。このバグを見つけるまでに半日かかりました
自己れすです: PHPのマニュアルサイトに
PDO::query() を次にコールする前に 結果セット内の全てのデータを取得しない場合、そのコールは失敗します。 PDOStatement::closeCursor() をコールし、 次に PDO::query() をコールする前に PDOStatement オブジェクトに関連付けられたリソースを解放してください。
とありました。(汗