InnoDBを使えなかったのはMacPortsのMySQLサーバのせいだった

symfonyInnoDBだ!あれ、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..

起動して動いているが