TechNote

とあるエンジニアのただのメモ

CakePHPでupdateAllを使うとエラーが出る場合の対処方法

CakePHPを使い始めて2日目ですが、データベースに問い合わせる際、まともにSQL文を書く機会は今のところなく、ほとんどが抽象化された機能だけで済んでいます。findメソッドやsaveメソッドがその代表例。

テーブルをupdateしたい場合やinsertしたい場合は、saveメソッドひとつで済むみたいですが、どうも自分の試している状況ではうまく動かなかったので調べてみました。すると、ある事実が判明。

updateAllはクォート処理、サニタイズ処理をしてくれないから自分でする必要あり!

例えば

user_id, content_id, memotext, created というカラムを持つテーブルの更新を考えます。 主キーはuser_id, content_idの複合キーです。

この場合、ふつうに考えると下記のような感じで動くかと思われます。

//wrong sample
$data = array('memotext'=>$memotext, 'created'=>date('Y-m-d H:i:s'));
$conditions = array('user_id'=>$user_id, 'content_id'=>$content_id);
$this->modelname->updateAll($data,$conditions);
 

ですが、これでは動きません。

答えはこうです。

//right sample
$data = array('memotext'=>"'".$memotext."'", 'created'=>"'".date('Y-m-d H:i:s')."'");
$conditions = array('user_id'=>$user_id, 'content_id'=>$content_id);//条件文はそのままでOK
$this->modelname->updateAll($data,$conditions);
 

ということでまとめると、saveメソッドでは済まされない場合があり、その場合はupdateAllを使用する、そしてupdateAllを使用する際はダブルクォーテーションやシングルクォーテーションで囲ってやる必要がある、というメモでした。

そして条件文は気を使わなくてOKというところも、初めてCakePHPを触るひとにはわかり得ないところですね。

こんなにCakeの情報はあふれているのに意外に見つからなかったのでメモを残した次第です...。

PHPフレームワーク CakePHP 3入門

PHPフレームワーク CakePHP 3入門

CakePHP 超入門

CakePHP 超入門

CakePHPで学ぶ継続的インテグレーション

CakePHPで学ぶ継続的インテグレーション

Webアプリ開発を加速する CakePHP2定番レシピ119

Webアプリ開発を加速する CakePHP2定番レシピ119