Search A.I.
Menu
ホーム

メールマガジン ホームページプログラミングテク

Windowsテク
Javaアプレット サンプル
Java Q & A
JavaScript Q & A
Perl Q & A
Perl レッスン
PHP レッスン
PHPテク
MS-DOS コマンド集
UNIX コマンド集
SQL コマンド集
SEの基礎講座
WEBシステム開発受注します
]無料フォームメール送信サービス
リンク集
Perl Q & A

自動パスワード発行関数
ファイル名取得関数
アクセスログファイル出力関数
バッチ処理関連関数
XMLファイル読み込み関数
ブラウザ・携帯キャリア判定
ディレクトリサイズ取得再帰関数
ファイル数取得再帰関数
ディレクトリ全コピー関数
ディレクトリ全削除関数
画像リサイズ関数
メールアドレスチェック関数
ファイル入出力関数
文字チェック関数
ファイル容量バイト文字列取得関数
古いファイルを削除する関数
環境変数を出力する
php.iniについて
携帯固有番号取得関数


次のページへ >>



・自動パスワード発行関数
今回は、会員登録などをした時に、自動でパスワードを発行できる便利な関数をご紹
介いたします。

数字のみか、英数字を選ぶことができ、さらにパスワードの長さも調節できるので、
便利になってます。

さっそくサンプルを紹介したいと思います。

▼サンプル----------------------------

// 引数: パスワード文字数、数字のみフラグ
// 戻り値: パスワード
function auto_password($length = 8, $num_flag = false)
{
if ($num_flag) {
$str = "1234567890";
}
else {
$str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";
}
$str = str_shuffle($str);
return substr($str, 0, $length);
}

▲------------------------------------

1番目の引数で、パスワードの長さを渡します。2番目の引数は、数字のみの場合に
trueを渡します。

処理は、単にパスワードに使う文字列を定義して、シャッフル関数を使って、文字列
の長さを切り取って返すだけです。

これだけで、パスワード文字列を自動的に作れてしまいます。

 

・ファイル名取得関数
今回は、URLやディレクトリパスなどから、ファイル名や拡張子を取り出す関数をご
紹介いたします。

さっそくサンプルを紹介したいと思います。

▼サンプル----------------------------

//------------------------------------------------------------------------------
// フルパスからファイル名を取得
// 引数: パス文字列、拡張子付加フラグ
// 戻り値: ファイル名
function get_file_name($str_path, $ext_flag = true)
{
$str = $str_path;
if (!$ext_flag) {
$pos = strrpos($str, ".");
if ($pos)
{
$str = substr($str, 0, $pos);
}
}
$pos = strrpos($str, "\\");
if ($pos)
{
return substr($str, $pos+1);
}
$pos = strrpos($str, "/");
if ($pos)
{
return substr($str, $pos+1);
}
return $str;
}

//------------------------------------------------------------------------------
// フルパスから拡張子名を取得
// 引数: パス文字列
// 戻り値: 拡張子名
function get_file_ex($str_path)
{
$pos = strrpos($str_path, ".");
if ($pos)
{
return substr($str_path, $pos+1);
}
return "";
}

▲------------------------------------

ファイル名を取得する関数と、拡張子を取得する関数です。

ファイル名取得関数は、第二引数で、拡張子付きかどうかを渡します。FALSEの場合
は、拡張子なしで取得します。

処理は簡単で、単に「\」か「/」を後ろから探して、見つかったら、それより後ろの
文字列を返します。見つからなかったら、第一引数をそのまま返します。

拡張子取得関数も、非常にシンプルで、「.」を後ろから探して、見つかったら、そ
れより後ろの文字を返すだけです。



・アクセスログファイル出力関数
今回は、ファイルにアクセスログを出力する関数をご紹介いたします。

さっそくサンプルを紹介したいと思います。

▼サンプル----------------------------

///------------------------------------------------------------------------------
//アクセスログをファイル出力する
//引数:コメント
//戻り値:成功 true、失敗 false
function print_access_log($comment = "") {
//ディレクトリ作成
if (!is_dir(LOG_PATH)) {
mkdir(LOG_PATH);
}

$filename = LOG_PATH . "access_" . date("Ym") . ".log";

$buf = array(
$_SERVER["SCRIPT_NAME"],
$comment,
$_SERVER["REQUEST_METHOD"],
$_SERVER["QUERY_STRING"],
$_SERVER["REMOTE_ADDR"],
$_SERVER["HTTP_USER_AGENT"],
$_SERVER["HTTP_REFERER"],
date("Y/m/d H:i:s")
);

$data = join(",", $buf) . "\n";

if (!is_file($filename)) {
// 古いデータを削除
$tmp_date = mktime(0, 0, 0, date("m"), 1, date("Y") - 1);
$old_file = LOG_PATH . "access_" . date("Ym", $tmp_date) . ".log";
if (is_file($old_file)) {
unlink($old_file);
}

$buf = array(
"画面",
"コメント",
"リクエスト",
"クエリー",
"IPアドレス",
"エージェント",
"リファラ",
"アクセス日時"
);

$data = join(",", $buf) . "\n" . $data;
}

if (!$handle = fopen($filename, 'a+')) {
return false;
}

flock($handle, LOCK_EX);

if (!fwrite($handle, $data)) {
return false;
}

flock($handle, LOCK_UN);

fclose($handle);
return true;
}

▲------------------------------------

第一引数にコメントを渡して、出力することができます。渡さなければ、コメントは
出力されません。

1点だけ注意しなくてはならないのは、LOG_PATHという変数だけ、定義しておいてく
ださい。これは、ファイルが出力されるディレクトリのパスです。

(例)
define("LOG_PATH", "./log/");

また、アクセス数が多いサイトの場合、ファイル出力は時間がかかって重くなる場合
があります。できるだけ、別プロセスのデータベース出力でアクセスログを書き込む
などの方法を取った方が良いです。



・バッチ処理関連関数
今回は、バッチ処理を行うPHPプログラムに関わる関数をご紹介いたします。

バッチ処理とは、ブラウザによるWEBのアクセスで動くプログラムではなく、スケジ
ューリングされた時刻になると、自動的に実行されるプログラムのことを言います。

バッチ処理をする場合、二重起動防止処理が必要になる場合があります。
前のバッチ処理中に、次のバッチ処理が動くと、メール送信予約などで、二度送信
するのを防ぐ時などに、必要になります。

それでは、サンプルを紹介したいと思います。

▼サンプル----------------------------

//------------------------------------------------------------------------------
//ログファイルに書き込むを行う(バッチ用)
//引数:ログファイルに書き込むメッセージ
//戻り値:成功 true、失敗 false
function print_batch_log($id, $message = "") {
//ディレクトリ作成
if (!is_dir(BATCH_PATH)) {
mkdir(BATCH_PATH);
}

$filename = BATCH_PATH . "batch_" . date("Ym") . ".log";
$buf = date("Y/m/d H:i:s", time()) . " " . $id . " " . $message . "\n";

if (!is_file($filename)) {
// 古いデータを削除
$tmp_date = mktime(0, 0, 0, date("m")-6, 1, date("Y"));
$old_file = BATCH_PATH . "batch_" . date("Ym", $tmp_date) . ".log";
if (is_file($old_file)) {
unlink($old_file);
}
}

if (!$handle = fopen($filename, 'a+')) {
print "Cannot open file ($filename)\n";
return false;
}

flock($handle, LOCK_EX);

if (!fwrite($handle, $buf)) {
print "Cannot write to file ($filename)\n";
return false;
}

flock($handle, LOCK_UN);

fclose($handle);
return true;
}

//------------------------------------------------------------------------------
//二重起動防止用ロックファイルのチェック
//ロックされていた場合は1秒毎にリトライし、それでも解除されない場合はfalseを返す
//引数:画面ID、リトライ回数
//戻り値:起動可 true、二重起動 false
function check_double($id, $max_cnt = 10) {
$filename = BATCH_PATH . $id . ".tmp";

for ($i = 0; $i < $max_cnt; $i++) {
if (!file_exists($filename)) {
return true;
}
sleep(1);
}
return false;
}

//------------------------------------------------------------------------------
//ロックファイルの作成
//引数:画面ID
//戻り値:成功 true、失敗 false
function lock_file($id) {
//ディレクトリ作成
if (!is_dir(BATCH_PATH)) {
mkdir(BATCH_PATH);
}

$filename = BATCH_PATH . $id . ".tmp";

if (!$handle = fopen($filename, 'w+')) {
print "Cannot open file ($filename)\n";
return false;
}

if (!fwrite($handle, $id)) {
print "Cannot write to file ($filename)\n";
return false;
}
return true;
}

//------------------------------------------------------------------------------
//ロックファイルの削除
//引数:画面ID
//戻り値:なし
function release_file($id) {
$filename = BATCH_PATH . $id . ".tmp";

if (file_exists($filename)) {
unlink($filename);
}
}

// メイン処理の開始
if ($_SERVER["SERVER_NAME"] != "") {
// 不正アクセス防止
exit();
}

// ID
$id = "print_batch";

// 二重起動防止
if (!check_double($id, 10)) {
// 一定時間経っている場合はフリーズとみなし、ロック解除
print_batch_log($id, "ロック解除");
release_file($id);
}

// 二重起動防止ロック
lock_file($id);

// ログ出力
print_batch_log($id, "start.");

// 処理の実行
// 〜省略〜

// 二重起動ロック解除
release_file($id);

▲------------------------------------

サンプルでは、二重起動チェックをし、10秒間ロック状態のままの場合は、ロック解
除して処理を続けています。

ロック解除せずに強制終了してしまっても良いのですが、何らかの理由により、ロッ
クファイルが削除できなかった場合に、二度と起動することができず、手動によるロ
ックファイル削除が必要になってしまいます。

そのため、ロック解除していますが、プログラムに応じて処理を変える必要があるか
と思います。

また、BATCH_PATHという変数だけ、定義しておいてください。これは、バッチログフ
ァイルが出力されるディレクトリのパスです。

(例)
define("BATCH_PATH", "./batch/");

それぞれの関数の引数は、IDの文字列ですが、何でも構いません。このID文字列で、
ログファイルが出力されます。また、バッチファイルが複数ある場合に区別できます。



・XMLファイル読み込み関数
今回は、XMLファイルを読み込む関数をご紹介いたします。

ここでは、PHPのデフォルトで入っているXMLパーサを使用していますが、もしXML
パーサが入っていない場合は、マニュアル等を参照してインストールしてください。

それでは、サンプルを紹介したいと思います。

▼サンプル----------------------------

//------------------------------------------------------------------------------
// XML読み込み
// 引数: XMLファイルパス、データキー名
// 戻り値: 配列
function readDatabase($filename, $key_name) {
// read the XML database of aminoacids
$data = implode("", file($filename));
$parser = xml_parser_create();
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
xml_parse_into_struct($parser, $data, $values, $tags);
xml_parser_free($parser);

// loop through the structures
foreach ($tags as $key=>$val) {
if ($key == $key_name) {
$molranges = $val;
// each contiguous pair of array entries are the
// lower and upper range for each molecule definition
for ($i=0; $i < count($molranges); $i+=2) {
$offset = $molranges[$i] + 1;
$len = $molranges[$i + 1] - $offset;
$tdb[] = parseMol(array_slice($values, $offset, $len));
}
} else {
continue;
}
}
return $tdb;
}

//------------------------------------------------------------------------------
// XML解析
// 引数: XMLデータ項目
// 戻り値: 配列
function parseMol($mvalues) {
for ($i=0; $i < count($mvalues); $i++) {
$mol[$mvalues[$i]["tag"]] = $mvalues[$i]["value"];
}
return $mol;
}

$xml_data = readDatabase("test.xml", "book");
print_r($xml_data);

▲------------------------------------

readDatabase関数を呼べば、内容を配列で取得することができます。

第一引数は、XMLファイルのフルパス、第二引数は、取得するためのデータのキー名に
なります。

例えば、サンプルのtext.xmlの内容は、以下のようなものだった場合、

▼サンプル----------------------------

<?xml version="1.0" encoding="UTF-8"?>
<books>
<book>
<title>テキスト1</title>
<author>テスト1</author>
</book>
<book>
<title>テキスト2</title>
<author>テスト2</author>
</book>
<book>
<title>テキスト3</title>
<author>テスト3</author>
</book>
</books>

▲------------------------------------

この場合、$xml_data[0]["title"]にテキスト1、$xml_data[0]["author"]にテスト1、
$xml_data[1]["title"]にテキスト2、・・・と入ります。

readDatabaseの第二引数に、"book"を指定することで、<book>〜</book>で囲まれた
データを取得するわけです。

readDatabaseの中では、XMLパーサを使用して、中身を一気に取得し、さらにタグを
解析することで、取得しやすい配列を返しています。

parseMol関数は、タグを解析する関数です。こちらは、readDatabaseで使用している
ので、特に意識する必要はありません。

test.xmlにサンプルの内容を保存した上で、サンプルプログラムを実行すると、
配列の中身を全て表示しますので、どう取得できたかが分かると思います。

ただし、XMLの文字コードはUTF-8ですので、UTF-8で保存して表示した場合で、文字
化けしてしまった場合は、ブラウザのエンコードをUTF-8にするなどして、表示して
ください。

 

・ブラウザ・携帯キャリア判定
今回は、ブラウザや携帯のキャリアを判定する方法をご紹介いたします。

クライアントからサーバに送られてくる環境変数を利用して、その文字列から判定
します。

それでは、サンプルを紹介したいと思います。

▼サンプル----------------------------

$agent = $_SERVER['HTTP_USER_AGENT'];

if (ereg("MSIE", $agent)) {
//Internet Explorerの場合
print "IE";
}
elseif (ereg("Firefox", $agent)) {
//Firefoxの場合
print "Firefox";
}
elseif (ereg("iPhone", $agent)) {
//iPhoneの場合
print "iPhone";
}
elseif (ereg("Safari", $agent)) {
//Safariの場合
print "Safari";
}
elseif (ereg("Opera", $agent)) {
//Operaの場合
print "Opera";
}
elseif (ereg("Netscape", $agent)) {
//Netscapeの場合
print "Netscape";
}
elseif (ereg("Gecko", $agent)) {
//Mozillaの場合
print "Gecko";
}
elseif (ereg("Chrome", $agent)) {
//Google Chromeの場合
print "Google Chrome";
}
else {
//その他の場合
print "Other";
}

▲------------------------------------

試しに、$_SERVER["HTTP_USER_AGENT"]をprintするプログラムを作って、
いろいろなブラウザで見てみると分かりますが、ブラウザ名が入っているので、
これを利用して、場合分けしています。

最近話題のGoogle ChromeやiPhoneも判別してみました。

携帯の場合は、下記のようになります。

▼サンプル----------------------------

$agent = $_SERVER['HTTP_USER_AGENT'];

if (ereg("^DoCoMo", $agent)) {
//ドコモの場合
print "DoCoMo";
}
elseif (ereg("^J-PHONE|^Vodafone|^SoftBank", $agent)) {
//ソフトバンクの場合
print "SoftBank";
}
elseif (ereg("UP.Browser|^KDDI", $agent)) {
//auの場合
print "au";
}
elseif (ereg("iPhone", $agent)) {
//iPhoneの場合
print "iPhone";
}
else {
//その他の場合
print "Other";
}

▲------------------------------------

携帯サイトとPC用サイトを分ける場合などは、サンプルをちょっと変えれば
簡単にできると思います。

iPhoneはPC扱いですが、携帯電話でもありますので、こちらにも入れておきました。

ただ、ブラウザも携帯も、新しいのが出てきたり、古いのがなくなったりと、
日々変化しているので、こういったプログラムを利用している場合、それに
合わせて変更が必要になったりしますので、ご注意ください。

 

・ディレクトリサイズ取得再帰関数
今回は、ディレクトリのサイズ取得関数をご紹介いたします。

PHPにファイルサイズ取得関数は用意されていますが、ディレクトリ内のトータル
ファイルサイズを取得する関数は用意されていません。

そこで、再帰関数でディレクトリ内の全てのファイルサイズを取得し、トータルの
サイズを取得します。

それでは、サンプルを紹介いたします。

▼サンプル----------------------------

//------------------------------------------------------------------------------
// ディレクトリ階層以下の容量計算
// 引数: ディレクトリ
// 戻り値: サイズ
function dir_size($dir_name)
{
$size = 0;
if (is_dir($dir_name)) {
if ($dh = opendir($dir_name)) {
while (($file = readdir($dh)) !== false) {
if ($file == "." || $file == "..") {
continue;
}
if (is_dir($dir_name . "/" . $file)) {
$size += dir_size($dir_name . "/" . $file);
}
else {
$size += filesize($dir_name . "/" . $file);
}
}
closedir($dh);
}
}
return $size;
}

▲------------------------------------

dir_sizeの第一引数にディレクトリのパスの文字列を渡すと、トータルのサイズを
数値で返します。

関数の処理としては、ディレクトリを開いて全てのディレクトリ、ファイルを取得し、
ループ内でファイルであれば、サイズをプラスし、ディレクトリの場合は自分の関数
を呼び出しています。

再帰関数になっているので、現在検索しているディレクトリの下に、さらにディレク
トリがあると、自分の関数を呼んで、そのディレクトリ内のサイズを取得します。

 

・ファイル数取得再帰関数

今回は、ディレクトリのファイル数取得関数をご紹介いたします。

指定したディレクトリ内にあるファイル数をカウントして、数を返します。
サブディレクトリ以下のファイル数もカウントします。

サブディレクトリがある場合は、自分の関数を呼び出して、その下のファイル数を
カウントするため、再帰関数となっております。

それでは、サンプルを紹介いたします。

▼サンプル----------------------------

//------------------------------------------------------------------------------
// ディレクトリ階層以下のファイル数計算
// 引数: ディレクトリ
// 戻り値: ファイル数
function file_count($dir_name)
{
$count = 0;
if (is_dir($dir_name)) {
if ($dh = opendir($dir_name)) {
while (($file = readdir($dh)) !== false) {
if ($file == "." || $file == "..") {
continue;
}
if (is_dir($dir_name . "/" . $file)) {
$count += file_count($dir_name . "/" . $file);
}
else {
$count++;
}
}
closedir($dh);
}
}
return $count;
}

▲------------------------------------

file_countの第一引数にディレクトリのパスの文字列を渡すと、トータルのファイル
数を数値で返します。

関数の処理としては、ディレクトリを開いて全てのディレクトリ、ファイルを取得し、
ループ内でファイルであれば、カウントをプラスし、ディレクトリの場合は自分の関数
を呼び出しています。

再帰関数になっているので、現在検索しているディレクトリの下に、さらにディレク
トリがあると、自分の関数を呼んで、そのディレクトリ内のサイズを取得します。

 

・ディレクトリ全コピー関数
今回は、ディレクトリ全コピー関数をご紹介いたします。

指定したディレクトリ内にあるファイルとディレクトリを、そのまま別のディレクト
リにコピーします。

サブディレクトリがある場合は、自分の関数を呼び出すことで、下の階層も同様に
コピーされるため、再帰関数となっております。

それでは、サンプルを紹介いたします。

▼サンプル----------------------------

//------------------------------------------------------------------------------
// ディレクトリ階層以下のコピー
// 引数: コピー元ディレクトリ、コピー先ディレクトリ
// 戻り値: 結果
function dir_copy($dir_name, $new_dir)
{
if (!is_dir($new_dir)) {
mkdir($new_dir);
}

if (is_dir($dir_name)) {
if ($dh = opendir($dir_name)) {
while (($file = readdir($dh)) !== false) {
if ($file == "." || $file == "..") {
continue;
}
if (is_dir($dir_name . "/" . $file)) {
dir_copy($dir_name . "/" . $file, $new_dir . "/" . $file);
}
else {
copy($dir_name . "/" . $file, $new_dir . "/" . $file);
}
}
closedir($dh);
}
}
return true;
}

▲------------------------------------

dir_copyの第一引数に、コピー元のディレクトリのパスを指定し、第二引数にコピー
先のディレクトリパスを指定します。

関数の処理としては、ディレクトリを開いて全てのディレクトリ、ファイルを取得し、
ループ内でファイルであれば、そのままコピーし、ディレクトリの場合は自分の関数
を呼び出しています。

再帰関数になっているので、現在検索しているディレクトリの下に、さらにディレク
トリがあると、自分の関数を呼んで、そのディレクトリをコピーするという処理に
なります。

 

・ディレクトリ全削除関数
今回は、ディレクトリ全削除関数をご紹介いたします。

指定したディレクトリ内にあるファイルとディレクトリを、全て削除します。

サブディレクトリがある場合は、自分の関数を呼び出すことで、下の階層も削除され
るため、再帰関数となっております。

それでは、サンプルを紹介いたします。

▼サンプル----------------------------

//------------------------------------------------------------------------------
// ディレクトリ階層以下のファイル、ディレクトリ削除
// 引数: ディレクトリ
// 戻り値: なし
function dir_delete($dir_name)
{
if (is_dir($dir_name)) {
if ($dh = opendir($dir_name)) {
while (($file = readdir($dh)) !== false) {
if ($file == "." || $file == "..") {
continue;
}
if (is_dir($dir_name . "/" . $file)) {
dir_delete($dir_name . "/" . $file);
}
else {
unlink($dir_name . "/" . $file);
}
}
closedir($dh);
}
rmdir($dir_name);
}

return true;
}

▲------------------------------------

dir_deleteの第一引数に、削除するディレクトリのパスを指定します。

関数の処理としては、ディレクトリを開いて全てのディレクトリ、ファイルを取得し、
ループ内でファイルであれば、それを削除し、ディレクトリの場合は、自分の関数を
呼び出しています。

再帰関数になっているので、現在開いているディレクトリの下に、さらにディレクト
リがあると、自分の関数を呼んで、そのディレクトリを削除するという処理になりま
す。

 

・画像リサイズ関数
今回は、画像をリサイズして、ディレクトリに保存する関数をご紹介いたします。

画像フォーマットは、GIF、JPEG、PNGのみです。一応、透過GIFにも対応しています
が、アニメーションGIFのりサイズはできませんので、ご注意ください。

それでは、サンプルを紹介いたします。

▼サンプル----------------------------

//------------------------------------------------------------------------------
//画像リサイズ処理(縦横比固定)
//引数 : 元ファイル名(フルパス)、コピー先ファイル名(フルパス)、リサイズのピクセル幅、リサイズのピクセル高さ、
// 強制リサイズ → falseの場合は指定サイズを超えた場合のみリサイズ、trueの場合は、強制リサイズ
//戻り値 : 成功 画像タイプ、失敗 false
function resize_image($file_from, $file_to, $width = 0, $height = 0, $resize = false)
{
// アップされた画像の大きさを取得(戻り値:配列(0:width 1:height))
$upImgSize = getimagesize($file_from);
$resize_flag = true;

//アップされた画像を元に新規画像を作成
switch ($upImgSize[2]) {
case "1":
$upNewTmpImg = imagecreatefromgif($file_from);
break;
case "2":
$upNewTmpImg = imagecreatefromjpeg($file_from);
break;
case "3":
$upNewTmpImg = imagecreatefrompng($file_from);
break;
default:
$resize_flag = false;
break;
}

if ($width == 0 && $height == 0) {
$resize_flag = false;
}

if ($resize_flag) {
// アップされた画像をリサイズして保存
//TrueColorイメージを新規に作成する(引数1:サイズ変更後の横サイズ /引数2:サイズ変更後の縦サイズ)
$img_width = $upImgSize[0];
$img_height = $upImgSize[1];

if (($resize || $img_width > $width) && $width) {
$img_width = $width;
$img_height = $upImgSize[1] * $width / $upImgSize[0];
}
if (($resize || $img_height > $height) && $height) {
$img_width = $upImgSize[0] * $height / $upImgSize[1];
$img_height = $height;
}
if ($upImgSize[2] == "1") {
$newImage = ImageCreate($img_width, $img_height);
}
else {
$newImage = ImageCreateTrueColor($img_width, $img_height);
}

/*
* 再サンプリングを行いイメージの一部をコピー、伸縮する
* ※ImageCopyResampled()の引数一覧(順番に)
* コピー先、コピー元、コピー先のX座標値、コピー先のY座標値、
* コピー元のX座標値、コピー元のY座標値、
* コピー先の横サイズ、コピー先の縦サイズ、
* コピー元の横サイズ、コピー先の縦サイズ */
$icr_result = ImageCopyResampled($newImage,$upNewTmpImg,0,0,0,0,$img_width,$img_height,$upImgSize[0],$upImgSize[1]);

// 画像をファイルに出力する
switch ($upImgSize[2]) {
case "1":
if($icr_result)$ij_result = imagegif($newImage, $file_to);
break;
case "2":
if($icr_result)$ij_result = imagejpeg($newImage, $file_to);
break;
case "3":
if($icr_result)$ij_result = imagepng($newImage, $file_to);
break;
}

// 作成し終わった画像テンポラリーファイルを破棄する
ImageDestroy($upNewTmpImg);
imageDestroy($newImage);

// 処理に失敗:強制終了)
if(!$icr_result||!$ij_result) {
return false;
}
}
else {
//リサイズなし
if (!copy($file_from, $file_to)) {
return false;
}
}

return $upImgSize[2];
}

▲------------------------------------

第一引数に元ファイルのフルパス、第二引数にコピー先のフルパスを渡します。

第三引数と第四引数は、それぞれリサイズ後の幅と高さを渡しますが、第五引数が
trueの場合に、そのサイズに強制リサイズします。第五引数がfalse、または省略
された場合は、第三引数と第四引数のどちらかがサイズを超えた場合にのみ、縦横比
固定でリサイズします。

画像フォーマットが対応していないものや、サイズを指定しなかった場合は、
そのまま指定したコピー先にコピーします。

画像作成に失敗した場合や、書き込みに失敗した場合は、falseを返します。
成功した場合は、画像タイプを返します。

 

・メールアドレスチェック関数

メールアドレスのチェックは、厳密に行うと、非常に難しいようです。
現在も、正しいメールアドレスのチェック方法はないようです。

試行錯誤して、簡易チェックで落ち着いた関数をご紹介いたします。

▼サンプル----------------------------

//------------------------------------------------------------------------------
//メールアドレスチェック
//引数 : チェック文字列
//戻り値 : true:正常、false:正しくない
function check_email($str)
{
$regex = $strict ? '/^([.0-9a-z_+-]+)@(([0-9a-z-]+\.)+[0-9a-z]{2,})$/i' : '/^([*+!.&#$|\'\\%\/0-9a-z^_`{}=??:-]+)@(([0-9a-z-]+\.)+[0-9a-z]{2,})$/i';
if (preg_match($regex, trim($str))) {
return true;
}
else {
return false;
}
}

▲------------------------------------

メールアドレスで、「.」や「/」などが「@」の前にきても正しいとしておいた方が
良いようで、この関数は、それに対応しております。

もし、間違いなどあれば、ご連絡いただけると嬉しいです。


・ファイル入出力関数

以前、ファイルのオープン、読み込み、書き込み、クローズの手順をご紹介したと
思いますが、今回は、1行でファイルの読み込み、書き込みを行う関数をご紹介いた
します。

この関数は、PHPの標準関数ですので、詳しくはPHPマニュアルでご確認いただけま
す。

▼サンプル----------------------------

//ファイルの読み込み
$in_data = file_get_contents("./test.txt");

//ファイルへ書き込み
$out_data = "TEST";
file_put_contents("test2.txt", $out_data);

▲------------------------------------

これだけでファイルの読み込み、書き込みができるので、楽ですね。

file_put_contents関数は、上書きだけでなく、追加書き込みも可能です。
(デフォルトは、上書きモード)
また、一時ロックなども用意されているようですので、二重書き込みなども防げま
す。

詳しくは、PHPマニュアルでご確認ください。


・文字チェック関数

今回は、文字列チェックのPHP標準関数をご紹介します。

さっそく、サンプルです。

▼サンプル----------------------------

$string = "abcdefg";

if (ctype_alnum($string)) {
print "英数字のみ";
}

if (ctype_alpha($string)) {
print "英字のみ";
}

if (ctype_digit($string)) {
print "数字のみ";
}

▲------------------------------------

文字列の中身をチェックする関数です。ctype_alnumは半角英数字のみかどうか、
ctype_alphaは半角英字のみかどうか、ctype_digitは半角数字のみかを
チェックします。

実際は電話番号やメールアドレスなどの判定が多いと思うので、あまり使う機会は
少ないかもしれませんが、正規表現などでやるより楽に書けるので、覚えておくと
便利かもしれません。

詳しくは、PHPマニュアルでご確認ください。

 

・ファイル容量バイト文字列取得関数

今回は、ファイル容量のバイト文字列を取得する関数をご紹介します。

ファイル容量のバイト文字列というのは、1000という数字を1KB(キロバイト)などの
文字で表す文字列のことです。

さっそく、サンプルです。

▼サンプル----------------------------

//------------------------------------------------------------------------------
// ファイル容量単位取得
// 引数: ファイルサイズ(バイト)、小数点以下の文字数
// 戻り値: ファイルサイズ文字列(TB、GB、MB、B)
function get_file_unit($size, $num = 1) {
if (strlen($size) > 12) {
$res = round($size / 1000000000000, $num) . "TB";
}
elseif (strlen($size) > 9) {
$res = round($size / 1000000000, $num) . "GB";
}
elseif (strlen($size) > 6) {
$res = round($size / 1000000, $num) . "MB";
}
elseif (strlen($size) > 3) {
$res = round($size / 1000, $num) . "KB";
}
else {
$res = $size . "B";
}
return $res;
}

▲------------------------------------

第一引数で数値の文字列を渡すと、文字列の長さに応じて、TB(テラバイト)、
GB(ギガバイト)、MB(メガバイト)、KB(キロバイト)、B(バイト)をつけて返します。
ただし、文字列の判定は行っていないので、基本的にInteger型で渡してください。

第二引数では、小数点以下の文字数を渡します。
例えば1を渡した場合は、10.9KBのように、小数点以下第一位まで表示します。


・古いファイルを削除する関数

今回は、テンポラリディレクトリなどの古いファイルを削除する関数をご紹介します。

指定したディレクトリの中の全ファイルの更新日を取得し、指定した時間よりも古い
場合、ファイルを削除します。

さっそく、サンプルです。

▼サンプル----------------------------

//------------------------------------------------------------------------------
// テンポラリディレクトリの古いファイルを削除
// 引数: ディレクトリ名、年、月、日
// 戻り値: なし
function delete_tmpfile($dir_name, $year = 1, $month = 0, $day = 0)
{
$tmp_time = mktime(0, 0, 0, date("n") - $month, date("j") - $day, date("Y") - $year);
if (is_dir($dir_name)) {
if ($dh = opendir($dir_name)) {
while (($file = readdir($dh)) !== false) {
if ($file == "." || $file == "..") {
continue;
}
$filename = $dir_name . "/" . $file;
if (is_file($filename)) {
if ($tmp_time > filemtime($filename)) {
unlink($filename);
}
}
}
closedir($dh);
}
}
}

▲------------------------------------

第一引数にディレクトリのパスを渡します。ディレクトリでないものを渡した場合は、
何も起こりません。

第二引数に年、第三引数に月、第四引数に日を渡しますが、この指定した時間よりも
古いものを削除するということです。

例えば、第三引数を3にすると、3ヶ月前より前に作成されたファイルを削除します。

ちなみに、再帰関数ではありませんので、サブディレクトリ以下は削除対象には
なりません。

この関数は、一時保存ファイルのゴミ整理などに使用していただければと思います。
重要なディレクトリなどに使用する場合は、古いファイルが削除されますので、
十分にご注意ください。


・環境変数を出力する

今回は、関数や技術の紹介ではないですが、PHPで環境変数を出力する方法をご紹介
します。

環境変数とは、HTTPで接続した時に必ず先頭についているヘッダに含まれる変数の
ことです。

PHPでは$_SERVERに格納されますが、これを一気に出力して中身を確認できます。

では、サンプルです。

▼サンプル----------------------------

<html>
<body>
<table border="0" cellpadding="2" cellspacing="2">
<?

foreach ($_SERVER as $key => $value) {
print "<tr>";
print "<td bgcolor='#ddddff'>" . $key . "</td><td>" . $value . "</td>";
print "</tr>";
}

?>
</table>
</body>
</html>

▲------------------------------------

$_SERVERの中身をループで表示しているだけです。

まぁ、phpinfo()でも環境変数は見れますが、上記サンプルは、環境変数のみの
出力ですので、少しは見やすいと思います。

環境変数はプログラムでもよく使いますので、上記のページにブックマークをして
おくと、便利かもしれません。

・php.iniについて

今回は、php.iniの重要なパラメータについて、少し解説いたします。

○magic_quotes_gpc
GETやPOSTで送信された文字列を、自動エスケープするかどうかの設定です。
例 :
\ → \\
' → \'

ユーザーが入力した文字を、そのままデータベースに格納するのは危険なため、
多くのサーバでは、デフォルトでエスケープする設定になっているかと思います。
しかし、自分でエスケープしている場合は、二重エスケープとなりますので、
基本的には、magic_quotes_gpcはOFFにして、自分でエスケープするのが最善と
思います。

自分でエスケープしたいのに、magic_quotes_gpcがONになっていて、変更できない
場合は、一度エスケープを戻すという方法があります。
例 :
$request_data = $_REQUEST;
if (get_magic_quotes_gpc()) {
$request_data = stripslashes_deep($request_data);
}

○register_globals
連想配列のキーとなっている名前と、変数名を同じ扱いにするかどうかの設定です。
例 :
ONの場合、$_POST["key"] で送られたデータは $key でも扱える

サーバによっては、デフォルトがONの場合がありますが、不具合が発生しやすくなる
ので、OFFにした方がよいかと思います。

○error_reporting
エラーログや画面上に、エラーやワーニングを、どのレベルまで表示するかの
設定です。設定の仕方は、PHPのマニュアルをご参照いただければと思います。
デフォルトは、Notice(通知)以外のエラーやワーニングを表示するのが通常です。
理想は、Noticeも含め、全てのPHPの通知が表示されないようなプログラミングを
するのが望ましいですが、それは難しいので、通常はデフォルトのままで良いと
思います。

本番環境で、画面に何もPHPの通知を表示させたくない場合は、
display_errors
をOFFにすれば、エラーログにのみ出力されるようになります。

 

・携帯固有番号取得関数

今回は、携帯電話の固有番号を取得する関数をご紹介します。

携帯の固有番号とは、各携帯電話機器に振られているユニークなIDのことで、これを
使って、簡単ログインや、キャンペーン応募の重複チェックなどを行ったりします。

携帯固有番号は、環境変数のHTTP_USER_AGENTの中にありますので、これを取り出し
ます。

では、早速サンプルをご紹介します。

▼サンプル----------------------------

//------------------------------------------------------------------------------
//携帯固有番号取得
//引数 : なし
//戻り値 : 携帯固有番号
function get_mobile_number()
{
$id = null;
$agent = $_SERVER['HTTP_USER_AGENT'];
if (ereg("^DoCoMo", $agent)) {
if(preg_match('/icc([a-zA-Z0-9]+)/',$agent, $match)) {
//FOMAカード番号を優先
$id = $match[1];
}
else if(preg_match('/ser([a-zA-Z0-9]+)/',$agent, $match)) {
//端末番号(Mova)
$id = $match[1];
}
}
elseif (ereg("^J-PHONE|^Vodafone|^SoftBank", $agent)) {
if(preg_match('/\/SN([a-zA-Z0-9]+)/',$agent, $match)) {
$id = $match[1];
}
}
elseif (ereg("^UP.Browser|^KDDI", $agent)) {
$id = $_SERVER['HTTP_X_UP_SUBNO']; // サブスクライバID
}
return $id;
}

▲------------------------------------

キャリア毎に判別を行ない、IDを取り出して、リターンします。

ただし、携帯電話も日々進化して、仕様が変わりますので、上記のような関数も
メンテナンスが必要です。

また、携帯固有番号は、ユーザーが意図的に変更することができますので、これだけ
を使用して簡単ログインを行うと、セキュリティ上、問題がありますので、十分に
ご注意ください。

 


Top 次のページへ >>


このエントリーをはてなブックマークに追加



OfficeLance

お問い合わせはこちらから