PHP の強みは、まずその多数の組み込み関数ライブラリにあります。これにより、初心者は新しいライブラリをインストールしたり、基礎となる詳細を気にしたりすることなく、多くの複雑なタスクを実行できます。これは、Perl などの他の人気のあるプログラムの場合とまったく同じです。クライアント言語にはそれがありません。このチュートリアルの制限により、MySQL データベースに関連する一部の関数のみを学習しました (実際には、この種の関数であっても、すべてを学習したわけではありません)。この最後のセクションでは、少し範囲を広げて、データベース主導の Web サイトの構築に役立つ他の PHP 機能を見ていきます。
最初に PHP の include 関数を学びます。この関数を使用すると、同じ PHP コードセグメントを多くのページで再利用できます。また、この機能を使用して Web サイトのセキュリティを向上させる方法についても説明しました。
PHP は一般的に非常に高速で効率的ですが、サーバーの実行時間と作業負荷が増加します。トラフィックの多いサイトでは、この負担が許容できないレベルに達する可能性があります。しかし、それはサイトのデータベース主導の性質を放棄する必要があるという意味ではありません。 PHP を使用して、サーバーに過剰な負荷をかけずにバックグラウンドで半動的ページを作成する方法を見ていきます。
フォーラムがファイルのアップロードを受け入れるために タグをどのように使用しているかについてよく質問されます。また、この機能を PHP で実装する方法と、それをデータベース主導のサイトに効果的に組み込む方法についても説明します。
最後に、PHP には、動的に生成されたコンテンツを電子メール情報として簡単かつ便利に送信できる非常に強力な機能もあります。 PHP を使用して訪問者がサイトのコンテンツを友人に送信できるようにしたい場合でも、単にユーザーが忘れたパスワードを取得する方法を提供したい場合でも、PHP の電子メール機能はこれをうまく実行できます。
PHP のサーバーサイド インクルード
インターネットにしばらく取り組んでいる場合は、サーバーサイド インクルード (SSI) という用語に遭遇したことがあるかもしれません。そうでない場合は、次のサイトで Matt Mickiewicz のミニガイドを確認してください。主題。
基本的に、SSI を使用すると、Web サーバーに保存されているファイルの内容を別のファイルに挿入できます。最も一般的なアプリケーションは、Web サイトの共通デザイン部分を小さな HTML ファイルに書き込むことです。その中に、このファイルを含めることができます。ウェブページ。この小さなファイルに変更を加えると、それを含むすべてのファイルが直ちに影響を受けます。 PHP スクリプトと同様に、要求されたページをブラウザに送信する前に Web サーバーがすべての作業を実行するため、Web ブラウザはそれについて何も知る必要がありません。
PHP にも同様の機能を提供する関数があります。ただし、組み込まれるファイルには、正式な HTML やその他の静的コンテンツに加えて、スクリプトも含まれる場合があります。次の例を見てみましょう:
echo( "
ソイレントグリーンは人々から作られています! ");
?>
上記のファイルでは、include-me.inc に簡単な PHP コードが含まれています。このファイルのファイル名は .php ではなく .inc で終わることに注意してください。これは、このファイルが、一般的な Web サーバーが PHP スクリプトとみなすものとは異なることを意味します。これにより、ファイルが .php ファイルに挿入された場合にのみ実行されるようになり、PHP Web ページと PHP インクルード ファイルを区別するのにも役立ちます。
次のファイルも必要です:
が含まれます;
?>
以前に使用した PHP スクリプトも同様で、その拡張子は .php 拡張子 (サーバーで必要な場合は .php3) です。 include 関数の呼び出しに注意してください。挿入したいファイル名 (include-me.inc) を指定すると、PHP はこのファイルを取得して、インクルードの代わりに現在のファイルに挿入しようとします。両方のファイルを Web サーバーにアップロードし (Web サーバーで作業している場合は、Web サーバーのドキュメント フォルダーにコピーし)、ブラウザで testinclude.php を読み込みます。予想どおり、挿入したファイルに関する情報を含む Web ページが表示されます。
この例が機能しない場合は、php.ini ファイルで include_path オプションを構成する必要がある場合があります。お気に入りのテキスト エディタでファイルを開き、include_path で始まる行を見つけます (通常はファイルの途中にあります)。あなたがよく知っているシステム PATH 環境変数と同じように、これには PHP がインクルードするファイルを検索するディレクトリのリストが含まれています。 「.」(現在のディレクトリ)を含める必要があります。
サーバーのオペレーティング システムが Windows か UNIX かに応じて、引用符を使用するかどうかを決定する必要がある場合があります:
UNIX の場合:
include_path=.:/another/directory
Windows の場合:
include_path=".;c:anotherdirectory"
挿入されたファイルを使用してセキュリティを向上させる
PHP スクリプトには、ユーザー名、パスワード、その他の望ましくないものが含まれる場合があります機密情報を公開すること。 mysql_connect 関数を使用したことがあるかもしれません。この関数では、データベースにアクセスする必要がある PHP スクリプトに MySQL のユーザー名とパスワードを入力する必要があります。ユーザー名とパスワードが PHP のみで使用できるように MySQL をセットアップするだけで、ハッカーによる悪用を避けることができます (第 8 章で学んだように、ユーザー テーブルのホスト フィールドを設定することによって) が、さらに他の設定が必要になる場合があります。ユーザー名とパスワードを便利に保護します。
「でも、ちょっと待ってください。PHP はサーバーによって処理されるので、誰も私のパスワードを見ることはできませんよね?」 そうです。しかし、サーバーの PHP 解析へのアクセスが偶発的な理由で停止する可能性がある状況を考慮したことがありますか。これは、善意の同僚によるソフトウェアの設定ミスが原因である可能性があります。または、他の要因が原因である可能性があります。これが発生した場合、PHP ページはプレーン テキスト ファイルとして処理されるため、すべての PHP コード (ユーザーのコードを含む)パスワード)を完全公開します!
このようなセキュリティ ホールを防ぐには、機密情報を含むコードを挿入ファイルに配置し、それを Web サービスのディレクトリ構造の一部ではないディレクトリに配置します。このディレクトリを PHP の include_path (php.ini に追加) に追加すると、Web サーバーは Web サーバーとして扱わないため、内部のファイルの安全性を心配することなく、PHP の include 関数で使用されるディレクトリを指定できます。 .ページを表示します。
たとえば、Web サーバーがすべての Web ページが /home/httpd/ とそのサブディレクトリに存在する必要があると定義している場合、インクルード ファイルを保持するために /home/phplib/ というディレクトリを作成できます。このディレクトリを include_path に追加すれば準備完了です。次の例は、データベース接続コードをインクルード ファイルに配置する方法を示しています。
",
"root", "rootpassword");
?>
そして、このインクルード ファイルを使用するファイル:
php
// MySQL に接続します
include("dbConnect.inc");
mysql_select_db("myDatabase",$cnx); ご覧のとおり、サーバーの PHP が動作しなくなった場合、公開されたのは、含まれている関数の呼び出しでした。ユーザー名とパスワードは dbConnect.inc に安全に保存され、Web サイトからこのファイルに直接アクセスすることはできません。
半動的ページ
成功している (または近々成功する) Web サイトの所有者として、Web サイトへのアクセス数がますます増えることを望んでいることは間違いありません。残念ながら、特にサイトが主に動的に生成されたデータベース主導のページで構成されている場合、Web サーバー管理者が懸念するのはトラフィックの多さです。このようなページは、従来の HTML ファイルを処理する場合に比べて、Web サービス ソフトウェアを実行しているコンピュータに大きな負担を与えます。各ページ要求は、コンピューター上で小さなプログラムを実行するのと同等であるためです。
データベース主導型サイトの一部のページでは、データベースから関連データをリアルタイムで厳密に呼び出す必要がありますが、ほとんどのページの要件はそれほど厳密ではありません。たとえば、Web サイトのホームページの場合、サイトが最近行った更新内容を訪問者に簡単に紹介するのが一般的な状況です。しかし、そのような更新はどれくらいの頻度で行われるのでしょうか?一日一回?それとも週に1回ですか?そして、サイト訪問者にとって、これらの更新情報をタイムリーに知ることはどれほど価値があるのでしょうか?おそらく、サイト上のこの種の変更に対する応答に多少の遅れが生じても、それほど問題にはならないでしょう。
トラフィックの多い動的ページを「半動的」ページ、つまり、コンテンツを一定の間隔で「更新」して動的に再生成できる静的ページに変換することで、Web サーバーのデータベース処理を大幅に軽減できます。 driver ページのワークロード。
たとえば、Web サイトの新しいコンテンツの概要を提供する、index.php というホームページがあります。サーバー ログを確認すると、これがサイト内で最もアクセス数の多いページの 1 つであることがわかります。前の説明から、リクエストごとにこのページを動的に生成する必要がないことがわかったはずです。サイトを動的に保つために、新しいコンテンツがサイトに追加されるたびにこのページを更新するだけです。 PHP プログラムを使用すると、動的出力ページの静的な「イメージ」を生成できます。このイメージに、index.html という名前を付けて、元の動的ページを置き換えることができます。
ファイルの読み取り、書き込み、変更について何かを学ぶ必要があります。 PHP はこれらのジョブを非常にうまく実行できますが、必要な関数をこれまで見たことがありません:
fopen
読み取りおよび書き込み操作のためにファイルを開きます。このファイルは、サーバーのハード ドライブに保存することも、URL 経由でロードすることもできます。
fclose
ファイルの読み取りと書き込みが行われないことを PHP に通知し、他のプログラムまたはスクリプトで使用できるようにそのファイルを解放します。
fread
ファイルからデータを PHP 変数に読み取ります。読み取る情報の量 (つまり、文字数またはバイト数) を指定できます。
fwrite
PHP 変数からファイルにデータを書き込みます。
コピー
ファイルのコピー操作を実行します。
リンクを解除
ハードドライブからファイルを削除します。
分かりますか?まだお持ちでない場合でも、ご心配なく。後ほど詳しく説明します。
generateindex.phpという名前のファイルを作成します。これは、Web ブラウザがindex.php (ホームページの動的バージョン) からコンテンツを読み取り、それを静的テキストの形式でindex.html に書き込むことをシミュレートするために使用されます。このプロセス中に問題が発生した場合、元のindex.htmlの「正常な」コピーの破壊を避ける必要があるため、スクリプトは最初に新しい静的バージョンを一時ファイル(tempindex.html)に書き込みます。プロセス中に問題が発生しなければ、を使用して、index.html を上書きします。
以下は、generateindex.php のコードです。このプログラムをスムーズに理解できるように、十分な注釈が追加されています。
//使用するファイル
$srcurl = "http://localhost/index.html";
$targetfilename = "index.html"; &lt< gt; ;?php echo("$targetfilename"); ?>...
//最初に、最後の操作で残っている可能性のある一時ファイルを削除します。
//このプロセスではエラーが発生する可能性があるため、エラーを防ぐために @ を使用します。
@unlink($tempfilename);
//URL リクエストを通じて動的バージョンをロードします。
//関連するコンテンツを受信する前に、Web サーバーは PHP を処理します
//(基本的に Web ブラウザをシミュレートしているため)、
//したがって、取得するのは静的な HTML ページです。
//「r」は、この「ファイル」に対する読み取り操作のみが必要であることを示します。
$dynpage = fopen($srcurl, 'r');
//エラー処理
if (!$dynpage) {
echo("
$srcurl を読み込めません。静的ページ ".
" 更新が中止されました!
");
exit();
}
//この URL の内容を PHP 変数に読み込みます。
//1MB のデータを読み取ることを指定します (このデータ量を超えると、通常、エラーが発生したことを意味します)。
$htmldata = fread($dynpage, 1024*1024);
//作業が終了したら、ソース「ファイル」への接続を閉じます。
fclose($dynpage);
//書き込み用に一時ファイルを開きます ('w' の使用法に注意してください)
$tempfile = fopen($tempfilename, 'w');エラー処理
if (!$tempfile) {
echo("
書き込み用の一時ファイル ".
"($tempfilename) を開けません。静的ページ ".
"更新が中止されました!
") ;
exit();
}
//静的ページのデータを一時ファイルに書き込みます
fwrite($tempfile, $htmldata); 書き込みが完了したら、一時ファイルを閉じます。
fclose($tempfile);
//ここに到達すると、一時ファイルが正常に書き込まれているはずです。
//これで、それを使用して元の静的ページを上書きできます。
$ok = copy($tempfilename, $targetfilename);
//最後にこの一時ファイルを削除します。
unlink($tempfilename);
> 静的ページが正常に更新されました!
たくさんのコメントを含めたからです。これらのコメントを削除してください。このコードは実際には非常に単純であることがわかります。
これで、generateindex.php を実行する (つまり、ブラウザーを通じてこのページをリクエストする) たびに、新しく更新された Index.html が Index.php から生成されます。 index.php とgenerateindex.php をアクセス制限されたディレクトリに移動すると、サイト管理者のみがホームページを更新できるようになります。このスクリプトを拡張すると、サイト上のすべての半動的ページを生成でき、コンテンツ管理システムに「ホームページの更新」リンクを追加することもできます。
ホームページを自動的に更新したい場合は、generateindex.php を定期的に (たとえば、1 時間ごとに) 実行するようにサーバーを設定するだけです。新しい Windows 9x では、タスク マネージャー (古いバージョンの場合はパッチ パックを使用する必要があります) を使用して、php.exe を 1 時間ごとに自動的に実行できます。次の行を含む、generateindex.bat という名前のバッチ ファイルを作成するだけです。
C:PHPphp.exe C:WWWgenerateindex.php
必要に応じて、パスとファイル名を調整し、generateindex.bat を 1 時間ごとに実行するようにタスク マネージャーを設定します (毎日決まった時間に実行するには 24 を設定する必要があります) )。
Linux (または他の UNIX ベースのプラットフォーム) では、cron を使用できます。これは、さまざまな UNIX システムでタスクと実行時間を定義し、同様の作業を完了するために使用できるプログラムです。 cron についてわからない場合は、よく知っている Linux の専門家に質問するか、よく知っている Linux Web サイトを確認してください。
タスクをセットアップするための cron の使用方法は、Windows で以前に説明したものと非常によく似ています。ただし、スタンドアロン バージョンの PHP が必要です。これは、第 1 章でコンパイルされた Apache のインポート可能な PHP モジュールを参照しません。 Apache モジュールのコンパイルに使用したのと同じパッケージとは別にコンパイルする必要があります。ヘルプが必要な場合は、ソフトウェア パッケージで提供される手順を参照するか、公式 PHP Web サイトを確認してください。
経験豊富な cron ユーザーの場合、crontab ファイルに次の行を追加するだけです:
0 0-23 * * * php /path/to/generateindex.php > /dev/null
ファイルのアップロードの処理
これまでのところ、このチュートリアルのデータベース主導型サイトの例はすべてテキスト データを扱っています。ジョーク、記事、著者...これらはすべてテキスト文字列で完全に表現できます。しかし、オンライン デジタル ギャラリーを運営していて、デジタル カメラで撮影した写真をアップロードできるようにする必要がある場合は、訪問者がサイトに写真をアップロードできるようにする必要があり、それを処理する必要があります。
基本的なことから始めましょう。ユーザーがファイルをアップロードするための HTML フォームを作成します。 HTML では、これは
タグを使用するのと同じくらい簡単です。ただし、デフォルトでは、ユーザーが選択したファイル名のみが送信されます。ファイル自体をフォーム データ経由で送信するには、
ENCTYPE="multipart/ form-data">
アップロードするファイルを選択してください:
ご覧のとおり、PHP スクリプト (fileupload.php) は、前のフォームによって送信されたデータを処理します。ご想像のとおり、$uploadedfile という名前の PHP 変数 (
フラグの NAME 属性によって識別される) が自動的に作成されます。ただし、$uploadedfile に保存されるのは、アップロードされたファイルの内容ではなく、Web サーバーのハードディスクに保存されているファイルのファイル名です。このファイルは、TEMP 環境変数で指定されたディレクトリに保存されます。 、ほとんどの Windows 9x システムでは、このディレクトリは C:WindowsTEMP になります)。このファイルは、フォームの送信を処理するために使用される PHP スクリプトが実行されているときにのみ存在するため、他の目的 (Web サイトで表示するために保存するなど) に使用したい場合は、前述のコピー機能を使用する必要があります。先ほどの「別の場所にコピーを作成する」。
$uploadedfile に加えて、他の 3 つの変数も同時に作成されます。 $uploadedfile_name には送信前のファイル名が含まれます (送信されたファイルは phpx というファイル名で TEMP ディレクトリに保存されます。x は数字です)。$uploadedfile_size はファイルのサイズ (バイト単位で表現) を指定し、$uploadedfile_type はファイルのサイズを指定します。 MIME タイプ (text/plain、image/gif など)。 「uploadedfile」は送信されたファイルの INPUT フラグ内の名前にすぎず、実際のファイル名は上記の変数に格納されることに注意してください。
これらの変数に基づいて、アップロードされたファイルを受け入れるかどうかを決定できます。たとえば、私たちのギャラリーでは、JPEG または GIF ファイルのみに興味があります。これらのファイルの MIME タイプは image/pjpeg または image/gif である必要があるため、アップロードされたファイルを確認するコードはおおよそ次のようになります:
if ("image/pjpeg" == $uploadedfile_type
or "image/gif" == $uploadedfile_type ) {
// ファイルを処理します...
} else {
echo("
JPEG または GIF 画像ファイルを送信してください。 ")
}
大きすぎるファイルを拒否します ($uploadedfile_size 変数を確認することで) が、一般的にこれは良い考えではありません。この変数を取得する前に、このファイルはアップロードされ、TEMP ディレクトリに保存されています。これは、ディスク容量または帯域幅の理由でファイルのアップロードを拒否しようとして、実際には大きなファイルが (すぐに削除されても) アップロードされてしまう場合に問題になる可能性があります。
より良い方法は、受け入れられるファイル サイズの上限を事前に PHP に伝えることです。方法は 2 つあります。 1 つ目は、php.ini ファイルの Upload_max_filesize 設定を調整することです。デフォルト値は 2MB なので、それより大きなファイルを受け入れたい場合は、この値をすぐに変更する必要があります。
2 番目の方法は、フォームに暗黙的な INPUT フィールドを含めることです。その名前は MAX_FILE_SIZE で、受け入れ可能な最大ファイル サイズを定義できます。セキュリティ上の理由から、この値は php.ini ファイルの Upload_max_filesize 設定を超えることはできませんが、これにより、さまざまなページでアップロード ファイル サイズの上限を定義することができます。たとえば、次のフォームでは、最大 1K バイト (1024 バイト) までのファイルのみをアップロードできます。
ENCTYPE="multipart/form-data"> P>アップロードするファイルを選択:
前述したように、アップロードしたファイルを別のディレクトリにコピーする必要がありますそしてそれを保存します。 $uploadedfile_name からアップロードされた各ファイルのファイル名を取得する場合、同じ名前の 2 つのファイルがアップロードされないという保証はできません。この場合、元の名前を使用してファイルを保存すると、新しくアップロードされたファイルが元のアップロードされたファイルを上書きします。
このため、アップロードするすべてのファイルに一意のファイル名を指定する方法を採用するとよいでしょう。システム時刻 (PHP の time 関数を使用して取得できます) を使用すると、1970 年 1 月 1 日からの秒数を表す名前を簡単に取得できます。しかし、2 つのファイルが同じ秒に同時にアップロードされたらどうなるでしょうか?この問題を防ぐために、ファイル名にクライアントの IP アドレス (PHP によって $REMOTE_HOST に自動的に保存される) も使用します。同じ秒間に同じ IP アドレスから 2 つのファイルを受信する可能性は低いため、この解決策は実行可能です。
// ファイル拡張子を選択します
if ( "image/pjpeg" == $uploadedfile_type )
$extension = ".jpg";
else
$extension = ".gif";
// 完全なパス/ファイル名
$ filename = "C:Uploads" . time() .
$REMOTE_HOST . $extension;
// ファイルをコピーします
if (copy($uploadedfile, $filename)) {
echo("
$filename.");
} else {
echo("
$filename としてファイルを保存できませんでした!");
}
Windows の場合は、double-reverse を使用する必要があることに注意してください。バックスラッシュは PHP テキスト文字列内の特殊文字を表すために使用されるため、パス Slash() です。 UNIX では、通常どおりスラッシュ (/) を使用します。
アップロードされたファイルをデータベースに保存する
訪問者が JPEG および GIF 画像をアップロードしてサーバーに保存できるシステムをセットアップしましたが、このチュートリアルで示されているデータベース ドライバーを使用しないのはなぜでしょうか?私たちのシステムが現状のままだと、誰かが送信された画像をフォルダーから収集し、手動で Web サイトに追加する必要があります。第 7 章を振り返ると、サイト訪問者がジョークを送信してモデレータが承認するデータベースに保存されるシステムを開発しましたが、これがより良いアプローチであることがわかりました。
MySQL には、バイナリ データの保存に使用できるいくつかの列タイプがあります。データベース用語では、これらの列タイプは BLOB (バイナリ ラージ オブジェクト) を格納できます。ただし、大きなファイルをリレーショナル データベースに保存するのは得策ではありません。すべてのデータを 1 か所に置くと便利ですが、ファイルが大きいとデータベースも大きくなり、データベースが大きいとパフォーマンスが低下してバックアップ ファイルも大きくなります。
多くの場合、最良のオプションはファイル名をデータベースに保存することです。データからレコードを削除するときは、必ず対応するファイルを削除してください。
PHP での電子メール
電子メールはインターネットに強い影響を与えます。ユーザーに毎週の「新着情報」を提供する場合でも、ユーザーが紛失したパスワードを取得する方法を検討する場合でも、電子メールを使用することになります。 PHP で電子メールを使用するのは非常に簡単で、単に mail 関数を呼び出してメッセージを送信するだけです。
メール機能を使用して電子メールを送信する前に、まず PHP の電子メール関連のオプションを設定する必要があります。 Windows での php.ini ファイル内の関連する行は次のとおりです:
[mail function]
SMTP = localhost ; win32 でのみ有効
sendmail_path = ; win32 でのみ有効効果的です...
Windows を使用しているか UNIX を使用しているかに応じて、PHP は SMTP サーバーまたはローカルの sendmail システムを介して電子メールを送信します。これらの設定はこのチュートリアルの範囲を超えており、両方に関する多くの情報が他の場所で見つかります。ただし、Windows を実行している場合は、ISP が SMTP サーバーを提供している可能性があります。これは、メッセージの送信に使用する電子メール プログラムを設定するサーバーです。 SMTP をそのサーバーのホスト名または IP アドレスに設定します。
sendmail_from は、メール送信時のデフォルトのメール アドレスを設定します。このサーバーを管理している場合は、ここに電子メール アドレスを入力できます。
最後に、sendmail_path は UNIX ではコメントアウトされません (つまり、この行の前のセミコロンを削除します)。これをシステム上の sendmail プログラムのパスとファイル名に設定する必要があります。 Linux では、これは通常 /usr/sbin/sendmail を指します。
これらの設定を完了した後、Web サーバーを再起動すると、PHP ですべての電子メール機能が使えるようになります。 PHP で電子メールを送信するのは非常に簡単になりました:
mail("to-address@somewhere.com", "Message Subject", "This is the body of the message.");
複数の受信者に送信するには、次の手順を実行するだけです。複数のアドレスをカンマで区切る場合:
mail("to1@mail.net, to2@mail.net, ...", "Message Subject", "Message body"); ヘッダーに From のアドレスを指定します。または Reply-To: も非常に簡単です。これを改行で区切った 4 番目のパラメータとして指定します:
mail("to@mail.net", "Message Subject", "Message body", "From: webmaster@host.com Reply-to:admin @host.com");
データベースと組み合わせると、メーリング リストの管理が非常に簡単になります。データベースからアドレスリストを取得し、メール機能を使用してメッセージを送信するだけです。メッセージのパーソナライズも非常に簡単です。以下の例を参照してください:
// フォームで指定された $username に基づいて、データベースから $email と $password を取得します。
mail($email, "Your Password",
"こんにちは!
あなただけです。当社 Web サイトのフォームに記入し、
パスワードを紛失したことをお知らせください。
ご要望に応じて、
ユーザー名: $username
パスワード: $password
この情報を安全な場所に記録してください。次回の
pingpongballs.com へのアクセスに備えてください!
- Webmaster.
");
UNIX で実行していて、メールを送信するローカルの sendmail システムがない場合は、これを使用してください。関係ない。 PHP には完全な TCP/IP ネットワーク機能があり、必要に応じて SMTP サーバーに接続して情報を送信できます。同様に、送信メッセージに添付ファイルを含める必要がある場合、PHP でこの関数を実装することもできます。
残念ながら、組み込みのメール関数はこれらの機能をサポートしていません。必要な場合は、独自のメール関数を最初から作成する必要があります。 WROX Press の「Professional PHP Programming」がこれを実現しており、完全なコードはこの本の第 17 章にあります。これは私が強くお勧めする良い本ですが (私のレビューを参照してください)、この機能を入手したいだけであれば、この本を購入する必要はありません。ソース コードは WROX Web サイトから無料でダウンロードできます。
これら 2 つの小さな問題を除けば、PHP の組み込みメール機能は、Web ページから電子メール メッセージを送信するための非常に便利な機能を提供します。