PHPプロ!TIPS+

1. まだ、PEAR::DBをお使いの方へ

PHPからDBを使うときにはPEAR::DBをお使いの方もまだたくさんいらっしゃると思います。しかし、PEAR::DBのマニュアルにも「This package been superseded by MDB2 but is still maintained for bugsand security fixes」(このパッケージの代わりにMDB2の使用が推奨されますが、バグの修正、セキュリティフィックスは引き続き行われます。)と書かれているとおり、今後はPEAR::MDB2をお使いになることをお奨めいたします。

ということで、今回はPEAR::MDB2についてご紹介したいと思います。

PEAR::MDB2 マニュアル

http://www.go-pear.org/manual/ja/package.database.mdb2.php

MDB2についてはこちらをご覧下さい

http://www.go-pear.org/manual/ja/package.database.mdb2.intro.php

では早速、使ってみましょう。まずインストールです。

pear install MDB2

この後に注意していただきたいのが、PEAR::MDB2では、各DB用のドライバをインストールする必要があります。これらのインストールもPEARコマンドで行えます。

MySQLの場合

pear install MDB2_Driver_mysql

PostgreSQLの場合

pear install MDB2_Driver_pgsql

これで使用する準備が整いました。それでは簡単に、PEAR::DBとの比較をしながら使用方法をご紹介します。

<?php
//ファイル読込
require_once 'DB.php';
require_once 
'MDB2.php';

$dsn 'mysql://root@localhost/db2mdb2';

//接続
$db =& DB::connect($dsn);
$mdb2 =& MDB2::factory($dsn);

//Fetchmode
$db->setFetchMode(DB_FETCHMODE_ASSOC);
$mdb2->setFetchMode(MDB2_FETCHMODE_ASSOC);

/**
 * データ取得
 *  getAll    →  queryAll
 *  getOne    →  queryOne    
 *  getRow    →  queryRow
 *  getCol    →  queryCol
 */
$all $db->getAll('SELECT * FROM people');
$all $mdb2->queryAll('SELECT * FROM people');

print_r($all);

?>

以上が、簡単な使用方法になります。PEAR::DBを使われている方なら別段、抵抗無くコーディングできると思います。

PEAR::DBからPEAR::MDB2への以降の参考としては以下のURLにさらに詳しく書かれています。

http://www.phpied.com/db-2-mdb2/

その他の使用方法につきましては、サンプルも十分にありますのでPEARマニュアルを見ていただきたいと思います。

PEAR::MDB2 マニュアルhttp://www.go-pear.org/manual/ja/package.database.mdb2.php

また、PAER::DBとの相違点等について書かれている以下のサイトも参考にしてみて下さい。

http://dozo.matrix.jp/pear/index.php/PEAR/MDB2.html

PEAR::DBをまだお使いの方はPEAR::MDB2をご検討されてみてはいかがでしょうか。

2. 再帰関数を使ってみよう

再帰関数は、関数の中でその関数自身を呼び出す、ということを行っている関数です。 将棋やチェスのようなゲームや、パズルを解くようなプログラムではよく使われ、プログラムをとてもシンプルに、見通しよく記述することができます。今回は、そんな再帰関数をPHPで使った例をご紹介します。

PHPでゲームを作る、というようなことはまずないと思うので、使いどころはかなり限られてしまうのですが、それでも便利に使える場面がないわけではありません。ここではディレクトリ内のファイルをチェックし、そのディレクトリ内に含まれるファイルサイズの合計を求めるプログラムを作ってみます。

ディレクトリに含まれるのが全てファイルなら、再帰関数でなくても大丈夫ですが、ディレクトリ内が階層になっている場合は再帰関数が威力を発揮します。

<?php
//PHP4の場合、scandir関数がないので実装しておきます。
if (!function_exists(scandir)) {
  function 
scandir($dir_name$order '') {
    
$dh opendir($dir_name);
    while ( (
$filename readdir($dh)) !== false) {
      
$file_list[] = $filename;
    }

    if (
$order) {
      
rsort($file_list);
    } else {
      
sort($file_list);
    }
    return 
$file_list;
  }
}

//引数 $pathにはディレクトリ、またはファイルの絶対パスを指定。
function getDirSize($path) {
  
$total_size 0;

  
//指定したのがファイルだった場合はサイズを返して終了。
  
if (is_file($path)) {
    return 
filesize($path);

  } elseif (
is_dir($path)) {
    
$basename basename($path);

    
//カレントディレクトリと上位ディレクトリを指している場合はここで終了。
    
if ($basename == '.' || $basename == '..') {
      return 
0;
    }

    
//ディレクトリ内のファイル一覧を入手。
    
$file_list scandir($path);

    foreach (
$file_list as $file) {
      
//ディレクトリ内の各ファイルを引数にして、自分自身を呼び出す。
      
$total_size += getDirSize($path .'/'$file);
    }
    return 
$total_size;

  } else {
    return 
0;
  }
}


//関数を実行。
echo getDirsize('/home/asial');

?>

これだけで、指定したディレクトリ内のファイルサイズを求めることができます。

ただ、注意しないといけない点もあります。少し間違えたり、思いがけない例外があった場合、無限ループに陥ってしまうことがあります。上記のプログラムの場合、basename関数を使ってチェックを行わないと無限ループになります。また、指定したディレクトリ内にシンボリックリンクがある時も無限ループになってしまう場合があるので気をつけて下さい。

再帰関数は、最初はとっつきにくく感じるかもしれませんが、一度理解して使いどころで使えるようになると、非常に便利なものです。また、PHP以外のプログラミングの時にも使えますので、今までなじみの薄かった人もトライしてみてはどうでしょうか。

3. PEAR::Net_POP3を使ってPOP3サーバにアクセスしよう

POP3サーバにあるメールをPHPを使って受信する場合、皆さんはどのような方法を使いますか?PHPにはIMAPはもちろんのことPOP3でもアクセスできるIMAP関数というものがあります。しかし、IMAP関数を使うには別途拡張モジュールが必要で、拡張モジュールが読み込めない環境などでは使うことができません。そんなことで、今回は拡張モジュールを使わずにアクセスできるPEAR::Net_POP3を紹介したいと思います。

インストールは、

pear install Net_POP3

で可能です。では早速使ってみましょう。以下のソースコードを実行してみてください。

<?php
require_once('Net/POP3.php');

$account array(
  
'host' => 'ホスト名',
  
'port' => '110',
  
'username' => 'ユーザ名',
  
'password' => 'パスワード',
);
$pop3 =& new Net_POP3();
$pop3->connect($account['host'], $account['port']);
$pop3->login($account['username'], $account['password']);
$n_msg $pop3->numMsg();
$header_list $pop3->getParsedHeaders($n_msg);
$body mb_convert_encoding($pop3->getBody($n_msg), "euc-jp""jis");
$body htmlspecialchars($bodyENT_QUOTES"euc-jp");
$pop3->disconnect();

echo 
"<dl>";
echo 
"<dt>差出人</dt><dd>".mb_decode_mimeheader($header_list['From'])."
</dd>"
;
echo 
"<dt>件名</dt><dd>".mb_decode_mimeheader($header_list['Subject'])."
</dd>"
;
echo 
"<dt>本文</dt><dd><pre>".$body."</pre></dd>";
echo 
"</dl>";
?>

「サーバ名」「ユーザ名」「パスワード」はそれぞれ各自の環境にあわせて変更してください。実行すると、POP3サーバにある一番新しいメールの差出人と件名、本文が表示されます。

処理の流れを説明すると、まずNet_POP3のインスタンスを作成します。次にconnect()メソッドを使用してPOP3サーバに接続します。このとき第一引数にはホスト名、第二引数にはポート番号を指定します。そしてlogin()メソッドを使用してそのサーバにログインします。このlogin()メソッドには引数が三つあり、第一引数はユーザ名、第二引数はパスワード、第三引数には認証方法を指定します。第三引数は省略可能でデフォルトではtrueと指定されており、始めAPOPで不可の場合は通常の方法で認証を試します。ちなみにこの第三引数には'DIGEST-MD5'、'CRAM-MD5'、'LOGIN'、'PLAIN'、'APOP'、'USER'があります。

接続できたら後はサーバにあるメールを操作することができます。今回のこのソースコードではnumMsg()メソッドでメールの数を取得し、getParsedHeaders()メソッドを用いて一番新しいメールのヘッダーを取得、getBody()メソッドを用いて本文を取得してdisconnect()メソッドで接続を切断しています。

この他にもメールに削除マークを付けるdeleteMsg()メソッド、メールボックスにあるメールの一覧を取得するgetListing()メソッドなどがあります。

PHPスクリプトで書かれているため、拡張モジュールを使うIMAP関数と比較すると処理するスピードは遅くなりますが、IMAP関数を使用できない環境でメールを扱いたい場合など使ってみてはいかがでしょうか。

PEAR::Net_POP3 : http://pear.php.net/package/Net_POP3/

バックナンバーについて

TIPS-MLは、毎週金曜日に更新され、新しい記事が掲載されます。

Tipsꗗy[W 

Pick Up Q&A

Q
ログファイルの中の空のデータ行を削除したい
 このエントリーをはてなブックマークに追加 
A
ログのデータ個数(列数)が固定で、空のログが"<><><>"だと既知であれば if ($line === "<><><>") { continue; } で読み飛ばしてもいいのでは? ...

>>続きを読む

まずは配列や文字列の扱いから、じっくり勉強して行きましょう。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)