引用/参考
「プロになるためのWeb技術入門」
「よくわかるPHPの教科書」
ChromeでのHTTPログ確認方法
GETリクエストとPOSTリクエスト
GET
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>メソッドによるパラメーター渡し</title>
</head>
<body>
<h1>GETメソッドによるパラメーター渡し</h1>
<form action="get.php" method="get">
<input type="text" name="arg1" size="8">
+
<input type="text" name="arg2" size="8">
<input type="submit" value="計算">
</form>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>メソッドによるパラメーター渡し</title>
</head>
<body>
<h1>GETメソッドによるパラメーター渡し</h1>
<?php
$arg1=$_GET['arg1'];
$arg2=$_GET['arg2'];
$result=$arg1+$arg2;
echo htmlspecialchars($arg1)."+".htmlspecialchars($arg2)."=".htmlspecialchars($result);
?>
<br/>
<a href="get.html">もう一度計算する</a>
</body>
</html>
POST
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>メソッドによるパラメーター渡し</title>
</head>
<body>
<h1>POSTメソッドによるパラメーター渡し</h1>
<form action="post.php" method="post">
<input type="text" name="arg1" size="8">
+
<input type="text" name="arg2" size="8">
<input type="submit" value="計算">
</form>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>メソッドによるパラメーター渡し</title>
</head>
<body>
<h1>POSTメソッドによるパラメーター渡し</h1>
<?php
$arg1 = $_POST['arg1'];
$arg2 = $_POST['arg2'];
$result = $arg1 + $arg2;
echo htmlspecialchars($arg1)."+".htmlspecialchars($arg2)."=".htmlspecialchars($result);
?>
<br/>
<a href="post.html">もう一度計算する</a>
</body>
</html>
日本語のパラメーター渡しの件
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>日本語のパラメータ渡し</title>
</head>
<body>
<h1>日本語のパラメータ渡し</h1>
<form action="greeting.php" method="get">
名前:<input type="text" name="name" size="16">
<input type="submit" value="ごあいさつ">
</form>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>日本語のパラメータ渡し</title>
</head>
<body>
<h1>日本語のパラメータ渡し</h1>
<?php
$name = $_GET[name];
echo 'こんにちは'.$name.'さん';
?>
</br>
<a href="greeting.html">もう一度ごあいさつする</a>
</body>
</html>
IE
※自動でパーセントエンコーディング
Chrome/Firefox/Safari
※日本語使用できる
$_REQUEST
htmlspecialcharsとENT_QUOTES
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>フォームに入力した内容を取得する</title>
</head>
<body>
<form action="get2.php" method="get">
<label for="my_name">お名前:</label>
<input id="my_name" type="text" name="my_name" size="35" maxlength="255" value="" />
<input type="submit" value="送信する" />
</form>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>フォームに入力した内容を取得する</title>
</head>
<body>
<?php
print('お名前: ' . htmlspecialchars($_REQUEST['my_name'], ENT_QUOTES));
?>
</body>
</html>
$_SERVER
1. 自ページから自ページへの遷移
http://pentan.info/php/php_self_security.html
https://secure.php.net/manual/ja/reserved.variables.server.php
<form method="post" action="">
- $_SERVER[PHP_SELF]を使わない
- URLに何も書かなければよい
<?php
echo $_SERVER['SERVER_NAME'];
?>
$_FILES(画像をアップロードする)
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>画像をアップロード</title>
</head>
<body>
<h1>画像をアップロード</h1>
<form action="imgupload.php" method="post" enctype="multipart/form-data">
<input name="my_img" type="file" id="my_img" size="50" />
<input type="submit" value="送信する" />
</form>
</body>
</html>
<?php
ini_set('display_errors', 'on');
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="stylesheet" type="text/css" href="style.css" />
<title>画像をアップロード</title>
</head>
<body>
<h1>画像をアップロード</h1>
<p>
<?php
$file = $_FILES['my_img'];
print('ファイル名(name): ' . $file['name'] . '<br />');
print('ファイルタイプ(type): ' . $file['type'] . '<br />');
print('アップロードしたファイル(tmp_name): ' . $file['tmp_name'] . '<br />');
print('エラー内容(error): ' . $file['error'] . '<br />');
print('サイズ(size): ' . $file['size'] . '<br />');
// ファイルアップロードの処理をする
$ext = substr($file['name'], -3);
if ($ext == 'gif' || $ext == 'jpg' || $ext == 'png') {
$filePath = './user_img/' . $file['name'];
move_uploaded_file($file['tmp_name'], $filePath);
print('<img src="' . $filePath . '" />');
} else {
print('※拡張子が.gif, .jpg, .pngのいずれかのファイルをアップロードしてください');
}
?>
</p>
</body>
</html>
-
フォームを送信するとき、エンコードをする。
-
「multipart/form-data」は、ファイルを送信できる方式
(画像をアップロードするときには必ずこの属性が必要) -
POST方式を使う。(GETでは送信されない)
-
特別な変数「$_FILES」で渡される。連想配列として格納されているので、「$_FILES['my_img']」などキーを指定して取り出す。
ファイルのアップロード
- ファイルアップロードでは、決まった連想配列になっている。
- 「name」「type」「error」「tmp_name」(一時的にアップロードされたファイル名)というキー
// ファイルアップロードの処理をする
$ext = substr($file['name'], -3);
if ($ext == 'gif' || $ext == 'jpg' || $ext == 'png') {
$filePath = './user_img/' . $file['name'];
move_uploaded_file($file['tmp_name'], $filePath);
print('<img src="' . $filePath . '" />');
} else {
print('※拡張子が.gif, .jpg, .pngのいずれかのファイルをアップロードしてください');
}
拡張子のチェック(substr)
うしろから3文字の部分を切り取りチェック
move_uploaded_file
アップロードされたファイルは、フォームが送信されると一時的に保存する。
それからプログラムの指示に従って、適切な場所に移動する。
プール値 = move_uploaded_file(コピー元,コピー先);
- コピー元は、temp_name
- ここではuser_imgというフォルダを作成(書き込み権限を与える)しておき、画像を移動させている。
一時保存される場所を知る(「php.ini」で設定可能)
<?php
print ini_get('upload_temp_dir');
?>
マニュアル
パラメータの使い方(サンプルから抜粋)
会員登録
「$_REQUEST」
http://php.net/manual/ja/reserved.variables.request.php
http://plog.pya.jp/program/php/lesson09/sample01.html
<div><a href="index.php?action=rewrite">« 書き直す</a> | <input type="submit" value="登録する" /></div>
if ($_REQUEST['action'] == 'rewrite') {
$_POST = $_SESSION['join'];
$error['rewrite'] = true;
}
?>
//セッションに保存した値を$_POSTに代入(フォームに入力していた内容を再現)
//画像を再アップロードのエラー文言を表示
投稿表示
<?php echo makeLink(h($post['message'])); ?><span class="name">(<?php echo h($post['name']); ?>)</span>[<a href="index.php?res=<?php echo h($post['id']); ?>">Re</a>]</p>
<p class="day"><a href="view.php?id=<?php echo h($post['id']); ?>"><?php echo h($post['created']); ?></a>
//1件以上あればリンク表示
<?php
if ($post['reply_post_id'] > 0):
?>
<a href="view.php?id=<?php echo h($post['reply_post_id']); ?>">返信元のメッセージ</a>
<?php
endif;
?>
<?php
if ($_SESSION['id'] == $post['member_id']):
?>
[<a href="delete.php?id=<?php echo h($post['id']); ?>" style="color: #F33;">削除</a>]
<?php
endif;
?>
</p>
</div>
<?php
endwhile;
?>
<ul class="paging">
<?php
if ($page > 1) {
?>
<li><a href="index.php?page=<?php print($page - 1); ?>">前のページへ</a></li>
<?php
} else {
?>
<li>前のページへ</li>
<?php
}
?>
<?php
if ($page < $maxPage) {
?>
<li><a href="index.php?page=<?php print($page + 1); ?>">次のページへ</a></li>
hidden
<form action="" method="post">
<input type="hidden" name="action" value="submit" />
<dl>
<dt>ニックネーム</dt>
<dd>
<?php echo htmlspecialchars($_SESSION['join']['name'], ENT_QUOTES, 'UTF-8'); ?>
</dd>
<dt>メールアドレス</dt>
<dd>
<?php echo htmlspecialchars($_SESSION['join']['email'], ENT_QUOTES, 'UTF-8'); ?>
</dd>
<dt>パスワード</dt>
<dd>
【表示されません】
</dd>
<dt>写真など</dt>
<dd>
<img src="../member_picture/<?php echo $_SESSION['join']['image']; ?>" width="100" height="100" alt="" />
</dd>
</dl>
<div><a href="index.php?action=rewrite">« 書き直す</a> | <input type="submit" value="登録する" /></div>
</form>
// 投稿を記録する
if (!empty($_POST)) {
if ($_POST['message'] != '') {
$sql = sprintf('INSERT INTO posts SET member_id=%d, message="%s", reply_post_id=%d, created=NOW()',
mysql_real_escape_string($member['id']),
mysql_real_escape_string($_POST['message']),
mysql_real_escape_string($_POST['reply_post_id'])
);
mysql_query($sql) or die(mysql_error());
//リロード処理
header('Location: index.php'); exit();
}
}
<form action="" method="post">
<dl>
<dt><?php echo htmlspecialchars($member['name']); ?>さん、メッセージをどうぞ</dt>
<dd>
<textarea name="message" cols="50" rows="5"><?php echo h($message); ?></textarea>
<input type="hidden" name="reply_post_id" value="<?php echo h($_REQUEST['res']); ?>" />
</dd>
</dl>
<div>
<p>
<input type="submit" value="投稿する" />
</p>
</div>
</form>