2011/05/06

フォームの action に GET パラメータ付きURL をいれて method="get" だと その パラメータは消える

よく分からんタイトルになってもうた。

地味にハマったのでご紹介。
今更感が半端ないですが。。。
<form action="./index.php?param1=value1" method="get">
こんなフォームで submit すると $_GET['param1'] が消えちゃうよっていうお話。


<html>
<body>
<form action="./index.php?param1=value1" method="get">
        <input type="text" name="param2" value="value2">
        <input type="submit" value="submit">
</form>
<pre>
<?php
var_dump($_GET);
?>
</pre>
</body>
</html>

送信!!

結果
array(1) {
  ["param2"]=>
  string(6) "value2"
}

action に付けてた param1=value1 はどこかへ飛んでいってしまいました。

意外にこれってオレオレフレームワークで、
コントローラー名とアクション名を GET で渡してることって多いと思うんだ。
それでハマったんだけど・・・・。

手抜きしないでこうする。
<html>
<body>
<form action="./index.php" method="get">
        <input type="text" name="param1" value="value1">
        <input type="text" name="param2" value="value2">
        <input type="submit" value="submit">
</form>
<pre>
<?php
var_dump($_GET);
?>
</pre>
</body>
</html>
結果(当たり前)
array(2) {
  ["param1"]=>
  string(6) "value1"
  ["param2"]=>
  string(6) "value2"
}

それか method="post" にする。
<html>
<body>
<form action="./index.php?param1=value1" method="post">
        <input type="text" name="param2" value="value2">
        <input type="submit" value="submit">
</form>
<pre>
<?php
var_dump(array('GET' => $_GET, 'POST' => $_POST));
?>
</pre>
</body>
</html>
結果
array(2) {
  ["GET"]=>
  array(1) {
    ["param1"]=>
    string(6) "value1"
  }
  ["POST"]=>
  array(1) {
    ["param2"]=>
    string(6) "value2"
  }
}

なんで今まで遭遇しなかったんだろう・・・・?