Help us understand the problem. What is going on with this article?

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

More than 3 years have 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>
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした