Hatena::ブログ(Diary)

on the center line.

2009-04-22

symfonyのmoveFile()メソッドでファイルが移動できない

| 19:52

symfonyではアップロードファイルを、任意の場所に移動させる moveFile というメソッドがあるのですが、このメソッドは失敗したときにエラーを出してくれない。

$this->getRequest()->moveFile('filename', $destFileName)

なので失敗していて、かつ原因がわからない場合は、lib/symfony/sfWebRequest.class.php

@move_uploaded_file(...

となっているところの「@」をはずしてやるとよい。まあ、大抵はディレクトリパーミッションの問題だったりするんだけど。

2009-01-28

MySQLで、PrimaryKey以外を条件としてINSERT or UPDATE のような事を実現する

| 12:10

MySQLの REPLACE 文は、プライマリーキー(正確にはPrimaryKey、またはUniqKey)を条件にして一致するものがある場合は DELETE&INSERT、一致するものがなければ INSERT のみを行うという事ができるます。

似たような事を行うものとして、Oracleの MERGE 文がありますが、こちらはプライマリーキーでなくとも任意の条件を指定して INSERT、または UPDATE を行うことができます。

さて、MySQL でも PrimaryKey以外を条件に INSERT or UPDATE を行いたい事があったので、やり方を考えてみました(※PrimaryKey は AutoIncrement になっているという前提)。

CREATE TABLE user (
  id INT(11) NOT NULL AUTO_INCREMENT,
  name VARCHAR(30),
  birthday DATE,
  PRIMARY KEY(id)

上のような(id,name,birthday)カラムをもつ user テーブルがあったとき、、

name カラムを条件として、(name,birthday) = ('山田太郎','1980-05-15') のレコードを INSERT or UPDATE するSQLを以下に示します。

REPLACE user
SELECT id,name,'1980-05-15'
FROM dual LEFT JOIN user
ON user.name = '山田太郎'

該当レコードが存在する場合、id の値が入るので普通に REPLACE 文が実行されます。該当レコードが存在しない場合、id が NULL となるためマッピングされるレコードなし→INSERT文が実行される→id は AutoIncrement される、となりINSERTが成功します。

(※'山田太郎'が複数いるケースは考えないです・・

以上で、MySQL の REPLACE 文で PrimaryKey 以外を条件にして更新ができました。

2008-12-29

WindowsのApacheでPHPを動かそうとしたときに、Cannot load mysql extension. といわれた

| 01:37

Windows 上に、Apache + PHP + MySQL の環境を構築していて、ハマった問題と解決策のメモ。

■事象

PHPからMySQLに繋ごうとすると、Cannot load mysql extension.というエラーが発生。Apache のログにも以下が出力されていた。
PHP Warning:  PHP Startup: Unable to load dynamic library 'C:/Program Files/php-5.2.6/ext/php_mysql.dll'
※PHPインストール&設定は、Webなどに掲載されているとおりに正しく実施している

■原因&対策

Windows上でPHPから、MySQLに繋ぐには、適切なバージョンのlibmysql.dll がパスの通ったところになければならない。
普通にWindows用のPHPインストールすると、インストールディレクトリにlibmysql.dll があるので(インストールディレクトリにパスを通していれば)問題にはならないが、この「適切なバージョンの」というところがポイント。
僕の環境では古いMySQLインストールされていて、かつ、そのMySQLがパスの前の方に指定してあったため、別の「libmySQL.dll」が読み込まれて、上記エラーが発生していました。パスの順序を修正して解決。

いやあ、悩んだ・・・orz

2008-12-03

MySQLでNULLを含むカラムにINDEXを張っても大丈夫

| 16:39

「NULLを含むカラムにINDEXを張っても使用されないので、できればNULLを意味するデフォルト値を設定しよう」という記述を何回かみたことがあって、てっきりそうだと思い込んでいました。が、MySQLマニュアルには、

column_name IS NULL  を使用した検索では、column_name  にインデックスが
張られている場合にインデックスが使用されます。
http://dev.mysql.com/doc/refman/4.1/ja/mysql-indexes.html 

と書いてありました。たぶん「NULLが含まれていると駄目な場合もある」のだと思いますが、上記のようなケース(IS NULLの比較)では問題ないようです。

自分で調べてみるものです。

2008-10-07

Eclipseプロジェクト内に、Validate対象外のディレクトリを作る方法

| 16:55

Eclipseプロジェクト内に、Tomcatランタイムを格納すると便利だと思ってやってみたのですが、TomcatのサンプルのWebアプリが検証にひっかかってしまって、Eclipse上に大量のエラーがでてしまいました。

Tomcatのサンプルを捨ててしまうという解決策も考えたのですが、そもそも「Eclipseで特定のディレクトリ以下を検証の対象外とする方法はないのか?」という点が気になったので調べてみました。

結論からいうと、Eclipseの機能としてはない、が少しトリッキーな方法で実現できました。

まず、Eclipseの検証機能ですが、これはプロジェクト単位で有効/無効を切り替えることはできますが、ディレクトリ単位では無理なようです。一方で、Eclipseの機能として「.(ドット)」で始まるディレクトリは管理対象(検証対象)としない、という機能があります。これを利用しました。

つまり、Eclipseプロジェクト内に「.Tomcat」というディレクトリを作りました。そして、その下にTomcat一式を置くと、、、

検証エラーを発生させることなく、Tomcat一式をEclipseプロジェクト内に置くことができました。

ちなみに、「.(ドット)」から始まるディレクトリは管理対象(=検証対象)にはならないのですが、ライブラリ選択や、サーバ選択では普通にでてきました。万事解決。

Connection: close