2004年12月16日
携帯へメール
携帯へメールする処理は、非常にやっかいだ。
では、ここに文字化けせずに正常に送るための方法を書いておく。
i-modeとauとでは仕様が異なるので注意。もちろんボーダフォンやその他も違ってくる。
何がやっかいか。 それは絵文字の存在だ。
まず、メール送信関数は普通に mail 関数を使う。これがもっとも無難だ。
文字コードは、JISで行うとしよう。
まぁSJISでも構わないのだが、古い慣わしに従ってみる。
ここで注意することは、JISへコード変換するさい、絵文字コードが変化することだ。
これを防ぐ手段として、base64 とよばれるバイナリへの変換を行う。
では、簡単な送信ルーチンを書いてみる。
mb_internal_encoding('SJIS');$mlfr=送信元;
$mlto=送信先;
$mlsb=タイトル;
$mlms=本文;$mlfr = "From: ".$mlfr
. "\r\nMIME-Version: 1.0\r\n"
. "Content-Type: Text/Plain; charset=ISO-2022-JP\r\n"
. "Content-Transfer-Encoding: base64";if (もしauへ送信なら)au();
if (もしi-modeへ送信なら)imode();$rcd = mail($mlto, $mlsb, $mlms, $mlfr);
function imode(){
global $mlsb,$mlms;
$mlsb = base64_encode($mlsb);
$mlms = base64_encode($mlms);
$mlsb = "=?ISO-2022-JP?B?" . $mlsb . "?=";
$mlsb = mb_convert_encoding($mlsb, 'JIS');
$mlms = mb_convert_encoding($mlms, 'JIS');
}
function au(){
global $mlsb,$mlms;
$mlsb = mb_convert_encoding($mlsb, 'JIS');
$mlms = mb_convert_encoding($mlms, 'JIS');
$mlsb = base64_encode($mlsb);
$mlms = base64_encode($mlms);
$mlsb = "=?ISO-2022-JP?B?" . $mlsb . "?=";
}
これで絵文字も正常で、よくあるタイトルの文字化けも起こさないはずである。
以上は実際に私が使用しているルーチンのコピペである。
私が試行錯誤して作ったルーチンなので、本当にあっているのか知らないが、問題は今のところ無い。
絵文字を使わないなら、こんなやっかいな処理はしなくて良い。
タイトルが文字化けしないようにするだけだ。
その場合、携帯ごとにルーチンを分ける必要はなく、一般的な方法でよい。
投稿者 Nori : 17:09 | コメント (0) | トラックバック
携帯の絵文字変換ルーチン例
i-modeとauの絵文字変換ルーチンを作りたい場合の基礎のみを書くとする。
これだけわかれば、PHPがある程度わかる人なら、すぐにでも作れるはずだ。
$i-mode[0] = '絵文字コード';
$au[0] = '絵文字コード';
機種ごとのコードを、普通の配列(キーを数字)で入れていく。
この場合、順番を飛ばさないようにキーを省略せずに入れたほうが良い。
次に、変換用の配列を作る。
i-modoの絵文字をau用に変換するテーブル。
$i2au[0] = 2;
このような感じで、キーはi-modoのキーに対応し、値はauのキーに対応する。
逆用の配列は$au2i[2] = 0; となる。
あとは str_replace を使って置換処理をするだけだ。
たったこれだけで絵文字変換が可能となる。
実際に私は友達とのメールの変換用に作って使用した。
絵文字コードは各公式サイトから手に入る。
PHPの場合、16進数の表記方法は3種類ある。
まずは文字列として扱う場合の2種類。''や""で囲む必要があるので注意すること。
一つは%** もっとも簡単な方法だ。 **は16進数が入る
EB60ならば、%EB%60 と書けば良い。
二つ目は \x**。
たとえば、\xEB\x60と書けば良い。
このように2バイト(2文字)づつ分けなければならないので注意。
文字列ではなく、数値として書く場合。
0x**となる。
たとえば、0xEB60 と書く。 一度にかけて便利だ。
どれを使うかは、臨機応変に使いやすい奴をどうぞ。
投稿者 Nori : 16:22 | コメント (0) | トラックバック
2004年12月15日
便利な連想配列を使いこなそう
連想配列とは、$hoge['key'] = 'value'; といったように、添え字を数字ではなく文字列にした配列だ。他言語ではハッシュとも呼ばれる。
これはよく使うので、使いこなせるようになっておこう。
基本的な使い方は、変数をグループ分けした連想配列にまとめること。
これにより、ばらばらな変数がグループごとに管理でき、非常に効率よくなる。
たとえばグローバル変数にする場合、 global $hoge; だけですみ、だらだら関連変数を書く必要がなくなる。
そして、添え字が文字列なので中身の意味がわかりやすい。
連想配列の作り方は他に、 $hoge = array(key=>value,key2=>value2);ともできる。
沢山の連想配列の値を定義する場合、1key/1行で定義すると楽だ。
例:
$hoge = array(
'key'=>'value',
'key2'=>'value2'
);
そして今回の主題は、2つの連想配列を使いこなす事にある。
2つの連想配列 $hoge と $hogeII があるとする。
$id = 'abc'; $value = $hogeII[$hoge[$id]];
このように、ある連想配列の値から別の連想配列の値を呼び出す方法は非常に便利で、よくつかわれる。
簡単な例をみてみよう
$hoge['人の名前'] = 'id';
$deta['id'] = 'data';
このような感じの2つの連想配列があるとする。
idは、dataの整理IDと思って欲しい。
これは、『人の名前』と『data』は直接のかかわりはなく、間接的に関わっている場合である。
たとえば、誰(人の名前)がどの商品(data)を使用中など。
もし人の名前とdata(商品)を直接関連づけて $hoge['人の名前'] = 'data';とした場合どうだろうか。
商品内容の記述が変わった場合、同じdataを持つ全ての人を再編集しなくてはならない。
それ以前に、あるdataを扱う人がいなくなった場合、そのdataが消滅してしまう。
これじゃまともな管理はできないね。
ちょっと分かりにくい例だったかもしれないが、2つの独立した連想配列をこうして組み合わせて使うことを覚えておくと良い。
最後にPHPでの連想配列の基本に戻る。
phpでは、文字列は '' か "" でかこむ。
すなわち、$hoge['abc'] といったかんじにだ。
''で囲むのは、これは文字列ですという意味なだけ。
では次の場合どうだろうか。
print "ほにゃらにゃは $hoge['abc'] です。";
''、""の意味がわかる人には、これだとエラーが出ることが一目瞭然。
この場合、$hoge[''abc'']という変数を呼び出していることになる。
文法的に間違いになる。 すでに""で囲まれているから、キーを''で囲まなくても文字列とみなされるのだ。
また、こういった連想配列の定義方法もある。
$hoge[key] ='value';
keyが '' で囲まれていないから文字列として扱われないとおもわれがちだ。
しかしphpでは、連想配列の場合にはキーを '' でかこまなくても最終的には文字列として処理してくれる。
宣言さている文字列(定数)かを調べ、宣言されていない場合はただの文字列として処理する仕組みだ。
すなわち、予約語であった場合、文字列の変換が行われて正しく動作しなくなるので気をつけよう。
あと '' の意味を理解してない人が間違いやすい例として
$hoge['$abc'] というように、キーを変数とする場合に '' で囲んでしまう。
''の中では変数を扱えない。ただの文字列となってしまう。
なので、全体を見るとこうなる。
$hoge['papa'] = 'よっぱらい';
$dare = 'papa';
$value = $hoge[$dare] ;
三行目は、$value = $hoge["$dare"] ; でも動作する。
''はただの文字列で、""は変数を含められる文字列である。
投稿者 Nori : 23:21 | コメント (0) | トラックバック
MySQLにログイン
やり方はいたってシンプル。
$SQLdb['User'] = "ユーザー名"; $SQLdb['Pass'] = "パスワード"; $SQLdb['Host'] = "localhost"; //通常はこの値 $SQLdb['Name'] = "データーベース名"; //テーブル名じゃないよ$connection = mysql_connect($SQLdb['Host'], $SQLdb['User'], $SQLdb['Pass']) or die ("MySQL接続に失敗 ");
mysql_select_db($SQLdb['Name']) or die ("データベース接続に失敗");
これで接続完了。
あとはSQL構文を実行するだけだ。
ちなみにログオフはしなくても大丈夫。
PHPの処理が全て終わった時点で、自動的にログオフとなる。
投稿者 Nori : 05:21 | コメント (0) | トラックバック
インクルードしたファイルに変数を渡そう
ヘッダやメニュー、フッタを別ファイルにしてインクルードするのはよく使われる方法だ。
さらに進化させて、それた別ファイルに変数を渡すともっと便利になる。
厳密には、変数を渡すのではない。
インクルードは、呼んだファイル内に対象ファイルを展開させてから実行させる命令だ。
すなわち、同じファイル(ルーチン)内と思って処理できる。
では例をあげる。
ファイルA
<?php
$subtitle = 'PHPを使いこなそう!';
include('head.php');
?>
ファイル head.php
<?php print $subtitle; ?>
ファイルAの実行結果
PHPを使いこなそう!
以上のようになる。
この技を使えば、ページごとに違う内容を簡単に挿入できる。
投稿者 Nori : 05:01 | コメント (0) | トラックバック
2004年12月13日
ループで配列を展開
順番に配列の中身全てを取り出す操作はよくおこなわれる。
単純な配列 $hoge[0],$hoge[1],$hoge[2]といったものならば、forループでも処理できる。
for ($i=0;$i<count($hoge);$i++)
といった感じだ。
$hoge[$i] で順番にアクセスできる。
しかし、これをもっと簡単にする方法もある。
foreach ($hoge as $value)
これで、ループが行われるたびに順番に$vlalueへ代入されていく。
そしてもうひとつ、配列が $hoge['panda'], $hoge['zou'] といったような場合、数字ではアクセスできないので for ループは使いにくい。
この場合も foreach で簡単にアクセスできる。
foreach ($hoge as $key => $value)
さきほどのとは違い as の後ろの変数は配列の中身ではない、panda, zouといったキーが代入される。
たとえば一巡目では、$key = panda, $value = 中身 となる。
多次元配列でも、同様にして処理される。
たとえば、「 $hoge['abc']['123'] = 'hogehoge' 」という配列がある。
これをforeachで展開するには、
foreach ($hoge as $key1 => $key2) {
foreach ($key2 as $key3) {
print "$key1 / $key2 / $key3";
}
}
この結果は、「 abc / Array / hogehoge 」となる。
この場合のArrayは、「$hoge 」のことである。
「123」の部分も取得したければ、2つ目のforeachで
「 foreach ($key2 as $key4 => $key3) 」とすればよい。
投稿者 Nori : 17:38 | コメント (0) | トラックバック
2004年12月05日
文字コードの指定
PHPでよくつまづくことの一つが、文字コードの処理だ。
国内でよく使われるコードはShift-JIS、JIS、EUC-JP、UTF8の4種類。
Shift-JIS:Windows、Mac、携帯で使われているコード。国内標準コード。
JIS:主にメールで使用されているコード。Web上ではあまり使われない。
EUC-JP:Unix系で使われているコード。動的ページに多いコード。
UTF-8:もっとも新しいコードで、世界中の文字が一度に扱える。企業サイトに多い。
そしてよくつまづくのが、外部とデータのやりとりをする時に行うコード変換。
こういった文字コードトラブルを少しでも和らげるために、一行の命令を先頭に加えよう。
mb_internal_encoding("EUC");
EUCの部分は、これの書かれているファイルの文字コードにあわせよう。
これはサーバーで設定されているデフォルトの文字コードを変える命令だ。
デフォルトはサーバーによって異なり、autoになっている場合は誤動作も起こりうる。
この指定で、ソース中の日本語による誤動作を避けることができる。
さらに、たとえば mb_convert_encoding ( $ABC, "SJIS"); というように、パラメーターを省略するこも可能になる。
この場合、mb_convert_encoding ( $ABC, "SJIS","EUC");と同じになる。
mb_convert_encoding ( $ABC, "SJIS","auto");にすれば、文字コードを自動識別するが、特に短い日本語では自動識別ができないことがある。
なのでautoは避け、しっかり指定するようにしよう。
また、一括してコード変換するときにも使用する。
mb_http_output ( [string encoding]);
これは出力する文字コードを指定するものだ。
使い方は以下となる。
<?php
mb_internal_encoding("EUC"); //ソースの文字コードを指定
mb_http_output ("SJIS"); // 出力する文字コードを指定
ob_start("mb_output_handler"); // 出力のバッファリング開始
print等の出力やその他処理
ob_end_flush(); // 送信
?>
ob_start が実行されると、print命令等の出力先がバッファになる。(クライアントへ送信しない)
ob_end_flushが実行されると、文字コードを変換したものが一度にクライアントへ送信される。
すなわち、スクリプトのはじめにob_startまでを書いておき、一番最後にob_end_flushを書けば良い。
これは、ソースをEUCで書いて、出力を他の文字コードにしたい場合に便利である。
たとえば、SJISで書かれているページにEUCで書かれたPHPをインクルードする時や、携帯用サイトに使用する。
ちなみにmb_internal_encoding("SJIS");という指定(SJISに指定)は歓迎されてないが、SJISのソースで動作するサーバーならば問題無い。(国内サーバーは通常OK)
投稿者 Nori : 11:51 | コメント (0) | トラックバック
PHPとは
PHPの正式名称は PHP: Hypertext Preprocesser 。
このPHPは、html文書内に記述できるスクリプト言語で、サーバー側で処理される。
クライアントがPHPの記述されたページを開こうとしたとき、サーバーがPHPを処理し、その結果のみをクライアントへ伝えるので、実行結果がクライアント側の環境に左右されないことになる。
また、実行結果のみを伝えるので、スクリプト内容が漏れないというメリットもある。
言語の仕様は、C/C++とPerlをベースとしている。
そのため、どちらかの言語経験者ならば、スムーズに開発が行える。
未経験者の場合は、自分が使いやすい方の書式を使えば良いだろう。
PHPを使うメリットは様々だ。そのため最近では多くのサーバーにインストールされており、様々なサイトがPHPでつくられていっている。
であまず、CGIとの違いを見てみよう。
まずCGIとは、プログラムを実行する仕組みのことで、大抵はPerlによってかかれている。
間違えないで欲しいのは、CGIとは言語の事ではなく、ただの実行形式のことである。
ウェブサーバーと連携して動作させるためのプログラム実行形式と覚えれば良いだろう。
Windowsのソフトは、C言語、C++言語、パスカル、ベーシック、その他様々な言語で作成したソフトがある。
これと同様に、CGIも、一般的なPerlだけでなく、C言語でも、パスカルでも、PHPでも、サーバーがサポートする言語ならばなんでも良い。
このCGIは、Webから呼び出されるとサーバーがCGIを実行し、その結果をサーバーが受け取り、Webへ送るという方式になっている。
一方PHPの場合は、サーバー自体の機能として動作する。
簡単に言えば、Webから呼び出されると、サーバーソフト内で処理されそのまま返送する。
CGIのようにウェブサーバーと連携するという動作がない分、スムーズに処理されスピードも速く、サーバーの負荷も少なくてすむ。
余談だが、CGIとPerlを同視して混乱している人をよく見かける。
PHPはPerlよりも速いというのは間違いであり、PHPはCGIよりも速いがより正しい。
厳密にはこの書き方も間違っており。PHPをCGIとして実行すれば、Perlで書かれたCGIとなんら変わらない。
次にPHPでよいところは、これが一番のメリットといえるhtml内に記述できること。
CGIのように別ファイルにする必要がないので、柔軟な処理が行える。
CGIとSSIを駆使してサイトを作るより、PHPでさくっと作った方が楽と言える。
ちなみにASPと呼ばれる言語もhtmlに記述できるが、Windowsサーバーでしか実行できないのが難点である。
他には、関数が非常に豊富に用意されており、データベースとの連携が楽なことはもちろん、最近広まりつつあるXMLの処理もサポートしているし、Javaとの連携、そのたもろもろの処理ができる。
つまり、PHPならなんでも簡単にできてしまうということだ。