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.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内の処理をコメントアウト

PHP 5.3.7 crypt関数の脆弱性

Posted in PHP関連 on 8月 25th, 2011 by Site Administrator

こちらに詳細がまとめられています。
crypt関数が空のハッシュ値を返却してしまうという致命的なバグです。

PHP 5.3.8も公開されたとのことで、該当される方は早急にアップデートを。

Windows Azure Eclipse PDTでのPHPプロジェクト開発手順

Posted in Azure, OS関連, PHP関連, 開発関連 on 7月 27th, 2011 by Site Administrator

http://msdn.microsoft.com/ja-jp/windowsazure/hh240574

こちらに手順がまとめられています。
私はPleiades 3.7を使って構築を行いました。

CakePHP (1.3.8) SimpleTest(1.01)で、初期recordsの動的変更

Posted in CakePHP, PHP関連 on 4月 13th, 2011 by Site Administrator

SimpleTestを使ってテストを行うとき、fixtureに$recordsとして配列を設定しておけば
テストテーブルに初期レコードを各テスト毎に自動で挿入してくれます。
testアクション毎に初期レコードを変えたいことがあったのですが、よい方法が見つからなかったので
データを更新するメソッドを差し込みました。
CakeTestCaseを継承したクラスAppCakeTestCase を作成し、更新メソッドresetRecordsを用意します。

class AppCakeTestCase extends CakeTestCase {

	var $name = 'AppCakeTestCake';

	function resetRecords($fixtureIndex, $recordsArray)
	{
		$fixture = clone $this->_fixtures[$fixtureIndex];
		$fixture->records = $recordsArray;
		$fixture->truncate($this->db);
		$fixture->insert($this->db);
	}
}

呼び出し元はこんな感じ。

require_once TESTS . 'app_cake_test_case.php';
App::import('Model', 'TestSample');

class TestSampleTestCase extends AppCakeTestCase {
	var $fixtures = array('app.test_sample',
	);

//省略

	function testTest1() {
		$this->resetRecords('app.tmp_pt_status_positive', array(差替えデータ));

//省略

		$this->assertEqual($expected, $result);
	}
}

ionCube PHP Encoder 6.5→7.0 upgrade

Posted in PHP関連, 開発関連 on 3月 31st, 2011 by Site Administrator

7.0が知らぬ間にリリースされていました。

昨年4月にversion 6.5を日本代理店を通さず、本家からダウンロード販売で購入したのですが、
本家に問い合わせてみると
「旧バージョンのライセンスを削除したら無償でアップグレードしてあげる」
とのこと。さっそくupgrade対応をしてもらいました。

主な変更点はPHP5.3への対応。なお、新バージョンでencodeを行う場合は、
サーバ側のローダーをversion 4.0以降に更新する必要があります。
5.3を使った開発をする場合はローダーの更新も必須ですが、今回の7.0では「6.5互換モード」
が用意されています。PHP5.3未満のencodeが対象となりますが、この互換モードで
encodeした場合はサーバ側のローダーの更新は必要ありません。旧バージョンのままでOKです。

Encoderのupgradeによって旧バージョンのローダーの更新も必須になるのであれば、
正直なところ既存プロジェクトのリリース作業に大きな影響がでるところでした。
当面私のところでは5.3でのencodeは使用しませんが、とりあえずupgradeできて良かったなと。

CakePHP Eclipseでの設定

Posted in CakePHP, PHP関連, 開発関連 on 2月 16th, 2011 by Site Administrator

http://d.hatena.ne.jp/ngtn/20080204/1202142255

Eclipse上でCakePHP関連のコード補完を有効にするための設定について詳しくまとめてあります。
View内でのHelper、Controller内でのModelなどのコード補完をしたい方はぜひ参考に。

CakePHP (1.3.7) 例外処理とautoRender

Posted in CakePHP, PHP関連 on 2月 10th, 2011 by Site Administrator

ポリシーとして
「処理例外は原則上位にthrowし、controllerのactionでログ出力等の例外処理を行う」
という形で開発を行っています。

各actionメソッドにtry-catchを仕掛けるイメージです。
model・controllerで発生した例外についてはきちんとcatchできるのですが、
viewで発生した例外についてはcatchできません。
標準状態ではautoRenderがtrueになっており、action完了後にviewのrenderが自動で行われます。
当然ながらactionに仕掛けたtryブロックの外で発生した例外はcatchできない、ということになります。

viewのrender時に発生する例外についても洩れなくcatchしたいため、AppControllerで
var autoRender = false;
として、各controllerのactionのtryブロックの最後で
$this->render();
と明示的に記述するように最近はしています。
こうすればrender時の例外はtryブロックの内部で発生することとなるので、きちんとcatchできます。