August 31, 2005
PHP便利な関数 11
朝夕は涼しくなってきましたね。
秋はそこまで来ているようです。Miyaです。
さて、先日、array_spliceを用いて他の配列関数と同等の操作も出来るかなと
試してみましたので、その結果をご連絡します。
使ってみれば意外と簡単だったので、わざわざここで連絡するまでもないと
思ったのですが、一応前回宣言したので・・・。
array_push($array, 'りんご', 'ゴリラ')
→ array_splice($array, count($array), 0, array('りんご', 'ゴリラ'))
array_pop($array)
→ array_splice($array, -1)
array_shift($array)
→ array_splice($array, 0, 1)
array_unshift($array, 'りんご', 'ゴリラ')
→ array_splice($array, 0, 0, array('りんご', 'ゴリラ'))
こうしてみれば、array_spliceだけで事足りるような気もしますが、
例えば、array_splice($array, count($input), 0, array('りんご', 'ゴリラ')) と書いた時と、
array_push($array, 'りんご', 'ゴリラ')と書いた場合、メンテナンスを考慮すると、array_pushの方が、「配列の最後に追加する」とすぐ分かるので、他の人がソースを修正する場合を考えれば、その機能に特化する関数を使うほうがよいと思われます。
この実験のために、array_spliceで統一させたソースを作ったのですが、分かりにくくて・・・。
August 29, 2005
PHP便利な関数 10
お久しぶりです。
ちょっと休暇をいただいていました。Miyaです。
さて、今週から新規企画・・・と思っていましたが、
ばたばたしてしまっていたため、今回はPHPの配列関数についていくつかご紹介します。
・count($array) ※$array・・・配列とします。
配列の数が返されます。
PHPの中では常識でしょうか。最初はループを使って調べていました・・・。
・in_array("文字列",$array)
配列の要素の中に、指定した文字列が入っていればTrue、なければFalseが返ります。
これもまた、ループを使って調べていました・・・。
・array_splice($array , 開始位置 , 要素数, "置換文字列")
配列操作用の関数です。
開始位置から指定された要素数を、置換文字列で置き換えます。
開始位置が指定されていない場合は、最初の位置が指定され、
要素数が指定されていない場合は、開始位置以降全ての要素が対象になり、
置換文字列が指定されていない場合は、対象の要素が全て削除されます。
これを使いこなせば、array_pushやarray_popも必要なくなるのかな?
実験の結果はまた後日。
August 19, 2005
PHP便利な関数 9
少しだけ雨が降りました。香川は相変わらずの水不足。
こんばんは、Miyaです。
さて、本日はメール送信についていくつか。
PHPでは、メール送信も関数が用意されています。
そのおかげで、Perlでメールを送るときのように、sendmailなどのパスを調べる必要がありません。
(これはちょっと嬉しい)
関数のパラメータも、
mail(送信先,サブジェクト,メール本文,[追加ヘッダ,追加パラメータ]);
と大変シンプルなもの。
ただ、この関数はそのまま日本語メールを送ろうとすると文字化けします。
Perlなどでメール送信を行なった時と同じように、サブジェクトをISO-2022-JPへ
変換する必要があります。
(その変換に最適のmb_encode_mimeheaderという関数も準備されています)
そして、日本語メールを送ることを前提とするのであれば、mb_send_mailという関数もあります。
使い方は、mail関数と同じく、
mb_send_mail(送信先,サブジェクト,メール本文,[追加ヘッダ,追加パラメータ]);
でメールが送れるのですが、
mail関数で必要だった文字コードの変換を自動的に行なってくれます。
あくまで「自動判断」なので、誤作動を防ぐには明示的に変換を行なったほうがよいかもしれません。
少し変わったところでは、imap_mailというのもあります。
imap_mail(送信先,サブジェクト,メール本文,[追加ヘッダ,CC,BCC,リターンパス]);
違いといえば、パラメータとしてCC、BCC、リターンパスの指定が出来ることでしょうか。
かといって、mail関数やmb_send_mail関数はCC、BCCなどの設定ができないかというと、ヘッダに直接記述してやれば設定することが出来ます。
Perlでsendmailを使っていた人は、ヘッダに記述するほうが感覚として分かりやすいかも知れませんね。
August 17, 2005
PHP便利な関数 8
最近、朝夕の風が少しずつ涼しさを感じてきています。
ああ・・・夏が終わる・・・Miyaです。
さて、ほんとに最近デザインの話からは離れてしまって申し訳ないのですが、
本業がシステムなので、しばしお付き合いください・・・。
さて、本日はPHPの日付関数について。
PHPはdate()という関数がありまして、かなりいろいろなフォーマットが
使用できます。
a am または pm を定義する
A AM または PM を定義する
d 2桁の日付を定義する
D 3文字の曜日 (Sun ~ Sat) を定義する
F フルスペルの英字で月を定義する
h 12時間単位 (00 ~ 12) の時間を定義する
H 24時間単位 (00 ~ 23) の時間を定義する
g 先頭に 0 をつけない12時間単位 (0 ~ 12) の時間を定義する
G 先頭に 0 をつけない24時間単位 (0 ~ 23) の時間を定義する
i 2桁の分 (00 ~ 59) を定義する
j 先頭に 0 をつけない (0 ~ 31)の日を定義する
l フルスペルの英字で曜日を定義する
L 閏年では 1 を、それ以外は 0 を返す
n 先頭に 0 をつけない (0 ~ 12) の月を定義する
m 2桁のの月 (01 ~ 12) を定義する
M 3文字の月 (Jan ~ Dec) を定義する
s 2桁の秒 (00 ~ 59) を定義する
S 英文の序数を表わす接尾語 (th ~ nd) を定義する
t 指定した月の日数 (28 ~ 31) を定義する
U UNIX時間 (1970年1月1日からの秒数) を定義する
w 数値で示す曜日 (0 ~ 6) を定義する
y 西暦の下2桁を示す年を定義する
Y 西暦を4桁で示す年を定義する
z その年の1月1日からの通算日を定義する
Z タイムゾーンのオフセット秒 ( -43200 ~ 43200まで)
date("Y年m月d日 H:i:s");と指定すれば、現在時刻が
「2005年08月17日 12:12:24」と表示されるわけです。
ここで、もう一つstrtotimeという関数を紹介しておきましょう。
これは英文形式の日付をUNIXタイムスタンプに変換します。
つまり、現在時刻ではなく、ファイルやDBに格納された時刻を表示させる時、
一度strtotime関数でUNIXタイムスタンプに変換し、date関数で
フォーマットを編集することができるようになります。
date("Y年m月d日", strtotime("2005-08-17"));
一件遠回りのように見えますが、昨日の日付や明日の日付を取得するときなど、
編集もしやすいため、メンテナンス効率も上がります。
August 15, 2005
PHP便利な関数 7
高松市はこのまま雨が降らなければ断水が始まります。
Miyaです。水をください。
さて、今回は関数自身の便利さというよりは、関数の使い方のTipsです。
以前ここでエントリーを行なったセッションを使用したサイトを作っていて気づいたことなど。
今回使用する関数はheader関数です。
関数の効果は、生のHTTPヘッダを送信するという非常にシンプルなものなので、
ページのリダイレクトやヘッダー情報の書き換えに使用するのですが、
例えば、フォームから受け付けた内容を管理者にメールで知らせる時、
受付内容入力画面→受付内容確認画面→受付完了画面と遷移させるのであれば、
一つのphpファイルで完結させることが出来るので、header関数を使うことはありませんでした。
しかし、この場合、受付完了画面で更新することによって、同じ内容の
メールが何度も管理者宛に送られてしまいます。
サイトによっては、「一度だけクリックしてください」と記述しているところもありますが、
やはりスマートではありません。
そこで、ひと手間かけて、確認画面から完了画面へ移るとき、管理者あてにメール送信した後、
header("Location: http://www.form.com/thanks.htm"); /* Redirect browser */
exit;
などといった記述でリダイレクトさせてやれば、更新を行なっても複数送信されることはなくなります。
また、header関数を使用してセッションにかかわる情報を更新することによって、
セッションを使用した認証ページでも、ブラウザの「戻る」ボタンで戻ることが出来ます。
(「ページの期限切れ」表示を回避することが出来ます)
特に認証付申し込み受付ページなどは、
入力画面表示→入力→入力内容処理→表示処理へリダイレクト
という流れがユーザーが扱いやすいページになるのではないでしょうか。
August 11, 2005
PHPとMovable Type
そろそろお盆の時期ですね。
夏休みの人も多いのでは?こんばんは(職場から)Miyaです。
さて、現在色々と案件でMovable Type(以下MT)を触ることが多いのですが、
MTとPHPを連携させることによって、色々と面白いことが出来そうです。
そこで、今回からテーマを一つ増やし、MTに絡めたPHPで試してみたこと、
困ったことなどを紹介して行こうと思います。
さて、このブログのトップページのように、RSSから項目を取得し、表示させる仕組み。
実は色々なところで使っているのですが、それを作った当初、使う場所によって
表示される内容が異なる、といったことが起きていました。
具体的には、blogエントリーの本文の場所です。
表示用PHPも特には変えておらず、MTのRSSテンプレートもデフォルトのまま。
違うのはMTバージョンくらいなのに・・・。と色々と調べているうちに、
○MT 2.XXのRSS 1.0
<description><$MTBlogDescription encode_xml="1"$></description>
○MT 3.XXのRSS 1.0
<description><$MTEntryBody encode_xml="1"$></description>
と、デフォルトのRSS 1.0のテンプレートが異なっているのを見つけました。
このせいで、同じ項目なのに内容が違う。なんて現象が起きていたんですね。
デフォルトでRSSを生成している人は、一度テンプレートを見てみると良いかもしれません。
August 09, 2005
PHPセッション管理について
暑い日が続きますが、クーラーに頼りすぎるのは気をつけましょう。
風邪ひきました。Miyaです。
時々、PHPで認証付のサイトにアクセスした時、
ブラウザの「戻る」ボタンをクリックした時に、
「ページの有効期限切れ」というエラー画面がでたという人も多いのではないでしょうか。
これは、認証にセッション情報を使った時、
デフォルトではブラウザのキャッシュを残すことが出来ないことが原因です。
例えば入力フォームなどを使用した場合、確認画面から戻るを押した時、
入力項目が全てクリアされるのは困りモノです。
そこで、PHPファイルの最初に、
session_cache_limiter('private_no_expire');
と記述することによって、ブラウザのキャッシュを使用することが出来ます。
これを利用すれば、ブラウザの戻るボタンや、history.backを使用して
前画面に戻した時も、入力値は保持されます。
・・・が。
セッション値なども保持されてしまい、セッション情報が変わる場合や、
リロードをクリックしても、キャッシュ情報を参照してしまう不具合があります。
(これはブラウザによってまちまちですが)
サイトによっては、リロードボタンでxxx.php?asgbys6478 とランダムな文字列を与えて、
キャッシュをクリアしたり、ブラウザの「戻る」やhistory.backを使用しないで、
プログラムで入力値を保持したフォームを表示させるなど、対応は様々です。
どれも一長一短で、これ!といった最良の方法がないのが現状、といったところでしょうか・・・
August 02, 2005
PHP正規表現
最近、Webデザインからかけ離れていますね。
お久しぶりです。Miyaです。
本日はPHPの正規表現で、苦労したところを紹介します。
○目的
掲示板に入力された文字列を検索し、URLであれば、
自動的にリンクする。
メールアドレスであれば、mailtoを負荷する。
結果の正規表現
・URL(http://~)
ereg_replace("(http)(://[[:alnum:]\S\$\+\?\.=_%,:@!#~*-/&]+)","<a href=\"\\1\\2\" target=\"_blank\">\\1\\2</a>",$str);
・URL(https://~)
ereg_replace("(https)(://[[:alnum:]\S\$\+\?\.=_%,:@!#~*-/&]+)","<a href=\"\\1\\2\" target=\"_blank\">\\1\\2</a>",$str);
・メールアドレス
preg_replace('/([a-zA-Z]{1}[\w\.\-]*@[\w\.\-]+\.[\w\.\-]+)/','<a href="mailto:$1">$1</a>', $str);
もし不具合を見つけたり、これよりいいものを知っているよ、という方はぜひご一報ください。