CakePHP:データベースが更新されない時の対処方法

CakePHPで開発をしている時にデータベースの一部のデータが更新されないということがありました。

データベースのフィールドを追加し、CakePHPでデータを更新すると新しく追加したフィールドだけが更新されないのです。
しかし、他のフィールドは正常に更新されます。

どこか間違えている箇所があると思い、何度もソースを見直したのですが、原因が分からずにいました。

なので「app」配下のディレクトリを一つ一つ確認していたら、怪しいと思ったファイルを発見しました。
下記のディレクトリ内にデータベースのテーブル構造を格納するモデルキャッシュファイルがあったのです。

app/tmp/cache/models

そのキャッシュファイル削除したら正常にデータが更新されました。

忘れないように、下記にCakePHPデータベース更新されない時の対処方法をメモします。


データベースが更新されない時の対処方法

CakePHPではデータベースのテーブル構造を格納するキャッシュファイルが作成されます。
データベースのフィールドを追加した場合、キャッシュファイルが前の情報のままだとデータが正しく更新されません。

その際は下記のディレクトリのキャッシュファイルを削除します。

app/tmp/cache/models

削除すると新しいキャッシュファイルが作成され、正常に更新することができるようになります。


CakePHPでデータベースのテーブルの構造を変更した場合は、キャッシュファイルを削除するのが良いと思います。

CakePHP:CakePHPで静的ページを追加

CakePHP静的ページを追加する場合、「app/views/pages」か「app/webroot」の下にフォルダやファイルを配置すると思います。

今回、「app/webroot」の下に静的コンテンツを追加した時に困ったことがあったのでメモします。


CakePHPで静的ページを追加「app/webroot」

「app/webroot」の下に追加したいコンテンツを設置します。

/app/webroot/hoge/index.html

下記のようにアクセスした場合は正常にページが表示されます。

http://ドメイン/hoge/index.html
http://ドメイン/hoge/

しかし、最後の「/」をなしの状態でアクセスすると、
下記のように「app/webroot」が付いたURLにリダイレクトされてしまいました。

http://ドメイン/hoge

↓(リダイレクトされてしまう)

http://ドメイン/app/webroot/hoge/

上記のように「app/webroot」がついたURLにリダイレクトされたくなかったので、
ドキュメントルートの直下に置いてる「.htaccess」を変更して下記のように対処しました。

<IfModule mod_rewrite.c>
   RewriteEngine on
   RewriteRule    ^hoge$ /hoge/index.html [R=301,L]
   RewriteRule    ^$ app/webroot/    [L]
   RewriteRule    (.*) app/webroot/$1 [L]
</IfModule>

下記の一行を追加しました。
「hoge」でアクセスした場合、「hoge/index.html」にリダイレクトするようにしています。

   RewriteRule    ^hoge$ /hoge/index.html [R=301,L]

ただ、これだと「http://ドメイン/app/webroot/hoge/」でアクセスした時にページが表示されてしまいます。

色々調べていて下記のサイトを発見しました。
参考になりました。ありがとうございます。

CakePHP 静的コンテンツのURLについて | Fusic Developers Weblog

「app/webroot」の直下にある「.htaccess」を下記のように変更しています。

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
    RewriteCond %{THE_REQUEST} "^(.+?) (.*?)/app/webroot/(.*?) (.+?)$"
    RewriteRule ^(.*?)$ %2/%3 [R=301,L,NE]
</IfModule>

下記の二行を追加しています。

    RewriteCond %{THE_REQUEST} "^(.+?) (.*?)/app/webroot/(.*?) (.+?)$"
    RewriteRule ^(.*?)$ %2/%3 [R=301,L,NE]

「app/webroot」がある場合、「app/webroot」を省いたものでリダイレクトするようです。

上記の設定をすると「app/webroot」がついたURLでアクセスした際に、
リダイレクトされてアクセスすることができました。


上記以外にも他に良い方法があれば知りたいです。

CakePHP:CakePHPでBasic認証を簡単に設定

CakePHPコントローラーごとにベーシック認証をかけたい場合、
Securityコンポーネントを使用すると簡単に設定することができます。

通常、Basic認証は「.htaccess」で設定しますが、
「.htaccess」を使用しないで設定できるのでとても楽です。

サイト全体に設定せずにコントローラーごとに設定したい場合などは良いと思います。

下記にCakePHPSecurityコンポーネントを使用してコントローラーごとにベーシック認証を設定する方法をメモします。


CakePHPでBasic認証を設定

Basic認証を使用したいコントローラーに下記の設定をします。

コントローラー(Controller)

Securityコンポーネントを使用するよう呼び出します。

class SampleController extends AppController {
	// Securityコンポーネント
	var $components = array('Security');

}

共通処理のbeforeFilter()にBasic認証の設定をします。

	function beforeFilter() {
		parent::beforeFilter();

		// Basic認証の設定
		$this->Security->loginOptions = array('type' => 'basic');

		// ユーザー名、パスワードの設定(複数可能)
		$this->Security->loginUsers = array('hoge' => 'password');

		// 全てのアクションに設定
		$this->Security->requireLogin('*');
	}

上記の設定をするだけなので簡単にBasic認証を設定することができます。
また、アクションごとにも設定することができるので便利です。

CakePHP:save()メソッドを使用し、データの登録・更新

CakePHPでデータの登録、更新をする場合にsave()メソッドを使用してデータを保存します。
save()メソッドは使い方によって「insert」または「update」のSQLを実行します。
今回はCakePHPのsave()メソッドを使用しデータを保存した時のメモを記載します。


CakePHP save()メソッド

データを保存する為のメソッドです。


「insert」登録する場合

save()メソッドを使用してデータを新規登録するには、登録するテーブルの主キーを設定せずに登録するデータを用意すれば「insert」できます。
※主キーが「id」の場合

新規にデータを登録するには、下記のように設定します。

	// 登録する内容を設定
	$data = array('Hoge' => array('name' => 'hoge', 'status' => 1));

	// 登録する項目(フィールド指定)
	$fields = array('name', 'status');

	// 新規登録
	$this->Hoge->save($data, false, $fields);

nameが’hoge’でstatusが1のデータを新規登録します。


「update」更新する場合

save()メソッドを使用してデータを更新するには、テーブルの主キーの値を設定してデータを用意すれば「update」できます。
※主キーが「id」の場合

idが1のデータを更新する場合、更新するデータでid(主キー)を設定します。
下記はidが1のデータのstatusを更新しています。

	// 更新する内容を設定
	$data = array('Hoge' => array('id' => 1, 'status' => 2));

	// 更新する項目(フィールド指定)
	$fields = array('status');

	// 更新
	$this->Hoge->save($data, false, $fields);

主キーを設定した場合は、データを更新することができます。


CakePHP:CakePHPで$_GETの値を取得

CakePHPで$_GETの値を取得する方法を記載します。
CakePHPでは$this->params[‘url’]に格納され、$_POSTの値は$this->params[‘form’]に格納されます。
CakePHPではGETやPOSTの値はparams配列に格納されます。


■ $_GETの値を取得する

下記のURLでアクセスした場合

http://raining.bear-life.com/?id=20&name=hoge

「id」の値を取得

$this->params['url']['id'];

「20」が取得できます。


「name」の値を取得

$this->params['url']['name'];

「hoge」が取得できます。

※$this->params[‘url’]では$_POSTの値が取得できないので注意です。