【PHPの基礎知識①】PHPの概要
PHPとは
PHP (Hypertext Preprocessor) は、人気のあるスクリプト言語です。HTML内に記述でき、データベースとの連携が簡単で、Webアプリケーション開発などに使われています。初心者も習得しやすい関数ベースの書式や、JavaやPerl開発者に馴染みのある構文から、オブジェクト指向まで対応しています。
PHPがサポートする技術
PHPは多くのOSで動作し、Webサーバーやデータベースなどの技術をサポートしています。これらの活用により、データベース連携、ネットワークアクセス、メール送受信などの処理を記述可能です。次のような技術がサポートされています。
- 動作するOS
Windows/Linux/Mac OS X/Solaris など - サポートするデータベース
Oracle/Mysql/PostgreSQL/SQL Server/Sybase/DB2/SQLite など - サポートするWebサーバー
Apache/IIS など - サポートするプロトコル
HTTP/FTP/POP3/IMAP/SNMP/NNTP など
PHPスクリプトの概要
拡張子
PHPスクリプトの拡張子は基本的に "php" となります。ただし、拡張子を隠蔽したい場合など、 "html" に変更することもできます。世の中のWebサイトでページの拡張子がhtmlであっても静的なサイトではなく、動的なWebアプリケーションということもあり得ます。
保存先
すぐにスクリプトを動かしたい場合、Apacheインストール先のhtdocsディレクトリに保存すると良いでしょう。ただし、ApacheとPHPがインストール済で、これらの連携が取れているという前提です。または、このディレクトリにPHPスクリプト用のサブディレクトリを作成して保存しておくと良いかもしれません。
htdocsの配下のディレクトリではなく、任意のディレクトリに保存して動かしたい場合、httpd.confにエイリアスを設定します。例えば「c:\file\web\test.php」に「http://localhost\web\test.php」というURLでアクセスしたいとき、次のようにディレクトリのエイリアスを指定してパスに関連付けます。
- ディレクトリをパスに関連付けるAlias "/web/" "c:/file/web/"
簡単なPHPスクリプト
「こんにちは」と表示するだけの簡単なスクリプトは、次のようになります。
- 簡単なPHPスクリプト<? php
echo "こんにちは";
?>このコードを任意のPHPファイルとして保存して実行すると、「こんにちは」という文字列が出力されます。ブラウザに出力したりコマンドプロンプトに出力することができます。
PHPスクリプトの実行形式
PHPスクリプトの主な実行形式を2つあげると、Webアプリケーションとしての実行と、コマンドラインからの実行があります。
Webアプリケーションとして実行
Webアプリケーションとして使用される場合は、Webサーバーと連携して動作します。ブラウザからPHPスクリプトにアクセスすると実行結果が返されるというものです。
ブラウザからアクセスするWebアプリケーションは、JavaScriptのようにクライアント側で実行されるスクリプトと異なり、サーバー側で実行されることからサーバーサイドスクリプトと呼ばれます。
コマンドラインから実行
コマンドラインからの実行は、PHPを実行するときにスクリプトファイル名を指定します。
PHPスクリプトの構成要素
構成要素
PHPスクリプトは次のような要素で構成されています。ただし、こうした要素は必ずすべてが含まれている訳ではありません。例えば、HTMLタグが全く含まれないPHPスクリプトもあります。また、そのようなPHPスクリプトだけのファイルでは、開始終了のタグのうち最後の終了を示す「?>」を省略することもできます。
- PHPスクリプトの構成要素
基本構文
PHPには、書式の差はありますが、Javaなどの言語でも馴染みのある構文が使用可能です。条件分岐のif文や繰り返しのwhile文など基本的な構文が網羅されています。
- PHPでサポートされる構文if/switch/while/for/foreach/break/include/function など
- for文の使用例for ($i=0; $i<5; $i++){
echo $i;
} - 実行結果01234
組み込み関数
PHPには、1,000を超える関数が組み込まれています。モジュールを追加することで使用できる関数を更に増やすことができます。
クラス
PHPスクリプトはクラスを定義せずに全処理を記述することもできますが、クラスを定義することができます。
- クラスの使用例class class1 {
private $val1 = "abc";
function method1(){
echo $this->var1;
}
}
$obj = new class1();
$obj->method1();出力結果 abc
拡張機能(PEAR)
構文、関数、クラスなどが組み込まれたPHPの基本機能を拡張するものとしてPEARがあります。これは、PHPで記述されたクラスで、データベースやキャッシュなど、アプリケーション開発に役立つ機能が提供されています。
関数
PHPには膨大な関数が組み込まれています。どの関数も役立つので、関数一覧表で、できるだけ多くの関数を目にしておくと良いでしょう。
スクリプトの動作設定
PHPの実行を制御する設定ファイル php.ini
PHPスクリプトを実行するとき、どのような動作をするかは、PHP設定ファイル(php.ini)の設定値で決定されます。各設定項目には、パスや文字コードを設定したり、機能の有効・無効を設定します。設定項目や設定方法については「php.ini設定オプション一覧」を参照してください。
php.ini-recommendedとphp.ini-distの規定値は微妙に異なる
設定項目の設定値が異なると動作が異なりますが、php.iniの作成元になるテンプレートにはphp.ini-recommendedとphp.ini-distの2種類あり、規定値が異なる項目があります。php.ini-distは、phpの新規インストール時に適用される設定値で、開発用の構成です。recommendedは文字通り「推奨される」ファイルで、適用目的でセキュリティ面が考慮された値が設定されています。2つのファイル間での差異だけでなく、バージョン間での差異にも注意が必要です。
- php.ini のテンプレートファイル
php.ini-dist 開発用の設定 php.ini-recommended セキュリティを考慮した設定
特に機能の有効と無効が異なる場合は、スクリプトが動作しなくなる場合があります。逆に言えば「急に○○するようになった」「急に○○しなくなった」という場合、スクリプトだけでなく、php.iniの設定値の差異を疑うことも必要です。具体的には「php.ini設定オプション一覧」を参照してください。
スクリプトのエラー
スクリプトの記述を間違えたり、実行に不都合が生じた場合エラーが発生します。PHPには次のような種類のエラーがあります。このうち、論理エラー以外は、PHPの実行エンジンによってエラーメッセージがが生成され、設定に応じて出力されます。エラーメッセージがが生成され、エラーが通知されるものは、うまくエラーを検知して対処するのに役立てることができます。ただし、エラーが通知されない論理エラーこそ、トラブルの元になるので注意しましょう。
- PHPのエラー
コンパイルエラー 文法の間違いによって処理が停止 実行エラー 「存在しない関数を実行」などの原因で処理が停止 警告 「ファイルが存在しない」などの警告(処理続行) 注意 やや注意を要する記述内容への注意(処理続行) 提案 コードの修正を勧めるメッセージ(処理続行) 論理エラー 表示すべき項目が違う場合など(処理続行)
エラー出力レベルの設定
メッセージが出力されるエラーについては、どのレベルまでを出力するかを設定できます。詳しくは、php.iniのerror_reportingまたは、error_reporting関数で設定することができます。
エラーの対処
エラーの対処には、以下の方法があります。
- set_error_handler関数でエラーをハンドリングする関数を指定する
- try~catch文で例外を確認する
- エラー制御演算子でエラーメッセージを非表示にする
- 「or die」という決まり文句で処理を終了する(exitを参照)
- error_log関数でエラーをログに記録する
文字コード
スクリプトの文字コード
PHPのスクリプトを作成する場合、スクリプトの文字コードには一般的にEUC-JPかUTF-8が使われます。
Shift_JISは使ってはいけないという訳ではありませんが、それ以外の文字コードを選んでおいたほうが無難です。
UTF-8で記述する場合、先頭にBOMを付加しないようにします。現状では、UTF-8の先頭に付加されたBOMが原因でheader関数からエラーメッセージが出力されることがあるためです。
よって、UTF-8Nで保存するか、エディタにUTF-8(BOMなし)のようなメニューがあれば、それらを選択しましょう。
ブラウザに出力する文字コード
ブラウザには、Shift-JISを含めて任意の文字コードで出力できます。出力文字コードを明示的に指定することもできます。出力文字コードは、スクリプトの文字コード、Webサーバーの設定値、php.iniの設定値などに依存する形で決まります。
文字化けする場合や特定の文字コードで出力したい場合、これらの要素を調べ明示的に指定します。
.htaccessで個々のディレクトリの文字コードを指定する場合「AddDefaultCharset UTF-8」のように設定するかもしれませんが、php.iniの default_charset のほうが優先されてしまいます。この場合、.htaccessにも「php_value default_charset UTF-8」とdefault_charsetを設定することで、.htaccessを優先させることができます。よって、必ずしもphp.iniに、明示的に文字コードを設定しなくても良いでしょう。
メールの文字コード
メールの文字コードは、スクリプトで普通に使うもの(例:Shift_JIS、EUC-JP)とは異なります。日本語メールの文字コードはメール本文がJIS、メールヘッダがASCIIです。メール送信時はこうした文字コードに変換する必要があります。これを考慮しメールを送信できる関数がmb_send_mail関数です。
データベースの文字コード
MySQL4.1以降は、文字コード変換機能が原因で、それ以前は問題なく動作していたスクリプトが文字化けするようになった。という声が聞かれます。この場合「複数の文字コード」が指定されていないことが考えられます。詳しくは mysql_set_charset関数をご覧ください。
日本語(マルチバイト文字)の処理
日本語の処理にはマルチバイト関数を使う
文字列を処理する主要な関数には、文字列関数とマルチバイト関数があります。日本語など、2バイト以上で1文字を表現する言語で使う文字はマルチバイト文字として、マルチバイト関数が用意されています。つまり、英数字などのASCIIは文字列関数で処理、日本語はマルチバイト関数で処理します。PHP6ではUnicodeサポートが追加され、文字列は内部的にUTF-16で保存されます。これにより、文字列関数でも日本語処理が可能になります。
マルチバイト関数は「mb_」で始まる関数で、主な文字列関数の先頭に「mb_」を付加すると同機能の関数が存在します。例えば、substr関数は文字列を部分抽出する文字列関数ですが、マルチバイトを処理するためのmb_substr関数があります。
マルチバイト関数の動作設定
マルチバイト関数」の動作設定、例えば、どの文字コードを使うかという設定は、php.iniに記述することができます。php.iniを見ると、マルチバイト関連の設定項目はいくつもありますが、すべてを明示的に指定する必要はありません。詳しくは「php.ini設定オプション一覧」を参照してください。
フォームとの連携
$_POSTによるフォーム入力値の受け取り
WebアプリケーションとしてPHPを利用する場合は、入力データの入り口となるフォームとの連携が必要不可欠です。フォームから送信(POST送信)されたデータは、スーパーグローバルと呼ばれる特殊な変数である$_POST、GET送信されたデータは$_GETから取得可能です。フォームへの入力値を受け取るスクリプトは次のようになります。
- フォームへの入力値を受け取る<? php
echo $_POST["text1"];
?>
<form method="POST">
<input type="text" name="text1">
<input type="submit" value="送信">
</form>このようにテキストボックスtext1への入力値は $_POST["text1"] で取得することができます。
フォーム入力値のサニタイズ
フォームで注意すべき点は、セキュリティを考慮して入力値をサニタイズ(一般的な文字列に変換する)する必要がある点です。フォームに入力される値は常に正しいとは限りませんし、不特定多数がアクセスしてくるので、わざと誤動作を生じるような値を入力する可能性もあります。よって、開発するシステムの性格に応じて、入力値を検証、加工する必要があります。
- フォームから送信されたデータのタグを無効にする$_POST["text1"] = "<script>意図しないJavascript</script>"; ##del##
$var = htmlspecialchars($_POST["text1"], ENT_QUOTES); - 処理結果$var に「&1;script;意図しないJavascript&1t;/script>」をセット
フォームの検証やサニタイズにはフィルタ関数(PHP5.2以降)も使用できます。
データベースとの連携
MySQLとの組み合わせ
PHPはさまざまなデータベース製品に対応しています。インターネットで検索したりするとわかりますが、PHPとの組み合わせで最も人気があるのがMySQLです。情報量も多くなっているので、これから始める場合はMySQLを選択するのが無難かもしれません。
データベース関数とデータベースライブラリ
PHPにはMySQL関数やPostgreSQL関数のようなデータベース関数があります。またPHP5には、MySQL4.1以降の機能を充分に活用できるように追加されたMySQL関数も存在します。ただし、開発時に常に同じデータベースを使うとも限りませんし、エンジンの変更もあり得ます。移植性を考慮するならPEARで提供されるパッケージのように複数のデータベースエンジンで共通の命令を与える汎用的なデータベースライブラリを使うと良いでしょう。例えば、PEAR::DB、PEAR::MDB、PEAR::MDB2パッケージがあります。
PEARのDB関連パッケージを使用することは、古くからあるMySQL関数を否定するものではありません。実際、これらのパッケージに含まれるファイルを開くと内部的にmysql_connect関数などが呼び出されていることがわかります。したがって、古くから存在する関数を押さえながら、開発の効率化を図るという視点が必要です。
PHP5.1からは、汎用的なデータベースライブラリとしてPDOが標準でハンドルされています。これはC言語で記述されており、同じデータベースライブラリでもPHPスクリプトベースのPEARに比べて高速な動作が期待できます。
PHP5とMySQL
PHP5からは、MySQLライブラリがハンドルされなくなりました。代わりに、SQLiteライブラリがハンドルされています。SQLiteはデータベースサーバーを持たず、パブリックドメインであり、手軽に使えるデータベースエンジンです。
PHP5でMySQLを使う場合、以下を実行後、Webサーバーを再起動します。
- Linux
「--with mysql」オプションを付加 - Windows
PHPをインストールしたディレクトリに存在するlibmysql.dllをWindowsディレクトリにコピー