2008年12月25日木曜日

Googleみたいに?

PHPのサイトのロゴがクリスマスバージョン...!

2008年12月24日水曜日

RailsとMerbが統合するらしい

「Railsよりお薦め!Rubyのフレームワーク Merb (Mongrel + Erb) をインストール」の記事がなぜか突然人気だなと思ったら、RailsとMerbが統合!するらしい。

DHHがMerbをコアにしてRails3を作るらしいけど、Merbのファサードを絞ったシンプルさが、DHH的な知らないと分からない隠れ規約に飲み込まれないかちょっと心配。

でもMerbもこのままマイナーなままよりはメジャーになった方が、Railsともどもお互い幸せなのかもね。

ついでにWeb Flavorも関係ないけどブレイクしないかな!

あ、Rails2のアプリはまた置き去りにされるのか...。

2008年12月22日月曜日

MySQLの timestampの自動更新ができない場合の修復方法

例えばcreated_atにはINSERT文でvalueにシステム時刻をセットし、updated_atは自動更新させることを想定している場合。

下記のように、間違えてtimestamp型の列を複数定義すると、2つ目以降のtimestampは初期値がオールゼロになり、自動更新もされない。

DROP TABLE IF EXISTS `test`.`members`;
CREATE TABLE `test`.`members` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` text NOT NULL,
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

間違いに気づいて、Query Browserからテーブル定義を変更(created_atをdatetimeにして、updated_atのdefaultにCURRENT_TIMESTAMPをセット)しても、自動更新はされない。
なぜなら、Query Browserからテーブル定義を変更してtimestampにした場合、下記のようにON UPDATEの定義が無いから。
DROP TABLE IF EXISTS `test`.`members`;
CREATE TABLE `test`.`members` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` text NOT NULL,
`created_at` datetime NOT NULL,
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Query Browserは、外部KEY以外のトリガーを作成できない。
なのでSQL文(DDL TDL)で列の定義を修正する。

ALTER TABLE members MODIFY updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP


修正できた。
DROP TABLE IF EXISTS `test`.`members`;
CREATE TABLE `test`.`members` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` text NOT NULL,
`created_at` datetime NOT NULL,
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

参考:MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.1.2 ALTER TABLE 構文

MySQLで Database (Schema)を作成するDDL

よく忘れるのでメモメモ。
文字コードがデフォルトでよい場合は指定不要。

CREATE DATABASE データベース名 CHARACTER SET utf8;

2008年12月6日土曜日

mysql_conncet()で hostを localshotとする場合と127.0.0.1とする場合の違い

PHPのmysql関数の話。PDOを使えば関係ないかも。

mysql_connect()でhostにlocalhostを指定すると接続エラーになり、127.0.0.1を指定すると接続できること(環境)がある。

原因:
mysql_conncet()では、localhostの場合unixソケットを使い、127.0.0.1の場合はTCP/IP接続を使うため、らしい。
(Windowsの場合は実行ファイルの呼び出し???)
参考:codeなにがし::mysql_connect()のホスト名にlocalhostを指定するとソケット接続になる


こちらも参考:MAMP環境CakePHP1.2のbakeでSQL接続エラー - ElectronicBrain is eating BreakFast

ブログ アーカイブ

tags