1. ホーム >
  2. 書籍 >
  3. PHP逆引きレシピ すぐに美味しいサンプル&テクニック

PHP逆引きレシピ すぐに美味しいサンプル&テクニック







形式:
書籍
発売日:
ISBN:
9784798119861
価格:
本体2,600円+税
仕様:
A5・768ページ
分類:
プログラミング(Web系)
  • このエントリーをはてなブックマークに追加

プロが選んだ三ツ星レシピ!! すぐに美味しいサンプル&テクニック261

本書は、PHP言語を日々実践の場で利用している方々へ贈る、必須のレシピ集であり、また初級レベルのPHP開発者が中級レベルを目指すために必要な秘訣やヒントを一杯詰め込んだ、便利な逆引き本です。

PHP言語の習得は難しいものではありません。しかし誰しもが、つまづいて諦めた悩ましい疑問の1つや2つはあるはずです。また、PHPを使い始めてまもない人や、開発の経験が浅い方は、そもそも何が自分の成長の壁になっているかがわかりません。本書はそうした見えない壁に悩む、初級レベルを脱皮して開発の勘どころをわきまえた中級レベルを目指す方々を対象に、実践の場で役立つ関数、ライブラリ、サンプルコードを厳選してまとめたものです。さらに、快適な開発に必要な環境整備や、成果物を公表するために必要な日本の主要レンタルサーバーの特徴についても解説しています。

学習と実践の溝を埋め、浅い開発の経験をカバーするように、本書には、プロの開発現場のノウハウが濃縮されています。なお、主に開発者向けに書かれてはいますが、専門学校や大学のプログラミング学習用サブテキストとして利用することも可能です。リファレンス用途のインデックスの充実化はもちろんのこと、アタマと手の両方を使って学ぶことを望まれる方のために、サンプルファイルもすべて用意されています。


第1章 準備

1.1 サーバー環境
001 サーバーのPHP情報を知りたい
002 php.iniとは?
003 文字エンコードを統一したい
004 日本語関連の設定をしたい
1.2 開発環境
005 PHPマニュアルを使いたい
006 開発環境を作りたい
007 XAMPPをインストールしたい
008 MAMPをインストールしたい
009 WindowsにEclipse PDTをインストールしたい
010 Mac OS XにEclipse PDTをインストールしたい

第2章 PHPの基本構文

2.1 変数
011 変数と文字列を出力したい
012 echo<<<END、$変数=<<<ENDって何ですか?
013 変数化セットされているかどうか調べたい
014 変数の型を調べたい
015 (int)、(string)って何ですか?
016 NULLって何ですか?
017 =&って何ですか?
018 環境変数の情報を取得するには?
2.2 定数
019 定数を使用するには?
020 定義済みの定数を知りたい
2.3 条件分岐
021 条件で処理を分岐するには?
022 switch文の使い方を知りたい
023 「条件式?式1:式2」って何ですか?
024 2つの値を比較するには?
025 ==と===、!=と!==の違いは?
2.4 繰り返し処理
026 PHPの繰り返し構文を知りたい
027 繰り返し処理の途中でループを抜けたい
028 繰り返し処理の途中でスキップしたい
2.5 関数
029 関数を定義したい
030 デフォルト引数値を指定したい
031 関数の引数に付いた&って何ですか?
032 引数の数が変わる関数を定義したい
033 変数のスコープを知りたい
034 静的変数とは?
035 関数が定義済みかどうか調べたい
036 関数から複数の値を受け取りたい
2.6 ファイルのインクルード
037 他のファイルを取り込んで利用したい
038 エラーメッセージを制御したい
039 エラーレベルを設定したい
040 エラーメッセージを送信したい
041 ユーザーエラーを発生させたい

第3章 PHPの基本テクニック

3.1 文字列
042 文字列の一部を取り出したい
043 特定の文字列が含まれているか調べたい
044 文字列を置き換えたい
045 正規表現によるパターンマッチをしたい
046 正規表現による複雑な文字列の置き換えをしたい
047 文字列を繰り返し表示したい
048 アルファベットを小文字から大文字に変換したい
049 アルファベットを大文字から小文字に変換したい
050 全角英数字を半角に変換したい
051 半角英数字を全角に変換したい
052 カナ文字を全角かなや半角カナに変換したい
053 文字列の長さを調べたい
054 文字列の前後の空白を削除したい
055 文字エンコードを変換したい
056 ハッシュ値を求めたい
057 ランダムな文字列を生成したい
3.2 数値
058 数値の丸め(四捨五入)、切り上げ、切り捨てをしたい
059 数値を3桁ごとにカンマ区切りしたい
060 数値を必ず小数点以下まで表示させたい
061 乱数を生成したい
3.3 日付時刻
062 日付や時刻の一部を取り出して使いたい
063 日付の表示形式を変えたり、日付の加減算をしたい
064 現在のタイムスタンプを取得したい
065 日付をタイムスタンプに変換したい
066 文字列表現の日付をタイムスタンプに変換したい
067 日付が正しいかどうかチェックしたい
068 指定した日付の曜日を求めたい
069 月末日を求めたい
070 締め日を求めたい
071 「第3月曜日」を求めたい
072 指定した日付の年度を求めたい
073 西暦を和暦にしたい
074 生年月日から現在の年齢を求めたい
075 カレンダーを表示したい
076 日付セレクトメニューを表示したい
3.4 配列
077 配列を使いたい
078 配列の内容をデバックしたい
079 配列を結合したい
080 配列を並べ替えたい
081 配列を逆順にしたい
082 連想配列を値で並べ替えたい
083 連想配列を添え字で並べ替えたい
084 配列の先頭に値を追加したい
085 配列の末尾に値を追加したい
086 配列の指定箇所に値を追加したい
087 配列の先頭を取り除きたい
088 配列の末尾を取り除きたい
089 配列の指定範囲を取り除きたい
090 配列の指定範囲を置き換えたい
091 配列の一部を取り出したい
092 配列に値が存在するか調べたい
093 配列の値を一度に複数の変数へセットしたい
094 配列のすべての要素を一括処理したい
095 配列を連結して1つの文字列にしたい
096 カンマやスペース区切りの文字列を分割して配列にしたい
3.5 PHPの設定
097 PHPの設定を調べたい
098 PHPの設定を一時的に変更したい
3.6 ベンチマーク
099 ベンチマークを取得したい
100 関数の平均実行時間を測定したい

第4章 ファイルとディレクトリ

4.1 ファイル
101 ファイルを扱う処理の流れは?
102 日別のログファイルを作成したい
103 一時ファイルにデータを取得したい
104 fopen()関数を使わずにファイルにデータを書き込みたい
105 ファイルのデータを取得したい
106 ファイルから指定バイト数ずつ取得したい
107 ファイルのデータをまとめて取得したい
108 ファイルの最終更新時刻を取得したい
109 ファイルの最終更新時刻を取得したい
110 ファイルの拡張子を取得したい
111 ファイルの拡張子を取得したい
112 パス名からファイル名を取得したい
113 ファイルが存在するか調べたい
114 ファイルが読み取り可能か調べたい
115 ファイルが書き込み可能か調べたい
116 ファイルをコピーしたい
117 ファイルを削除したい
4.2 ディレクトリ
118 ディレクトリを作成したい
119 パス名からディレクトリ名を取得したい
120 絶対パス名を取得したい
121 ディレクトリが使用可能な容量を取得したい
122 ディレクトリを削除したい
123 ディレクトリ内のディレクトリやファイル名を取得したい
124 ディレクトリ内の画像を一覧表示したい
4.3 PDFファイル
125 PDFファイルを生成したい
126 PDFにリンク文字列を書き込みたい
127 PDFに表を書き込みたい
128 PDFに直線を挿入したい
130 テキストファイルをPDFに変換したい
131 既存のPDFファイルを元にPDFファイルを生成したい
4.4 CSVファイル
132 CSVファイルを読み込みたい
133 CSVファイルを出力したい
4.5 画像ファイル
134 画像を作成したい
135 画像をファイルとして保存したい
136 既存ファイルから画像を生成したい
137 画像のサムネイルを作成したい
138 画像にテキストを追加したい
139 画像に点を書き込みたい
140 画像のサイズを取得したい
141 グラフを生成したい
142 折れ線グラフを生成したい
143 棒グラフを生成したい
144 パイグラフを生成したい
145 QRコードを生成したい

第5章 PEARとSmarty

5.1 PEARの使い方
146 PEARを使いたい
147 PEARをアップグレードしたい
5.2 Smartyの使い方
148 Smartyを使いたい
149 テンプレートを分割したい
150 フィルターを使いたい
151 繰り返し処理したい
152 条件分岐したい
153 スーパーグローバル変数を取得したい
154 メールアドレスの暗号化でSPAM対策したい

第6章 Webプログラミング

6.1 フォームの基礎
155 フォームを使いたい
156 テキストボックスを使いたい
157 テキストエリアを使いたい
158 テキストボックスを使いたい
159 セレクトメニューを使いたい
160 ラジオボタンを使いたい
161 パスワードボックスを使いたい
162 隠しフィールドを使いたい
163 ファイル名入力ボックスを使いたい
164 ボタンを使いたい
6.2 フォームの実際
165 複数選択可能なセレクトメニューやチェックボックスの値を受け取りたい
166 日付入力のためのフォームを生成したい
167 データが代入されたかどうかをチェックしたい
168 データ入力時のみデータを処理するには?
169 特定の文字列を含むかチェックしたい
170 文字数や桁数をチェックしたい
171 数値かどうかをチェックしたい
172 金額にカンマを付けたい
173 日付かどうかチェックしたい
174 ファイルの拡張子をチェックしたい
175 メールアドレスの形式をチェックしたい
176 データベースに登録済みかどうかチェックしたい
177 配列からラジオボタンを生成したい
178 データベースからセレクトメニューを生成したい
179 簡単なログインフォームを作成したい
180 メール送信フォームを作成したい
181 magic_quotes_gpcがOnでもOffでも動作するようにしたい
6.3 入力データの加工
182 安全なデータベース操作をしたい
183 安全にブラウザで値を表示したい
184 タグを取り除きたい
185 URIの一部に日本語を利用したい
186 改行タグを改行文字の前に挿入したい
187 複数の検索キーワードで検索したい
188 複数選択されたデータを検索したい
189 年/月/日のデータをタイムスタンプに変換したい
190 「YYYY/MM/DD」形式の日付を利用したい
6.4 Cookie
191 データをCookieに保存したい
192 Cookieのデータを読み取りたい
6.5 セッション
193 セッションを使いたい
194 セッション名を取得/設定したい
195 セッションIDを取得したい
196 セッション変数を使いたい
197 セッション変数を破棄したい
198 セッションCookieのパラメータを設定したい
199 セッションを破棄したい
6.6 ファイルアップロード
200 アップロードされたファイルか調べたい
201 複数の画像ファイルをアップロードしたい
202 ファイルをダウンロードしたい
6.7 メール処理
203 添付ファイルつきのメールを送りたい
204 メールをPOPサーバーから取得したい
6.8 ネットワーク
205 IPアドレスからホスト名を取得したい
206 ホスト名からIPアドレスを取得したい
6.9 HTTPヘッダー
207 HTTPヘッダーを送信したい
208 別のページに飛ばしたい
209 キャッシュを無効にしたい
6.10 データベース(MySQL)
210 データベースに接続したい
211 複数行の結果を取得したい
212 1行の結果を取得したい
213 レコードをオブジェクトとして取得したい
214 新規レコードを作成したい
215 イメージデータを格納したい
216 レコードを更新したい
217 レコードを削除したい
218 クエリ結果のメモリを開放したい
219 テーブルを作成したい
220 エラー情報を取得したい
6.11 その他
221 ユニークなIDを作成したい
222 URIの構成要素を解析したい
223 処理を一時停止したい

第7章 クラスとオブジェクト

7.1 クラスの基礎
224 クラスとは?
225 クラスを使いたい
226 「$this」や「->」とは何ですか?
227 クラスの継承とは?
228 コンストラクタとは?

第8章 セキュリティ

8.1 セキュリティ対策の基本
229 セキュリティ対策の基本を知りたい
230 入力値の検証方法を知りたい
231 文字列を比較する場合の注意点を知りたい
8.2 PHPの設定
232 本番環境でのエラー出力の設定方法は?
233 セーフモードとは?
234 より安全なphp.ini設定を知りたい
8.3 セキュリティ対策
235 パラメータ改竄とは?
236 XSSとは?
237 XSS対策をしたい
238 CSRFとは?
239 NULLバイト攻撃とは?
240 SQLインジェクションとは?
241 CSコマンドインジェクションとは?
242 ディレクトリトラバーサルとは?
243 インクルード攻撃とは
244 eval利用攻撃とは?
245 メールヘッダーインジェクションとは?
246 Cookieを安全に利用したい
247 セッションハイジャック対策をしたい
248 セッション固定化攻撃を防ぎたい
249 SSL利用時にセッションを安全に利用したい
250 Ajaxのセキュリティについて知りたい

第9章 トラブルシューティング

9.1 エラー表示など
251 ページが真っ白で何も表示されない
252 大量のNoticeエラーが表示される
253 「Warning:Cannot modify header information・・・」エラーが表示される
254 特定の処理においてエラーを無視したい
9.2 文字化け
255 日本語のWebページが文字化けする
256 フォームから送信だれた値が文字化けしたり表示されない
257 フォームから送信された「申込」が「申¥込」になる
258 日時だけが文字化けする

第10章 アプリケーション編

10.1 phpMyAdmin
259 phpMyAdminを使いたい
10.2 WordPress
260 WordPressを使いたい
10.3 MyNETS
261 MyNETSを使いたい

本書はダウンロードファイルの提供はございません。

書籍への問い合わせ

正誤表、追加情報をご確認の上、こちらよりお問い合わせください

書影の利用許諾について

本書籍に関する利用許諾申請はこちらになります

追加情報はありません。

本書に誤りまたは不十分な記述がありました。下記のとおり訂正し、お詫び申し上げます。
なお、こちらは紙の書籍の正誤となります。

ご購入刷数 最終更新日:2013年05月13日
発生刷 ページ数 改定刷 電子書籍改定 内容 登録日
1刷 105
下から2行目
2刷 未定
三項演算子 [レシピ023] を使った以下の記述と同じ意味になりますが、
三項演算子 [レシピ023] を使った以下の記述と同じ結果になりますが、
2009.09.08
1刷 132
表3.5
4刷 未定
h | 「全角ひらがな」を「全角カタカナ」に変換
c | 「全角カタカナ」を「全角ひらがな」に変換

h | 「全角ひらがな」を「全角カタカナ」に変換
H | 「半角カタカナ」を「全角ひらがな」に変換

c | 「全角カタカナ」を「全角ひらがな」に変換
2010.05.19
1刷 157
1つ目のリスト
2刷 未定
echo date('Y年m月d日', '1237827055');
echo date('Y年m月d日', 1237827055);
2009.10.01
1刷 157
2つ目のリスト
2刷 未定
echo strtotime('+1 day', '1237827055');
echo strtotime('+1 day', 1237827055);
2009.10.01
1刷 163
本文4行目
2刷 未定
変換できます。
変換できます。なお、P480のNOTEも参照してください。
2009.10.01
1刷 174
中段、「月初日の曜日を元にして第1○曜日の日付を求めます。」の2行目
6刷 未定
if($firstday < 0)
if($firstday <= 0)
2011.09.13
1刷 257、259
リスト
4刷 未定
ファイルを読み取りモードで開きます。
$fp = fopen($fileName, 'rb');

ファイルを読み取りモードで開きます。
$fp = fopen($fileName, 'rb');
if (!is_resource($fp)) {
 die(' ファイルを開けませんでした。 ');
}
2013.05.13
1刷 333
グラフ内のx(下部)
2刷 未定
0 10 20 30 40 50 60 70 80 90 100
1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2010.01.05
1刷 401
本文3~4行目
2刷 未定
そこで、@(エラー制御演算子)レシピ254でNoticeエラーが出ないようにしています。
そこで、isset()レシピ167変数がセットされているか確認して処理しています。
2009.10.01
1刷 466
本文、下から1行目
4刷 未定
urlencode()関数で元に
urldecode()関数で元に
2010.05.19
1刷 473、476
「NOTE」の上
2刷 未定
以下の文章を追加します。
PHP4またはMySQL 4.0(ロリポップなど)の環境ではサンプルコードの修正が必要となります。P.526のNOTE「MySQLの文字エンコード指定」を参照してください。
2009.10.01
1刷 474
リスト最終行の網掛け部
2刷 未定
$flagの値の判定します。
$flagの値判定します。
2009.10.01
1刷 480
ページ下部
2刷 未定
以下の文章を追加します。
NOTE
strtotimeの2038年問題

32ビットシステム上でのタイムスタンプの有効な範囲は、通常、1901年12月13日 20:45:54 UTCから2038年1月19日 03:14:07 UTCまでです。この範囲を超える日付はstrtotime()関数では扱えませんので注意してください。
PHP5.2以降ではDateTimeクラスを使うことでこの問題を解決できます。
2009.10.01
1刷 506
リスト6行目
未定 未定
header('Content-Type: "' . $mime . '"');
header('Content-Type: ' . $mime);
2013.05.13
1刷 509
リスト中ほど
未定 未定
$body .= "Content-Type: image/jpeg; name=\"$fileName\r\n";
$body .= "Content-Type: image/jpeg; name=\"$fileName\"\r\n";
2013.05.13
1刷 511
リスト中ほど
2刷 未定
PEAR::Net_POP3をインクルードします。
require_once('Net/POP3.php');
PEAR::Net_POP3をインクルードします。
require_once 'Net/POP3.php';
2009.10.01
1刷 538
「NOTE」リスト3行目
未定 未定
`image` blob NOT NULL,
`image` mediumblob NOT NULL,
2013.05.13
1刷 549
リストの1つ目の網掛け(作成するテーブル~)部分
2刷 未定
$newTable = 'id INT(2) NOT NULL AUTO_INCREMENT PRIMARY KEY, ' .
         'data VARCHAR(100) NOT NULL';
$newTable = '`id` INT(2) NOT NULL AUTO_INCREMENT PRIMARY KEY, ' .
         '`data` VARCHAR(100) NOT NULL';
2009.09.08
1刷 549
リストの2つ目の網掛け(テーブルを追加する~)部分
2刷 未定
$sql = sprintf("CREATE TABLE example2 (%s) ENGINE=MyISAM " .
          "DEFAULT CHARSET=utf8",
          mysql_real_escape_string($newTable));
$sql = sprintf("CREATE TABLE `example2` (%s) ENGINE=MyISAM " .
          "DEFAULT CHARSET=utf8",
          $newTable);
2009.09.08
1刷 549
リストの2つ目の網掛け(// ロリポップの場合)部分
2刷 未定
// $sql = sprintf("CREATE TABLE example2 (%s) ENGINE=MyISAM ",
//          mysql_real_escape_string($newTable));
// $sql = sprintf("CREATE TABLE `example2` (%s) ENGINE=MyISAM ",
//          $newTable);
2009.09.08
1刷 550
2つ目のリスト
2刷 未定
$sql = sprintf("CREATE TABLE example2 (%s) ENGINE=MyISAM ",
         mysql_real_escape_string($newTable));
$sql = sprintf("CREATE TABLE `example2` (%s) ENGINE=MyISAM ",
         $newTable);
2009.09.08
1刷 559
ソースコード中ほど
4刷 未定
$fp = fopen($file, 'r');
while (!feof($fp)) {
 $line = fgets($fp));

$fp = fopen($file, 'r');
if (!is_resource($fp)) {
 die(' ファイルを開けませんでした。 ');
}

while (!feof($fp)) {
 $line = fgets($fp));
2010.05.19
1刷 590
「●disable_functions」2~3行目
未定 未定
system()関数、exec()関数、passthru()関数、popen()関数などやPHPコードを実行できるeval()など
system()関数、exec()関数、passthru()関数、popen()関数など、
2013.05.13
1刷 616
「クエリを準備します」の上の部分
2刷 未定
if (mysqli_connect_errno()) {
  die('データベースエラー');
}
if (mysqli_connect_errno()) {
 die('データベースエラー');
}
//文字エンコードの指定
else if (!mysqli_set_charset($link, 'utf8')) {
 die('データベースエラー');


}

1つ目の「die('データベースエラー');」の開始位置も変更します。
2009.10.06
1刷 628
「●secure属性」7行目
未定 未定
Cookieは暗号されずに
Cookieは暗号されずに
2013.05.13
1刷 650
下から2行目
2刷 未定
三項演算子 [レシピ023] を使った以下の記述と同じ意味になりますが、
三項演算子 [レシピ023] を使った以下の記述と同じ結果になりますが、
2009.09.08
1刷 731
INDEX「C」
2刷 未定
CREATE TABLE文・・・・548
CSRF・・・・・・・・・・・・・・・438,608

CREATE TABLE文・・・・548
cron・・・・・・・・・・・・・・・・712,714

CSRF・・・・・・・・・・・・・・・438,608
2009.10.06
1刷 737
INDEX「S」
2刷 未定
strtotime()関数・・・・・157、163、479
 注意点・・・・・・・・・・・175
strtoupper()関数・・・・125

strtotime()関数・・・・・157、163、479
 2038問題・・・・・・・・・480

 注意点・・・・・・・・・・・175
 年の桁数・・・・・・・・・480

strtoupper()関数・・・・125
2009.10.06
1刷 vii
「レンタルサーバー動作確認マークについて」1行目
2刷 未定
ロリップ
ロリップ
2009.09.08
4刷 515
リスト内
5刷 未定
echo '<p>' . $ipaddress . ' → ' . gethostbyaddr($ipaddress) . '</p>';
echo '<p>' . h($ipaddress) . ' → ' . h(gethostbyaddr($ipaddress)) . '</p>';
2010.12.03
4刷 515
リスト内
5刷 未定
echo '<p>ユーザー: ' . $ipaddress . ' → ' . gethostbyaddr($ipaddress) . '</p>';
echo '<p>ユーザー: ' . h($ipaddress) . ' → ' .
  h(gethostbyaddr($ipaddress)) . '</p>';

function h($string) { // HTMLでのエスケープ処理をする関数
 return htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
}
2010.12.03
4刷 516
リスト内
5刷 未定
echo '<p>' . $hostname . ' → ' . gethostbyname($hostname) . '</p>';
echo '<p>' . h($hostname) . ' → ' . h(gethostbyname($hostname)) . '</p>';

function h($string) { // HTMLでのエスケープ処理をする関数
 return htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
}
2010.12.03
4刷 601
一番下の網囲み
5刷 未定
htmlspecialchars('文字列', ENT_QUOTES)
htmlspecialchars('文字列', ENT_QUOTES, '文字エンコード')
2010.12.03
4刷 602
上から2行目
5刷 未定
可能性があります。
可能性があります。第3引数の詳細は、http://php-recipe.com/?p=377を参照してください。
2010.12.03
6刷 117
表3.1、\Wの説明
未定 未定
アルファベット、数字、アンダースコア
単語構成文字。[a-zA-Z0-9_]とは異なる可能性があるので注意

以下の本書公式サイトもあわせてご参照ください。
http://php-recipe.com/?p=483
2011.09.21
6刷 503
9~14行目
未定 未定
# getimagesize()関数で画像かどうかの判定をします。
  $checkImage = @getimagesize($_FILES['uploadfile']['tmp_name'][$i]);
  if ($checkImage == FALSE) {
   $error .= '画像ファイルをアップロードしてください<br />';
  } else if ($imgType != $checkImage['mime']) {
   $error .= '拡張子が異なります<br />';
  } else if ($_FILES['uploadfile']['size'][$i] > 102400) {
# getimagesize()関数で画像かどうかの判定をします。
  $checkImage = @getimagesize($_FILES['uploadfile']['tmp_name'][$i]);
  $type = $checkImage[2]; // 画像タイプを取得

  if ($checkImage == FALSE) {
   $error .= '画像ファイルをアップロードしてください<br />';
  } else if ($extension == 'gif' && $type != IMAGETYPE_GIF) {

   $error .= '拡張子が異なります<br />';

  } else if ($extension == 'png' && $type != IMAGETYPE_PNG) {

   $error .= '拡張子が異なります<br />';

  } else if ($extension == 'jpg' && $type != IMAGETYPE_JPEG) {

   $error .= '拡張子が異なります<br />';
  } else if ($_FILES['uploadfile']['size'][$i] > 102400) {

以下の本書公式サイトもあわせてご参照ください。
http://php-recipe.com/?p=457
2011.09.21
6刷 503
下から21~23行目
未定 未定
# ここでは格納ディレクトリの下に「"upfile_" + 現在のタイムスタンプ + 連番 + 拡張子」で配置します。
$moveTo = $filePath . '/upfile_' . time() . $i . '.' . $extension;
# ここでは格納ディレクトリの下に「"upfile_" + 現在のタイムスタンプ + 連番 + "_" + マイクロ秒と元ファイル名とアクセス元IPアドレスに基づくMD5 + 拡張子」で配置します。
$moveTo = $filePath . '/upfile_' . time() . $i . '_' . md5(microtime() . $_FILES['uploadfile']['name'][$i] . $_SERVER['REMOTE_ADDR']) . '.' . $extension;

以下の本書公式サイトもあわせてご参照ください。
http://php-recipe.com/?p=457
2011.09.21

関連書籍