<   2008年 10月 ( 12 )   > この月の画像一覧
(PHP)日本語メール送信
レンタルサーバ上でのメール送信フォーム作成メモです。

phpにはデフォルトでsendmailが扱えるようになっているらしいですが、Windowsだとphp.ini,Linuxだとsendmail_pathの設定等が必要ですが、基本的にレンタルサーバ側がこれらを設定しててくれてるはずです。(アイルだとそうでした)

ということでPHP側からのメール送信は非常に簡単です。
基本的に mb_send_mail 関数を使うだけでOKです。

そのまま送ると送信元が、nobody@shared-server.netとかになっていたので、送信元の書き換えです。
mb_send_mail関数の第4引数にメールヘッダを設定できるみたいなので "From:送信元アドレス" で送信元のアドレスを変更します。なお、送信元アドレスのコメントに日本語を使うには mb_convert_encoding で文字コートをJISに変更した後、mb_encode_mimeheaderでMIMEエンコードしてやる必要があるようです。

(どっかで本文もMIMEエンコードが必要だとかあった気がしますが、それをしなくてもできたのでOKとします。)


//mb系関数を使うための前処理
mb_language("Japanese");
/* 内部文字エンコーディングをUTF-8に設定 */
mb_internal_encoding("UTF-8");
 
//メール送信

$mailTo = "info@example.com";
$mailFromAddr = "<info@example.com>";
$mailSubject = "メール題名";
 
//送信元に日本語付加

$mailFrom = mb_encode_mimeheader(mb_convert_encoding("【自動送信フォーム】","JIS","UTF-8")). $mailFromAddr;

 
//メール本文。
$mailBody = "メール本文。";
 
//メール送信(送信先、 件名、 本文、 送信元)
if( mb_send_mail( $mailTo , $mailSubject , $mailBody ,"From:" . $mailFrom ) ){

//メールが正常に送れたら
$res = "送信成功";
}else{
//メールが送れなかったら
$res = "送信失敗";

}
 
echo $res;


参考:
PHPで日本語メールを送る - 基本編
PHPでメール送信

[PR]
by jehoshaphat | 2008-10-28 11:10 | PHP開発 | Trackback | Comments(0)
(PHP)入力チェックを行うためのいろいろな正規表現
Webで入力された情報のチェックを行うための正規表現のまとめです。

ちなみに、こちらのサイトでオンラインで正規表現のチェックができます。
簡単に評価できるので非常に助かってます。

カタカナ(全角)入力

preg_match( '/[ァ-ヶ]+/',$text )

このァかヶの範囲は文字コード表を見るとわかります。
※追記
この方法だとうまくいきませんでした。
ということで、mb_eregを使って、こういう方法で。
mb_regex_encoding("UTF-8");
mb_ereg( "^[ァ-ヶ]+$" , $message );

参考:全角カタカナにマッチする正規表現

※さらに追記(2008/11/11)
cakePHPのバリデーションでは上の方法でうまくいかない場合がありました。
それでこちらを参考に下記のようにしたらうまくいきました。

/^(?:\xE3\x82[\xA1-\xBF]|\xE3\x83[\x80-\xB6])+$/



メールアドレス
正確にはメールアドレスに完全に一致する正規表現は無いようです。(特に携帯電話キャリヤやプロバイダによってはRFCに定義されてないメールアドレスも許可してるところもあるようで。。)

かといって何でもOKにするのはまずいので大まかなチェックはさせないとだめですね。

ということでこちらを参考にOSSのPEARのメールチェック正規表現を参考にさせてもらいました。


preg_match("/^((\"[^\"\f\n\r\t\v\b]+\")|([\w\!\#\$\%\&\'\*\+\-\~\/\^\`\|\{\}]+(\.[\w\!\#\$\%\&\'\*\+\-\~\/\^\`\|\{\}]+)*))@((\[(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))\])|(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))|((([A-Za-z0-9\-])+\.)+[A-Za-z\-]+))$/", $text )



電話番号チェック(-付)
こちら参考にまず一般電話の正規表現。
preg_match( "/^(0(?:[1-9]|[1-9]{2}\d{0,2}))-([2-9]\d{0,3})-(\d{4})$/" , $message )

(これだけだと桁数に関係なく入力できてしまうので、番号の計が10桁の確認が別途必要なるようです。)
そして、携帯電話の正規表現。

preg_match( "/^0[57-9]0-\d{4}-\d{4}$/" , $message )

これは比較的シンプルですね。

郵便番号チェック(-付)

preg_match( "/^[0-9]{3}-[0-9]{4}$/" , $message )

これもシンプルです。
参考:郵便番号をチェックする正規表現


なお、PHPでUTF-8環境下で正規表現を行うには「mb_ereg」じゃなくて「preg_match」を使うのが吉といことがmb_eregよりもpreg_matchがいいの?に書かれていましたので注意しましょう。mb_eregでも、mb_internal_encoding、mb_http_output、mb_regex_encodingをUTF-8に指定すればうまくいくことがコメント欄にかかれてました。時間あれば実際に評価してみたいとおもいます。(当分難しいでしょうが。。)
[PR]
by jehoshaphat | 2008-10-28 10:40 | PHP開発 | Trackback | Comments(0)
(PHP)UTF8でBOMがあるとブラウザ表示時レイアウトがおかしくなる
わかってみれば単純なことなのですが、わかるまで半日を費やしてしまったのでメモしときます。


SmartyでUTF-8で書いたテンプレートやら、PHPをIE7で表示したらレイアウトが崩れてしまいました。
どうやらCSSで定義してる幾つかが適用されていないみたいです。

SmartyのテンプレートやPHPがUTF8の場合、BOM(Byte Order Mark)付きで保存しているとおかしくなるというのはネットで探して見つけたので、両方のファイルともBOMなしで保存しましたが、結果変わらず。。。

おかしいと思い、IE7で表示されたソースをHTMLファイルとして保存し、DIFFツールでSmartyのテンプレートファイルと比較すると、ファイルの先頭に空白らしきものがあるのが発見。

まさかと思い保存したHTMLファイルをバイナリエディタで確認すると、案の定BOMが付いていました。
しかもなぜか2つも。。
こんな感じです。(BOMは16進数で EF BB BF です)
e0091163_23361310.jpg


元になっているファイルとSmartyコンパイル後のPHPファイルははBOM無しを確認したのですが、なぜかIEに転送されてきたときはBOMが付いているのです。
そしてBOMが2つもついてる故にIE7は本来ファイルの先頭にあるDOCTYPEを認識できず、互換モードで動いてしまいCSSが解釈できなかったということみたいです。
(ちなみにDOCTYPEとブラウザの表示モードについては、DOCTYPE宣言がないとIE7でも表示は古いままDOCTYPE スイッチについてのまとめと一覧表を参照のこと)

どの部分でBOMが付いたのかは不明です。

対処法ですがBOMの削除を参考にさせてもらいました。

ob_clean(); //バッファクリア。これで出力時のBOMがのくらしい。
$smarty->display("support_connect_confirm.tpl");


このように ob_clean(); でバッファをクリアすると正常に表示されるようになりました。

追伸:
BOMが2回でる理由がわかりました。require_onceしてある自作共通モジュールファイルがBOM付きでした。
ということで、ob_clean();をいれなくてもPHP内でよみこんであるファイルのBOMをのぞくだけでOKみたいです。
[PR]
by jehoshaphat | 2008-10-26 23:44 | PHP開発 | Trackback | Comments(0)
(cakePHP) selectタグを作りたい
HTMLヘルパーで select タグを表示させる方法です。マニュアルには載ってませんでした。
ほぼリンク的感じですが、cakepPHP先輩方に感謝です。

HTMLヘルパーに selectTag というのがあるのでこれを使うようです。

HtmlHelper::selectTag (
$fieldName, // フィールド名。コントローラからは、$this->params['data']で取得できる。
$optionElements, // 選択項目の名称 'array("1","2","3")など。'
$selected = null, // 何番目が選択状態か(整数 or null)
$selectAttr = array(), // SELECTエレメントの属性'array('onChange'=>'return this.form.submit();', 'class' => 'cssclassname') など。'(これがよくわからん)
$optionAttr = null, // OPTIONエレメントの属性。$selectAttr と同じ方法。
$showEmpty = true, // 空項目を出力するか
$return = false // true にすると、echo ではなく、return でデータが返る。
)



要は $optionElements に選択項目、 $optionAttr に optionタグの value が入るといった感じみたいですね。

そしてModel側から$optionElementsを使うには
$this->モデル単数名->generateList()
でできるみたいです。
ただし、これは cakePHP 1.1 の場合で 1.2 からはgenerateList()が非推奨になっているため find('list') を使う方法が推奨されてます。

1.1で find('list') を使ってみましたが、SQLのエラーが出ました。やはり1.2からじゃないと使えない?

generateList()は結構癖があるようです。
引数としては
$this->Model->generateList($conditions, $order,$limit, $keyPath, $valuePath);
$coditions :検索条件
$order :ソートの指定
$limit :取り出す数
$keyPath :配列のキーにするフィールド
$valuePath :配列の値にするフィールド
この$keyPath と $valuePath は {n}.Model.field というように {n} が必要だそうです。
ということが、CakePHP Model::generateList メソッドの {n}に書かれてます。



ということで都道府県テーブル(prefs)からselectタグを表示する例です。( generateList()の場合 )

//****コントローラ側の記述****
//検索条件、ソート、取り出す数は指定しない。キーはid , 値はname
$prefs = $this->Pref->generateList("", "" , "" , "{n}.Pref.id", "{n}.Pref.name");
//ビューにセット
$this->set('prefs', $prefs);
 
//****ビュー側の記述****
//特に指定してないため初期値は空白値。結果は Member/pref_idに 入る。
<?php echo $html->selectTag('Member/pref_id', $prefs , null , null, null); ?>


参考:
SelectTag の使い方 cakePHPのフォーラムにて、selectTagの引数説明や取得方法について投稿されてます。

CakePHP HTMLヘルパーで select タグを表示する
selectTagについてかなりわかりやすく書かれてます。
モデルの指定列からselectタグを作るのに便利な方法 1.2でselectタグ作るときの方法について分かりやすく説明されてます。
find('list')に少々ハマる1.2でfind('list')を使うときの注意点です。
[PR]
by jehoshaphat | 2008-10-23 14:54 | PHP開発 | Trackback | Comments(0)
(PHP)Eclipse(PDT)でcakePHPでも使えるデバッガ導入メモ
PDT環境でのデバッグ方法探してたところ、ねねとまつの小部屋さんのところで構築方法が紹介されていました。
下記の2つの記事で構築方法が紹介されています。
CakePHPの試食前に、EclipseでPHPの開発環境を整える
【CakePHP】Eclipse+PDT+Xdebugを使ったデバッグ方法について、画面付でまとめみる
この記事を元に自身の開発環境にてデバッガをいれた手順を下記にメモしときます。


PHPのデバッガにはZend DebuggerとXdebugがあるみたいですが、Zendのほうはmod_rewriteが有効だとうまくいかないということで、cakePHPのデバッグには使えないの却下します。

Xdebugは下記サイトよりダウンロードできます。
http://www.xdebug.org/index.php
ここで、ダウンロードするのは「Windows modules:」から対応したPHPのバージョンのDLLです。

ダウンロードした php_xdebug-2.0.3-5.2.5.dll を php.ini で指定しているextensionディレクトリに配置します。
(php.iniで extension_dir ="C:\Program Files\PHP\ext" と定義しているディレクトリです。)

次に、php.iniに下記のデバッグの設定を記述します。
(もしZendDebuggerの設定が書いてる場合はそれをコメントアウトします)

[xdebug]
zend_extension_ts="C:\Program Files\PHP\ext\php_xdebug-2.0.3-5.2.5.dll"
xdebug.remote_enable=1
xdebug.remote_handler="dbgp"
xdebug.remote_mode=req
xdebug.remote_host="localhost"
xdebug.remote_port=9000
xdebug.remote_log="C:\Program Files\Apache Software Foundation\Apache2.2\logs\xdebug.log”
xdebug.manual_url = "http://jp2.php.net"
xdebug.collect_params = On
xdebug.dump.GET = *
xdebug.dump.POST = *


Eclipseの設定方法です。
メニューバーの「実行」→「デバッグ・ダイアログを開く」から「PHP Web Page」を選択します。
初期状態だと「PHP Web Page」配下になにもないと思うので「PHP Web Page」をダブルクリックし、新規の構成を作ります。

ここで、下記の設定を行います。
「サーバ・デバッガ」を「Xdebug」に変更。
「ファイル」でデバッグしたいPHPファイルかパスを選択(webサーバから見たパスです。たとえばcakaPHPプロジェクトでhttp://xxx.com/postsをデバッグしたいと思ったら /posts と入力します。)
「ブレークポイント」で「最初の行でブレーク」が付いているとcakePHPのコアファイルから始まってしまうのでチェックを外します。
URLの「自動生成」のチェック外し、WebサーバからみたURLを指定します。
e0091163_14491680.jpg

これで適用ボタンを押します。(実行ボタンは押せませんが構いません)

パースペクティブをPHPデバッグにし、ソースにブレークポイントを張り、デバッグボタン(虫ボタン)を押してDebugができます。

こんな感じです。
e0091163_14493749.jpg


その他の参考:
eclipse + Zend PDT + XDebugでソースレベルデバッグ
[PR]
by jehoshaphat | 2008-10-23 14:50 | PHP開発 | Trackback | Comments(0)
(PHP)cakePHPのインストール(ディレクトリの設定)
cakePHPのインストールにはまってしまったので、メモしときます。

レンタルサーバ上での運用を目的としているで、Cakeのインストールマニュアルの「3.4.3. 高度なセットアップ:その他のインストール方法」に当たるインストール方法です。

レンタルサーバの構成は下記の通りです。


/ (ルート直下はwebサーバからは参照されない)
/www.xxx.jp(webサーバで参照される場所。public_html)


ダウンロードしたcake_1.1.20.7692.zipを解凍します。

app と cake フォルダを/(ルート)直下にコピーします。
(フレームワークとはいえ、webサーバから参照される場所にはおかないほうがいいと思ったので、それの対策です。)

app/webroot/ がWebサーバからアクセスされる必要があるため、この配下のファイルを /www.xxx.jp 配下に移動します。

この時点でファイルの配置は下記のような構成になっています。


/
/app
/config
/controllers
/models
/plugins
/tmp
/vendors
/views
index.php
/cake
/config
/docs
/libs
/scripts
app_controller.php
app_model.php
basics.php
bootstrap.php
dispatcher.php
/vendors
/www.xxx.jp (配下のファイルは/app/webroot/から移動したもの)
index.php


あとは/www.xxx.jp/index.phpの修正です。
相対パスでROOT , APP_DIR , CAKE_CORE_INCLUDE_PATH を指定します。


if (!defined('ROOT')) {
//appの上のディレクトリ
define('ROOT', '..'.DS);
}
if (!defined('APP_DIR')) {
//ROOTからみてappがどこにあるか
define('APP_DIR', 'app');
}
if (!defined('CAKE_CORE_INCLUDE_PATH')) {
//これはindex.phpからみてcakeの上のディレクトリを指定。
define('CAKE_CORE_INCLUDE_PATH', '..'.DS);
}


また、Apacheを使用してる場合、moe_rewriteが有効になっていないといけません。
自分の開発環境のApacheは
#LoadModule rewrite_module modules/mod_rewrite.so
とmod_rewriteがコメントアウトされていたので、このコメントアウトを解除します。
LoadModule rewrite_module modules/mod_rewrite.so

さらに、ApacheのDocumentRootはcakePHPのwebroot(上記の設定だと/www.xx.jp)にしておかないといけません。
自分は開発環境のDocumentRootを触りたくなかったのでApacheのaliasでやっていましたが、見事に動きませんでした。
要注意点です。

Apacheがらみでもう一点。
デフォルトだとDocumentRootは
AllowOverride None
となっているので、
AllowOverride ALL
としましょう。


参考:
CakePHP のディレクトリ構成を変更する まさにcakePHPのディレクトリ環境についてかかれてます。助かりました。
[PR]
by jehoshaphat | 2008-10-22 22:38 | PHP開発 | Trackback | Comments(0)
(PHP)フレームワーク選定
久しぶりにPHPの開発をすることになり、フレームワークを使って開発することにしました。

しばらくPHP界から離れていた間に随分多くのフレームワークが出てきていました。
まさにPHPフレームワーク乱立世界です。

メジャーなものは下記にまとめています。
■cakePHP
Railsに似ている。
現時点で、人気がある。
小規模向け。
PHP4でも動く。
どうやらIBMがバックにいるから安心。

■symfony
Yahoo!でも使われている。
かなりの高機能。(故の複雑さもあるらしい)
重い。
大規模向け。

■Zend Framework
独立の強いコンポーネント指向。
コンポーネント指向ゆえにコードは結構書かないといけない。
Zendお墨付き。
軽い。


どのフレームワークにするのか結構悩みましたが、結局シェアが一番多いといわれているcakePHPにしました。
実はcakePHPをベースとした国産の「ちいたん」という世界最軽量(?)フレームワークも見つけてちょっとしたものを作るには非常に使えそうなきがしたのですが、とりあず今後のことも考えてcakeにしました。
自宅サーバでちゃちゃっと作るときにはちいたん、使ってみたいと思います。

以下に、比較サイトをまとめてみました。
PHPのMVCフレームワーク比較: Symfony CakePHP ZendFramework Ethna 4つのフレームワークについて率直な意見が書かれています。
PHPフレームワーク 9つの比較
Grafica Comparacion Frameworks 表形式でまとめられています。
PHPフレームワーク特集 CakePHP、symfony、Zend Frameworが比較
PHPフレームワークの比較 表形式でまとめられています。
New Year’s Benchmarks フレームワークのベンチマーク結果が出ています。
[PR]
by jehoshaphat | 2008-10-22 17:30 | PHP開発 | Trackback | Comments(0)
(WindowsServer2003)DNSサーバ構築メモ
WindowsServer2003でのDNSサーバ構築メモです。

要件は下記のとおり。
・LANの中だけで利用。(LAN内だけの名前解決)
・構築したDNSサーバで解決できないドメイン名はプロバイダのDNSサーバで解決する。(フォワーダ)
・LAN内はDHCP(ルータが割振り)なので、クライアントPCは動的にDNSサーバに自身のホスト名を登録する。
・構築するDNSサーバはLAN内の唯一のプライマリDNSサーバとする。
・ドメイン名はtest.localとする。

■手順
1.サーバの構成ウィザードより、DNSサーバの構成ウィザードを起動。

2.構成動作の選択
 「前方参照ゾーンを作成する(小規模ネットワークに推奨)」を選択。

3.プライマリサーバの場所
 「このサーバがゾーンを保守する。」を選択。

4.ゾーン名。
 「test.local」を入力。

5.ゾーンファイル
 次の名前で新しくファイルを作成する で下記を入力。
「test.local.dns」

6.動的更新
「非セキュリティ保護およびセキュリティ保護の両方による動的更新を許可する。」を選択。

7.フォワーダ
 「はい」(使用する)を選択。
xxx.xxx.xxx.xxx プロバイダのDNSサーバのIPアドレスを入力。

これでサーバ自体の構築は完了です。
意外とあっさりできます。

■DNSサフィックス、動的更新の設定
クライアント、サーバともに、DNSサフィックス、動的更新の設定をする必要があります。
(これをしないと、DNSの動的更新ができません。)
DNSサフィックスというのはそのPCがどのドメイン名に属しているかを示すようです。
(別にサフィックスを使わなくても、コンピュータ名にドメイン名をつけたらいいのですが、別ネットワーク環境に変わったときのことを考えてサフィックスにしました。)

サフィックスのつけ方は、システムのプロパティからコンピュータ名の変更を行うダイアログにて、「詳細」ボタンを押下。
「DNSサフィックスとNetBIOSコンピュータ名」ダイアログが開くので、そこでドメイン名(DNS構築ウィザードのゾーン名)を入れて、PCを再起動します。
e0091163_1041547.jpg

e0091163_10411458.jpg


あとは、TCP/IPのプロパティにて、「次のDNSサーバーのアドレスを使う」にチェックを入れ、構築したDNSサーバのアドレスをいれます。
さらに、「TCP/IP詳細設定」ウィンドウの「DNS」タブを開きます。
そこに下記の設定を行います。
・「この接続のDNSサフィックス」項目に「test.local」を入力。
・「この接続のアドレスをDNSに登録する」にチェックが入っていることを確認。
・「この接続のDNSサフィックスをDNS登録に使う」にチェックを入れる。
e0091163_10414271.jpg


これで、クライアントPCの起動後、サーバのDNS管理コンソールからクライアントPCのアドレスが登録されて、nslookupでも名前解決できればOKです。

参考:DNS サーバーのインストールと設定
[PR]
by jehoshaphat | 2008-10-14 19:52 | サーバがらみ | Trackback | Comments(0)
(JavaScript)ページの一部を動的に置き換える(prototype.js)
業務で久しぶりにWebを触ってます。
自社HPのメンテなのですが、各ページのヘッダー(ナビゲーションメニューと会社ロゴ)とフッター(コピーライトとその他もろもろ)の変更にも簡単に対応できるように、それらを別ファイルとして保存しておきページ読み込み時に自動的にヘッダー、フッターファイルを読み込んで表示させるようにしたいと思いました。

JavaScriptでファイル読み込んでinnerHTMLで挿入すればいいだけなのですが、数年前にAjaxの開発で使った老舗ライブラリprototype.jsを使ってみました。

prototype.jsのバージョンは1.6.0.3です。

サーバ側にあるファイルを取得してクライアント側のHTMLページ内の指定の場所に表示するだけでれば、Ajax.Updateを使い非常に簡単にできます。


function IncludeHeadFooterFiles() {
new Ajax.Updater(
{ success: 'header' } ,
'header.html' ,
{ method: 'get' , onFailure: displayError}
);
 
new Ajax.Updater(
{ success: 'footer' } ,
'footer.html' ,
{ method: 'get' , onFailure: displayError}
);
}
 
function displayError(){
alert("ファイルの取得に失敗しました");
}




あとはページのOnloadイベントに IncludeHeadFooterFiles() 関数をセットするだけでOKです。


ちなみにIE7でローカル上(webサーバを経由せず)にテストすると、うまく動きませんでした。
どうやらエクスプローラからHTMLをブラウザで見るとダメみたいです。
ちゃんとWEBサーバに配備してからhttp経由でテストしないといけないんですね。
Firefox3はローカル上からいけたんですが、IE7はやっぱ面倒です。

参考:ファイルの表示(Ajax.Updater)
[PR]
by jehoshaphat | 2008-10-13 20:01 | Webがらみ | Trackback | Comments(0)
頭痛。。。
最近、仕事していると昼か夕方くらいから慢性的に頭痛がするので、何だろうと思ってましたが、@ITに興味深い記事が載ってました。
第1回 ヤバい頭痛に気を付けろ!──頭痛の種類を把握する

まあ、医者じゃないので断定はできませんが、この記事を見る限りおそらく「筋緊張性頭痛」ではなかろうかと思います。
対策としてはやはりリフレッシュが大事みたいですね。
頭痛が始まる前からこまめに休息をとれるように心がけたいものです。
頭痛薬代も毎日のんでるとバカになりません。。
[PR]
by jehoshaphat | 2008-10-08 15:13 | 思ったこととかニュースとか。。 | Trackback | Comments(0)