InnoDBを使えなかったのはMacPortsのMySQLサーバのせいだった
symfonyでInnoDBだ!あれ、MyISAMになってる(id:balibali:20080720:1216521565) ですが、Propelのせいではなく、MySQL側の問題でした。
mysql> CREATE TABLE customers (a INT, b CHAR (20), INDEX (a)) ENGINE=InnoDB; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> show warnings; +---------+------+---------------------------------------------------+ | Level | Code | Message | +---------+------+---------------------------------------------------+ | Warning | 1266 | Using storage engine MyISAM for table 'customers' | +---------+------+---------------------------------------------------+ 1 row in set (0.00 sec)
http://lapangan.net/darwinports/index.php?cmd=read&page=PrivatePortfile%2FSenna-MySQL5
こちらのものを入れて解決しました。
sudo port install mysql5 +server +innodb +utf8
「symfony propel:build-all」も完璧でした。Propelさん疑ってすまんかった。
sfFormのバリデーションエラーメッセージがエスケープされない
公式のドキュメント読みつつ sfForm を試しているのですが、何も考えずに使うとまずそうなのでメモ。
http://www.symfony-project.org/book/forms/1_1/en/02-Form-Validation
ここの例に書いてあるようにテンプレートファイルで、
<?php echo $form ?>
と書いておくと、フォームフィールドと同時にバリデーションのエラーメッセージも自動的に出力してくれるのですが、そのエラーメッセージがエスケープされないのでこのままだとXSS脆弱になってしまうっぽい。
all: .settings: escaping_strategy: true escaping_method: ESC_SPECIALCHARS
は設定しています。
先のドキュメント内の例で言うと、
<?php class ContactForm extends sfForm { public function configure() { // ... $this->setValidators(array( // ... 'message' => new sfValidatorString(array('min_length' => 4), array( 'min_length' => 'The message "%value%" is too short. It must be of %min_length% characters at least.', )), )); } }
カスタムエラーメッセージ内に「%value%」を使っている場合はアウトで、エラーメッセージ内のユーザ入力値がそのまま出力されてしまいました。
この場合は「%value%」使うなで済むかもしれないけど、もっと厄介なのはデフォルトでfalseに設定されいる「allow_extra_fields」というやつ。
バリデーションルールに登録されていないフィールドがリクエストパラメータに含まれているとエラーを出すというもので、これ自体に問題はないというか重要な機能だと思うのですが、問題はこの機能のデフォルトのエラーメッセージ。
このエラーメッセージ内には不正なフィールドの名前が含まれており、以下のようになっている(この例では「is_admin」が不正なフィールド名)
Extra field is_admin.
で、この「is_admin」の部分が「echo $form」とかやってるとHTMLエスケープされずに出力されてしまうと。
んーこれって問題にならないんでしょうかね?
ちなみに、symfony version 1.1.0 です。
symfonyでfreezeだ!
$ pear config-show Configuration (channel pear.php.net): ===================================== ... directory PEAR data directory data_dir /usr/share/php/data ...
$ symfony project:freeze /usr/share/php/data/symfony
unfreezeだ!
$ ./symfony project:unfreeze
失敗例
$ symfony project:freeze data ... Warning: rename(/path/to/project/data/symfony/web/sf,/path/to/project/web/sf): No such file or directory in /usr/share/php/symfony/task/sfFilesystem.class.php on line 189
$ symfony project:freeze /usr/share/php/data ... Warning: rename(/path/to/project/data/symfony/web/sf,/path/to/project/web/sf): No such file or directory in /usr/share/php/symfony/task/sfFilesystem.class.php on line 189
$ symfony project:unfreeze Fatal error: Cannot redeclare class sfCoreAutoload in /path/to/project/lib/symfony/autoload/sfCoreAutoload.class.php on line 28
symfonyでInnoDBだ!あれ、MyISAMになってる
MySQLのストレージエンジンをInnoDBにしようと思って、デフォルト状態の config/propel.ini を開いてみたら、
propel.mysql.tableType = InnoDB
って入ってて、よっしゃそのままいける!と思ったら、
% symfony propel:build-all % mysql -u root sample mysql> show table status\G *************************** 1. row *************************** Name: sample Engine: MyISAM ...
あれれ??
自動生成されたSQLファイル data/sql/lib.model.schema.sql は、「Type=InnoDB」ってなってるんだけどな。
設定漏れ?それとも、InnoDBなCREATE TABLEは自分でやってねってこと?
【追記】MySQL側の問題でした。id:balibali:20080728:1217202505
mysql-serverのパッケージを更新したらなんかメッセージ出た
なんだこれは
$ mysql -u root ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) $ sudo /etc/init.d/mysql status MySQL is stopped.. $ sudo /etc/init.d/mysql start Starting MySQL database server: mysqld. Checking for corrupt, not cleanly closed and upgrade needing tables..
起動して動いているが