LoginSignup
16
21

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-08-21

引用/参考

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

ChromeでのHTTPログ確認方法

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

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

GET

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

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>

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

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

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'];
?>

$_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)

うしろから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');
?>

マニュアル

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

会員登録

「$_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>
16
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
21