2010年5月22日土曜日

PHP内でのsql文。。

PHPファイル内で、

$sql="alter table test rename to test2";
mysql_query($sql);
などとすれば(DBへの接続文はここでは省略)、
簡単にデータベースが変更できてしまうのですね。

知識として分かっていましたが、
やってみて、あまりの速さとあっけなさに、驚きを覚えました。

便利でもあり、かなり恐ろしくもあり。

2010年5月19日水曜日

等号記号は、二つで「等しい」の意味でしたね。。

Fatal error: Can't use function return value in write context in
というエラーが出て怒られて、しばし悩んでいました。

一晩寝たら、理由が思いついたのですが、
「=」(等号記号)の使い方間違いが原因でした。

要するに、=をイコール(等しい)の意味で使ってしまっていたので、
if(strlen($text)=7){・・・}
みたいな書き方をしていたのでした。。。

「==」と、二つの等号記号が必要でしたね。
いまだに間違えます。
まあ、小学校の時代から、この記号は「左右が等しい」という使い方をしてきたので、
その癖で書いてしまいますね。

以後、気をつけるべし、自分。

正規表現で、テーブルタグを一掃。

tableタグを一掃したくて、正規表現を書いてみたら、
うまくいったようなのでメモです。

$text="<tr><td><img>";
$pattern="(<t(d|r|able).*?>|<\/t(d|r|able).*?>)";
$result=preg_replace("/$pattern/","",$text);
echo $result;

今、tableで組んだ古いスタイルのサイトをリニューアル中なので、これで一気に取り組めそうです。
正規表現って、すごいすね。

「.*?」という「貪欲でない」正規表現、かなり使えますね。
これがないと、他の部分まで食ってしまう。

以下、PHPマニュアルの参照箇所です。

http://jp.php.net/manual/ja/regexp.reference.repetition.php


(■追記:&nbsp;もたくさん仕込まれていることしばしばなので、ついでに
$pattern="(<t(d|r|able).*?>|<\/t(d|r|able).*?>|&nbsp;)";
としてみました。)

正規表現のエスケープに関してのメモ

PHPにおける正規表現のメタ文字の一覧がマニュアルにあったのでメモです。
http://jp.php.net/manual/ja/regexp.reference.meta.php


[](文字クラス)内にあるかないかで、エスケープする必要のある文字が変わるのは分かっていても、
あやふやだったので、このページが参考になりました。

要するに[]内では、
\と
^と(文字クラス内の最初で使われる場合のみ)
-と
]
の四つだけのようですね。(ほんとかな。。マニュアルにはそう書いてあると自分には読めました。正確にはマニュアルをご参照ください。)

文字クラス内では、その他の文字はエスケープする必要が無い、ということでしょうか。
それなら簡単でありがたいです。

2010年5月17日月曜日

正規表現で、メルアドだけ抜き出したメモ。

正規表現で、以下のように名前の後に<>(小なり、大なり記号)でくくられた形式のメールアドレスを抜き取りたいと思い、うまくいったのでメモです。

「.*?」という正規表現がポイントでした。
「.*」が任意の一文字の0回以上の繰り返しですが、
そのままだと一番最後の「<」のところまでいってしまうので、 「?」をその前に付けてやると、”貪欲でない”選択となって、各><で囲まれた部分部分を抜き出してくれました。 「.*?」、ありがたや。 (以下のアドレスはもちろんダミーです。アットマークも全角文字になっています。)

$text="太郎<a@example.com>, 花子<b@example.com>,";
$text.="次郎 <c@example.com>,良子 <d@example.com>";
$result=preg_replace("/>.*?</",",",$text);
echo $result;

2010年5月14日金曜日

郵便番号データのインポート

郵便番号のインポートをしようと思い、方法を探していたら、以下のサイトが参考になりました。
http://plaza.rakuten.co.jp/pgmemo/diary/200512110000/


LOAD DATA LOCAL INFILE '/path/KEN_ALL.CSV'
INTO TABLE `sample_zip`
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'

というようにクエリを発行する、というのですが、
ローカルのxampp上ではどこにCSVファイルを置き、パスはどのように書くのか、少し迷いました。

で、以下のようにパスを指定したらいけました。
「¥(Web上だとバックスラッシュに化けそうなので、ここでは全角で表記しています。)」にする必要はなく、普通のスラッシュ区切りでいけました。

LOAD DATA LOCAL INFILE 'C://xampp/mysql/KEN_ALL.CSV'
INTO TABLE `zip`
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"';

0.532秒で全件を登録できた、というので、MySQL恐るべし、と感動しました。
(あ、テーブル名もzipに替えてます。念のため。。)

■追記:
データが大きすぎて、全件インポートできていませんでした。。
やはりデータを絞る必要があるかな、と。

お勉強ですな。。

order byの位置に注意。

sql文で、order byの位置を、whereの前に書いてエラーとなり、はまりました。

order byはwhere句の後ろに書かねばなりませんね。
注意すべし、自分。