PHP基本のきほん

前回の初心者のためのviエディタの使い方と同様,ゼミ生のための資料です.

はじめに

PHP(PHP: Hypertext Preprocessor)は,Webサーバ上で実行されるサーバサイドスクリプト言語です.初期バージョンは,1995年にリリースされています.

特徴は以下のとおりです.

  • インタープリタ型言語
  • C言語やJavaに似た文法(オブジェクト指向のサポート)
  • RubyやPerlと似た弱いデータ型
  • 多くのWebサーバにてモジュールとして対応(Apache,IIS等)
  • HTMLにプログラムを埋め込むことが可能
  • データベースインターフェースのサポート(MySQL,PostgreSQL,SQLite,ODBC等)

参考文献 Wikipedia(PHP:_Hypertext_Preprocessor)

【実習環境】

ApacheのDoumentRootで指定したディレクトリ上(例 /Library/WebServer/Documents)に,「php_lec」のディレクトリを作成し,その中にPHPのサンプルプログラムファイルを作成し,実行を確認します.

基本構文

<?php?> で囲まれた部分をPHPのスクリプトとして実行処理します.

<?php

  printf("Hello PHP!\n");

?>

上記スクリプトファイル(テキストファイル)を「test.php」という名前で作成します.

【実行例】

[ターミナル上での実行確認]

$ cd /(DocumentRootで指定したパス)/php_lec
$ php test.php

[Web上での実行確認]

http://localhost/php_lec/test.php

基本構文2

条件構文の使い方.
例として,時間($h)が正午以前であれば,「Good morning!」と表示し,それ以外は「Hello!」と表示させる.

<?php

// 現在の時刻(時)
$h = 15;
if ( $h < 12 ) {
	printf("Good morning!\n");
}
else {
	printf("Hello!\n");
}

?>

(応用)時刻をシステムのタイムスタンプより取得する

<?php

// 現在の時刻(時)を取得
date_default_timezone_set('Asia/Tokyo');
$d = getdate(time());
$h = $d["hours"];

if ( $h < 12 ) {
	printf("Good morning!\n");
}
else {
	printf("Hello!\n");
}
printf("Now: %s\n", date("Y/m/d H:i:s"));

?>

[実行結果]

Hello!<br />
2015/02/23 14:31:55<br />

フォーム(FORM)データのやり取り

次にHTMLのFORMタグを使って,エディットボックスに入力された文字列データをページ間でやり取りします.

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>formtest</title>
</head>
<body>
<form method="GET" action="gettest.php" />
data: <input type="text" name="data" size="20">

<input type="submit" value="GO" />
<input type="hidden" name="hoge" value="foo" />
</form>
</body>
</html>

[実行結果]

data:|_hello______________|
[ GO ]

エディットボックスに「hello」と入力して,「GO」ボタンをクリックすると,そんなページは無いとエラーがでますが,ブラウザのアドレスバーには,次のような文字列が表示されています.

http://localhost/php_lec/gettest.php?data=hello&hoge=foo

GETメソッドで呼び出していますので,URLの最後の部分(?以降の部分)に,

data=hello」と「hoge=foo

というデータが入っています.これは,inputタグで設定された,nameとvalueの値です.
これをPHPで利用(読み込む)には,オートグローバル変数「$_GET」を次のようにして利用します.

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>gettest</title>
</head>
<body>
<?php
printf("<p>data: %s</p>\n", $_GET['data']);
?>
</body>
</html>

POSTメソッド(オートグローバル変数は「$_POST」)でも試してみます.
以下の部分のみ変更します.

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>formtest</title>
</head>
<body>
<form method="POST" action="posttest.php" />
data: <input type="text" name="data" size="20">

<input type="submit" value="GO" />
<input type="hidden" name="hoge" value="foo" />
</form>
</body>
</html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>posttest</title>
</head>
<body>
<?php
printf("<p>data: %s</p>\n", $_POST['data']);
?>
</body>
</html>

オートグローバル変数には,他にも,クライアントのブラウザ情報を取得する「$_SERVER[‘HTTP_USER_AGENT’]」や,IPアドレスを取得する「$_SERVER[‘REMOTE_ADDR’]」などが利用できます.

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>posttest</title>
</head>
<body>
<?php
printf("<p>ブラウザ情報:%s</p>\n", $_SERVER['HTTP_USER_AGENT']);
printf("<p>IPアドレス:%s</p>\n", $_SERVER['REMOTE_ADDR']);
printf("<p>data: %s</p>\n", $_POST['data']);
?>
</body>
</html>

[実行結果]

ブラウザ情報:
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/600.3.18 (KHTML, like Gecko) Version/8.0.3 Safari/600.3.18

IPアドレス:
::1

data: hello

ファイル処理(読み込み)

次のテキストファイル「date.txt」を読み込んで内容を表示するスクリプトを考えます.

[date.txt]

Hello! I am Taro.
I am very sleepy.

fopen関数でファイルをオープンし,fget関数で1行ずつ読み込みます.

<?php
$datafile = "data.txt";
$fp = fopen($datafile, 'rb');
while(($buff = fgets($fp)) !== false) {
	printf("%s\n", $buff);
}
fclose($fp);
?>

ファイル処理(書き込み)

現在日時(例「2015-02-23 14:58:39」)をテキストファイル「date.txt」に追記するスクリプトを考えます.

<?php
$datafile = "data.txt";
$datetime = date("Y-m-d H:i:s");
echo $datetime;

$fp = fopen($datafile, 'ab');
flock($fp, LOCK_EX);   // File lock
fwrite($fp, $datetime."\n");
flock($fp, LOCK_UN);   // File unlock
fclose($fp);
?>

課題

次の読み込み及び書き込みのスクリプト(bbs.php)を参考に,掲示板スクリプトを作成します.

  1. 投稿した日時も表示させるようにする
  2. ハンドルネームを入力するボックスを準備し,ハンドルネームも表示させる
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>BBS</title>
</head>
<body>
<p>BBS Sample</p>
<hr />

<?php
$datafile = 'data.txt'; 

if(isset($_POST['OPT']) && $_POST['OPT'] == "write") {
	$wdata = $_POST['contents']."\n";
	$fp = fopen($datafile, 'ab');
	flock($fp, LOCK_EX);
	fwrite($fp, $wdata);
	flock($fp, LOCK_UN);
	fclose($fp);
}

$fp = fopen($datafile, 'rb');
$cnt = 1;
while(($buff = fgets($fp)) !== false) {
	$rdata = $buff;
	printf("<p><b>%s</b>: %s\n", $cnt, $rdata);
	printf("</p><hr />\n");
	$cnt++;
}
fclose($fp);
?>

<form method="POST" action="<?php echo $_SERVER['PHP_SELF'] ?>">
<input type="text"  name="contents" size="40" />
<input type="submit" name="btn" value="Send" />
<input type="hidden" name="OPT" value="write">
</form>

</body>
</html>

[実行結果]

SS20150223

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中