- お知らせ -
  • 当wikiのプログラムコードの表示を直してみました(ついでに長い行があると全体が下にぶっ飛ぶのも修正)。不具合があればBBSまでご連絡下さい。

PHP/CodeIgniter

はじめに Edit

CodeIgniterのActiveRecordのupdateメソッドでの注意事項について。

whereメソッドを呼び忘れるとテーブル上のデータをすべて上書きしてしまう Edit

$this->db->insert();のつもりでupdateを呼ぶとと、
table上のすべてのデータを上書きしてしまう。
(実は何度もやらかした。怖すぎw 「where呼んでません」くらい警告出でもいいくらい。「updateメソッド書く(whereまだ書いてない)→エディタ保存する→ブラウザ自動更新→テーブル上書きされる→ギャーーース!!」というパターンもあった)

失敗する例その1:

1
2
3
4
$data = array();
# whereメソッドを呼び出していない!!
# なのですべてのテーブルが指定のデータで更新される
$this->db->update('mytable', $data); 

正しい例:

1
2
3
4
$data = array();
# whereでidが一致するもののみ更新
$this->db->where('id', $id);
$this->db->update('mytable', $data); 

また、../ActiveRecordを使っているとクエリー結果がおかしいことがある のActive Recordの構造上の不具合?のような現象が重なると、
気をつけていても起こるので注意。

解決方法 Edit

解決策は、whereを事前にちゃんと呼ぶこと!(あと常にDBのバックアップもとっておくこと)
…なのですが、実はマニュアルにもあるのですが別の解決法があります。

updateメソッドを呼ぶときに、引数でwhereを指定するクセをつけることです。
といっても、引数を省略したらオワってしまうのですが、それはクセをつけるということで。
(うーん、ActiveRecordクラスをオーバーライドして省略できないようにできないものかな??)

引数でwhere指定する例(マニュアルから抜粋):

$this->db->update('mytable', $data, "id = 4");

$this->db->update('mytable', $data, array('id' => $id));

No comment. Comments/PHP/CodeIgniter/ActiveRecordのupdateメソッドでの注意事項?

Name:

Front page   Edit Freeze Diff Backup Upload Copy Rename Reload   New Pages Search Recent changes   Help   RSS of recent changes
Last-modified: 2009-01-20 Tue 14:39:30 JST (3975d)