PHP
PHP(ピー・エイチ・ピー)は、動的にHTMLデータを生成することによって、動的なウェブページを実現することを主な目的としたプログラミング言語、およびその言語処理系である。
PHPとは
Hypertext Preprocessorの略。なんでこれを略してPHPになるのかは不明。
HTMLのソースの中に<?php ?>のタグを埋め込むことで動作させることができ、連携がやりやすい。
Yahoo!がPHPを採用した理由:phpspot開発日誌
Javaジャバいってる間にも
PHP4.xとPHP5.xでだいぶ使える機能が違う。
PEARというライブラリがありなにかと便利。
PHPのスクリプト書くときはPEARの標準コーディング規約(後述)に書き方を合わせるといいかも。
タブではなく半角スペース4文字使うとかいう辺りは微妙。
Smartyというテンプレートエンジンも便利。
サンプルソース
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<meta http-equiv="Content-Style-Type" content="text/css">
<meta http-equiv="Content-Script-Type" content="text/javascript">
<title>PHPのテスト</title>
</head>
<body>
<?php
<h1>
print "今日は{date('Y'年'n'月'd'日)}です。
</h1>
<p></p>
?>
</body>
</html>
とすると、今日は2007年1月15日です。と表示される。
PHP4.xと5.xの違い
- ・スクリプトエンジンがZendEngineが2にアップグレード。
- ・オブジェクト指向に関する機能の強化→大規模開発が可能に。
- ・XML周りの機能の強化→SimpleXMLという機能によりXMLを簡単に扱うことができる
- ・PDOというデータベースに接続するための機能が追加→PEAR::DBと同じような感じで
RDMSに接続する時に使う。PEAR::DBはPHPで書かれていたが、PDOはPHPに組み込まれており
速度が向上する。
標準コーディング規約
- インデントはスペース4個(タブは駄目)
- 半角75-85 文字ごとに改行することを推奨。(必須ではない)
- if, for, while, switch等の制御構造と括弧の間はスペース1個。
- 制御構造の中括弧は条件と同じ行。(間はスペース1個)
- 関数コールでの関数名と括弧の間にはスペース無し。
- 代入のイコールの左右はスペースを入れる。(沢山入れて見栄えを揃えても良い)
- 関数定義の中括弧は次の行の関数名と同じ位置。(one true braceと言うらしい)
- デフォルト値付き引数は引数リストの終わりに置くこと。(なるべく右側ってこと)
- Perl/Shell形式のコメントは使ってはいけない。
- include~およびrequire~は命令であり関数ではないので括弧は付けない。
- PHPショートタグは使ってはいけない。(<?のこと)
- 文字エンコードは ISO-8859-1 を使用しなければならない。
- 改行はLF。
- PHP終了タグ(?>)の後は改行を一つ入れる。
- 変数展開や特殊文字を含まない文字列はシングルクォートを使う。
セキュリティについて
適当なコードを書くと、XSS(クロスサイトスクリプティング)、ScriptInjection(スクリプトインジェクション)、SQLインジェクションなどの攻撃に対してリスクを抱えることになり危険。
注意すべきコード
$_SERVER['PHP_SELF']
$_SERVER['SCRIPT_NAME']
を使うかhtmlspecialchars($_SERVER['PHP_SELF'],ENT_QUOTES)
とするほうがいいらしい。この辺参考にPHP_SELFはそのまま出力できない。
$_REQUEST['hoge']
$_GET['hoge'],$_POST['hoge'],$_COOKIE['hoge']
などに限定しないと外部から変数を書き換えられる可能性あり- バイナリセーフでない関数
-
バイナリセーフでないとは文字列中にヌルバイトがあった場合、それ以降の文字列を読み込まないこと。
ereg_replace()
などをサニタイジングに使うと危険。preg系はバイナリセーフで処理速度もereg系の数倍速いらしいのでこちらを代用。mb_ereg()はバイナリセーフ。 - ereg_replace(),eregi(),eregi_replace()
- split(),spliti()
- require(),require_once()
- include(),include_once()
- fopen(),file_get_contents(),readfile(),basename()
- SQL文の作成
-
ユーザ変数をそのまま入力しない
MySQLであればmysql_escape_string(),mysql_real_escape_string()などでサニタイジング できる。mysql_real_escape_stringはDBに接続した状態でないと使用不可。 - PEARのDBクラスを使うのであれば「プレイスホルダ」というものを使うことができる。
-
<?php
//DBクラスの読み込み
require_once("DB.php");
//MySQLサーバに接続
$db=DB::connect("mysql://username:password@hostname/database_name");
//パラメータの指定
$params="hoge";
//SQL文の生成「?」の部分にパラメータが入る
$sql="SELECT * FROM $dbname WHERE culumn1=?";
//クエリ
$db->query($sql,$params);
?>