PHP

フォームやパラメーターについて

More than 1 year has passed since last update.

引用/参考

「プロになるためのWeb技術入門」
「よくわかるPHPの教科書」

ChromeでのHTTPログ確認方法

http://www.littleforest.jp/webtext/appendix.html

GETリクエストとPOSTリクエスト

スクリーンショット 2015-08-21 15.56.33.png
(※引用/プロになるためのWeb技術入門)

GET

http://www.littleforest.jp/webtext/calc_get.html

get.html
<!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>
get.php
<!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

http://www.littleforest.jp/webtext/calc_post.html

post.html
<!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>
post.php
<!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>

日本語のパラメーター渡しの件

http://www.littleforest.jp/webtext/greeting.html

greeting.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>
greeting.php
<!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

ie.png

※自動でパーセントエンコーディング

Chrome/Firefox/Safari

chrome.png

※日本語使用できる

$_REQUEST

htmlspecialcharsとENT_QUOTES

http://php.net/manual/ja/function.htmlspecialchars.php

get2.html
<!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>
get2.php
<!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'];
?>

https://secure.php.net/manual/ja/reserved.variables.server.php

$_FILES(画像をアップロードする)

imgupload.html
<!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>
imgupload.php
<?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>

スクリーンショット 2015-08-21 20.08.21.png

  • フォームを送信するとき、エンコードをする。

  • 「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)

http://php.net/manual/ja/function.substr.php

うしろから3文字の部分を切り取りチェック

move_uploaded_file

アップロードされたファイルは、フォームが送信されると一時的に保存する。
それからプログラムの指示に従って、適切な場所に移動する。

スクリーンショット 2015-08-21 20.22.27.png

プール値 = move_uploaded_file(コピー元,コピー先);
  • コピー元は、temp_name
  • ここではuser_imgというフォルダを作成(書き込み権限を与える)しておき、画像を移動させている。

一時保存される場所を知る(「php.ini」で設定可能)

<?php
print ini_get('upload_temp_dir');
?>

マニュアル

http://jp.php.net/manual/ja/features.file-upload.post-method.php

パラメータの使い方(サンプルから抜粋)

会員登録

「$_REQUEST」

http://php.net/manual/ja/reserved.variables.request.php
http://plog.pya.jp/program/php/lesson09/sample01.html

join/check.php
 <div><a href="index.php?action=rewrite">&laquo;&nbsp;書き直す</a> | <input type="submit" value="登録する" /></div>
join/index.php
if ($_REQUEST['action'] == 'rewrite') {
    $_POST = $_SESSION['join'];
    $error['rewrite'] = true;
}
?>

//セッションに保存した値を$_POSTに代入(フォームに入力していた内容を再現)
//画像を再アップロードのエラー文言を表示

投稿表示

index.php
<?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

join/check.php
<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">&laquo;&nbsp;書き直す</a> | <input type="submit" value="登録する" /></div>
</form>
index.php
// 投稿を記録する
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>