CakePHP3.x × AzureSQLでCannot describe XXXXX. It has 0 columns.

Posted in Azure, CakePHP, DB, PHP関連, SQLServer on 9月 6th, 2016 by Site Administrator

CakePHP3.x と AzureSQLの組み合わせで「Cannot describe XXXXX. It has 0 columns.」
というエラーが発生してpaginate等ができない場合の話。

app.phpのDatasourcesの設定で、’database’と共に’schema’も設定するとエラーが解消する。
CookBook読む限りだとPostgreSQL用の設定のようだが、SQLServerでも設定は有効。

CakePHP 2.3.3 →以前のバージョンはとてつもなく危険。すぐアップデートすべき。

Posted in CakePHP, PHP関連 on 4月 26th, 2013 by Site Administrator

CakePHP2.3.3が先日リリースされましたが、これ以前のバージョンを使用している方は即適用すべきです。
適用できないなら即対応策を考えるべきです。

具体的なコードはあえて書きませんが、非常に簡単な手順で認証が突破されてしまいます。

「From認証を使用し、かつSecurityComponentを利用していない環境で発生する」とアナウンスされてますが、
SecurityComponentを使っていても発生しました。

2.2.x以前でも発生するかはまだ確かめてません。

対応策はこんなところでしょうか
1.カスタム認証ロジックを組み込む または
2.2.3.3にアップデート

急ぎましょう。本当に危険!

<追記 2013/04/26 15:21>
Version2.2.7で、同様の方法では認証が突破されないことを確認しました。
2.3系だけの問題のようです。

CakePHP 2.2.2 SessionをDBに格納する場合のPHPUnitエラー

Posted in CakePHP on 9月 28th, 2012 by Site Administrator

MissingTableException
Table cake_sessions for model Session was not found in datasource test.

「cake_sessions」テーブルを、testデータベースに作成すると回避できる

CakePHP 2.2.0-RC1 ValidationでのallowEmptyの挙動

Posted in CakePHP, PHP関連 on 5月 25th, 2012 by Site Administrator

Validation設定時に、パラメータに「allowEmpty」というものがあります。

データが入力されていたらチェックする、入力が無ければ検証は無視する、というような場合にtrue

を指定したりするのですが、2.2.0から初期値が変更になったようです。

これまで:null

新:false

明示的に指定していない場合、フレームワークの更新で挙動が変わる場合があるので要チェック。

 

CakePHP 2.0 初期設定 自分メモ

Posted in CakePHP, PHP関連 on 2月 7th, 2012 by Site Administrator

2.1.0betaでの設定

○初期
01.CakePHP展開
02.DB、DBユーザ作成
03.database.php.defaultを名前を変えてdatabase.php作成
04.database.php修正
05.core.phpのSecurity.salt、Security.cipherSeed修正
06.http://(展開先)/にアクセスし、確認事項が全て緑色であることを確認

07.MenusController.phpを追加(var $uses = null;)
08.app/View/Menus/home.ctpを追加(中身は空でOK)
09.config/routes.ctpを修正
○削除
Router::connect(‘/pages/*’, array(‘controller’ => ‘pages’, ‘action’ => ‘display’));

○修正
Router::connect(‘/’, array(‘controller’ => ‘pages’, ‘action’ => ‘display’, ‘home’));

Router::connect(‘/’, array(‘controller’ => ‘menus’, ‘action’ => ‘home’));

○DebugKit追加
01.appPluginに「DebugKit」という名前で展開
02.app/View/Layouts/default.ctp作成
03.「element(‘sql_dump’); ?>」を削除
04.AppController.phpに「public $components = array(‘Session’,’DebugKit.Toolbar’);」を追加
05.config/bootsrap.phpに「CakePlugin::loadAll();」を追加

○初期ユーザー追加
01.usersテーブル作成(username,passwordを最低限含む)
02.bakeでusersテーブルに対するcontroller,model,viewを作成
03.http://(展開先)/users/indexにアクセスしuserテーブル一覧が表示されることを確認

04.UsersControllerに「public function login(){}」を追加
public function login(){
if ($this->Auth->login()) {
$this->redirect($this->Auth->redirect());
} else {
$this->Session->setFlash(__(‘Invalid username or password, try again’));
}
}
05.app/View/Users/login.ctpを追加
Session->flash(‘auth’);
echo $this->Form->create(‘User’, array(‘action’ => ‘login’));
echo $this->Form->input(‘username’, array(‘label’=>__(‘Login Name’)));
echo $this->Form->input(‘password’);
echo $this->Form->submit(__(‘Login’));
echo $this->Form->end();
?>
06.AppController.phpの$componentsに下記を追加
‘Auth’ => array(
‘loginRedirect’ => array(‘controller’ => ‘menus’, ‘action’ => ‘home’),
‘logoutRedirect’ => array(‘controller’ => ‘users’, ‘action’ => ‘login’)
)
07.UsersController.phpに下記追加
function beforeFilter() {
$this->Auth->allow(‘add’);
}
08.http://(展開先)/users/addにアクセスし新規作成画面が表示されることを確認(ほかの画面にアクセスすると、ログイン画面に飛ばされる)
09.User.phpに下記を追加
public function beforeSave() {
if (isset($this->data[$this->alias][‘password’])) {
$this->data[$this->alias][‘password’] = AuthComponent::password($this->data[$this->alias][‘password’]);
}
return parent::beforesave();
}
10.http://(展開先)/users/addにアクセスしユーザーを登録
11.http://(展開先)/menus/homeにアクセス。ログイン画面に遷移するので、登録したユーザーでログインできることを確認
12.UsersController.phpのbeforeFilter内の処理をコメントアウト

CakePHP 2.0.4 Model->createの処理

Posted in CakePHP on 12月 14th, 2011 by Site Administrator

`record_status` int(11) NOT NULL DEFAULT ‘0’,

のようにDBのカラムの初期値にDEFAULTを設定している場合、
Model->create()を実行した時点でModel->dataにrecord_status=0が設定されます。
結果として、もしも「record_status」のフィールドがPOSTされなかった場合でも
saveした際にrecord_status=0が保存されます。

実はupdate処理で、一部間違ってModel->createを実行している個所があったのですが、
なぜかPOSTしていないフィールドなのに初期値でデータが上書きされるということが発生して
いました。
Model->createはinsertの際のみ実行すべきなのでそもそものミスだったわけですが、
insertの際におまじないのようにしているcreateが実はこんなことをしているということで
参考までに。

CakePHP 2.0 AuthComponent userScope→scope

Posted in CakePHP on 11月 22nd, 2011 by Site Administrator

Authコンポーネントで、認証対象のレコードの取得条件を追加で設定する場合は
1.3まではuserScopeを設定していましたが、2.0からは「scope」と変更になったようです。

CakePHP 2.0 DebugKit導入

Posted in CakePHP on 11月 10th, 2011 by Site Administrator

CakePHP 2.0 系でもDebugKitは使用できます。
導入手順も変わりませんが、よく忘れるのでメモ。

1.ダウンロード(2.0系用のDebugKitをダウンロードする必要あり)
2.app/Pluginに格納
3.app/Controller/AppController.phpに下記を追加
public $components = array(‘DebugKit.Toolbar’);
4.viewでsql_dumpを使っている場合は記述を削除(※default.ctpでデフォルト使用されてます)

CakePHP 2.0.2 paginate whitelistの仕様

Posted in CakePHP on 11月 4th, 2011 by Site Administrator

paginateの第3引数のwhitelistについて。

1.3までは「urlパラメータで指定されるpaginateオプションのうち、どれを有効にするか」を指定するものでしたが、
2.0では「並び替え(sort)で指定できるカラム名」となった模様です。

たとえばarray(‘id’)と指定すれば、urlに「/sort:name」と指定しても、nameでソートされないようになります。

1.3まではurlパラメータでlimitを使用してpaginateの件数が変更されないように、whitelistに許可とするパラメータ
(order、page)のみ指定していたのですが、2.0からはこのような制御はどのようにすべきなんでしょうか?
maxLimitというオプションが追加されたので、urlから膨大な数のlimitを指定されるというリスクは無くなったわけですが・・・。

追記:
PaginatorComponentのソースを見てみました。
whitelistですが2種類ありまして、下記の使い分けがされてました。
1.PaginatorComponentのパブリック変数のwhitelist
→urlパラメータで許可されるnamedパラメータ、原則変更できない(libのソース修正となる?)
‘limit’, ‘sort’, ‘page’, ‘direction’の4つが許可されている。

2.Paginator->paginateの第3引数のwhitelist
→sortの際に許可されるカラム

CakePHP 2.0.2 これまでとの違い

Posted in CakePHP on 10月 28th, 2011 by Site Administrator

・AppController.php、AppModel.phpなどの置き場所が、app直下から変更になった。
・controller、component等のファイル命名規則変更
・独自ComponentはComponentクラスを継承
・viewでhelperを使うときは、$this->○○Helper-> のように$thisから始める
・__() (二つのアンダースコアでのショートカット関数)の第2引数が変わった

・Paginator->sortの引数が変更に

・AuthComponentからloginErrorがなくなった

既存システムの移行は大変そうです。