うめぼしジョイスティック - ivoice

CakePHP、JavaScript、jQuery等のプログラミングについて書いていきます 思考は、うめぼしのように硬く、そして柔らかく。

CakePHPのupdateAllが出来ない時に出るエラーDatabase Error Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column の対処法

qiita.com

ここが参考になります。 というか、このままですが。

ここはハマる人が多そうなポイントなので改めて書いておきます。

一言でいうならば、 リテラル(文字や変数など)を

 '"'.リテラル.'"'

こういうふうに囲まないと、updateAllでは文字列を認識してくれない、ということです。

以下、詳細です。

CakePHP2.x系で、updateAllができない場合があります。

SQLクエリはほとんど合っているのに、 データベースエラーになってしまう。 更新したいカラムの指定がなぜか入力データになっている。

Database Error
Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column '入力したデータ' in 'field list'
SQL Query: UPDATE `データベース名`.`更新したいテーブル名` AS .....

こういうような感じです。

これの原因は、

            $this->モデル名->updateAll(
                    array(
                        'モデル名.name' => $insert['モデル名']['name'],
                    ),
                    array(
                        'モデル名.id' => $id,
                        )
                    );

としてupdate処理を入れたい場合の

$insert['モデル名']['name'],

この部分を

'"'.$insert['モデル名']['name'].'"',

このように変えないといけません。 つまり、文字を入れる場合はクオート処理を手動でしてあげないといけないのです。

これは、CookBookにも書いてあります。すごくさり気なく…

データを保存する — CakePHP Cookbook 2.x ドキュメント

そして、エスケープ処理も入れたい場合は

'"'.Sanitize::escape($insert['モデル名']['name']).'"',

このようにしましょう。

escapeを使う場合は コントローラーの先頭で

App::uses('AppController', 'Controller');
App::uses('Sanitize', 'Utility');

このように宣言するのを忘れないようにしましょう。