• ベストアンサー

PHP4とPHP5のGETでの値引き渡し および & と & の使い分けについて

PHP4では、 http://mydomain/test.php?a=1&b=2 として、 test.php内で、 print "a=".$a.":"."b=".$b; のとき、 a=1:b=2 と表示していました。 PHP5に移行したところ、$_GETを使わないといけないということで、 print "a=".$_GET["a"].":"."b="._GET["b"]; としたところ、 a=1:b= となってしまい、bの値が取得できません。 そこで、 http://mydomain/test.php?a=1&b=2http://mydomain/test.php?a=1&;b=2 つまり、 「&」の実体参照から「&」に変えると、 print "a=".$_GET["a"].":"."b="._GET["b"]; で a=1:b=2 と表示できます。 Another HTML-lintの解説では、&でなくてはいけないとかいてありますが、php5ではなぜ、&では$_GETに値を引き渡せないのでしょうか? (Another HTML-lintの解説) http://openlab.ring.gr.jp/k16/htmllint/explain.html#bad-entity ご存知の方が居られましたら、ご教示ください。 よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • BellBell
  • ベストアンサー率54% (327/598)
回答No.3

>PHP5に移行したところ、$_GETを使わないといけないということで、 少なくともPHP4の頃からそうでしたが。 extract($_GET);なんて非推奨な事をしているコードは見たことありますが。 もしかしてそれ使ってたって事ですかね? >Another HTML-lintの解説では、&でなくてはいけないとかいてありますが、php5ではなぜ、&では$_GETに値を引き渡せないのでしょうか? W3C勧告にしても、どの勧告に従うかでまったく逆の事を書いていたりします。 RFCにしても同様。 なんといっても『私はW3C規格に忠実に作成したので、動作しないのはIEやFireFox等のブラウザ側がW3C規格を無視しているからです。修正するならブラウザ側です』などと言っても誰にも通用しませんから。 ちなみに、リンク先で『これは、CGI側の制約ではなくWWWブラウザ側の問題だからです。』と書かれているように、 http://mydomain/test.php?a=1&b=2 と書かれたリンクをクリックした際に、 ブラウザが http://mydomain/test.php?a=1&b=2 と解釈してリクエストしなければならないのが、本来の仕様なのでしょう。(※&gtの説明を見るとなおさら) クリックした際に、アドレス欄のURLには&のまま残ってませんか? PHPとしては、&b=2 と渡されたので、$_GET['amp;b']としないと値を取れないというところでしょうね。 過去に、&を使っても動作していたというのであれば、もしかすると、リンク先の文献は既に過去のものになった仕様に基づいて書かれた過去の文献で、新しい仕様が勧告されているのかも知れませんね。 ま、私個人は『修正するならブラウザ側です』というつもりはないので、RFCやらW3Cには直接興味なしでそのあたりはまったく知りません。

neo1124
質問者

お礼

なるほど。 本来、ブラウザが&を&として解釈しないということですね。 確かに値が取得できないケースでは、URL欄に&のまま残って いました。 &b=2 と渡した場合、$_GET['amp;b']とするお話し、参考に なりました。 URLデコードでなく、そのような対処法も可能なのですね。 私は、&を&に戻して対応したのですが、W3Cで構文チェックする と、&にしろ、と言われるので、少し混乱しました。 でもブラウザの問題を含めて考えると、現状が把握できたような 気がします。 とりあえず、構文に多少警告が出ても実用で動く方を採用しようと 思います。 ご回答ありがとうございました。

その他の回答 (3)

  • bm_hiro
  • ベストアンサー率51% (200/388)
回答No.4

#2です。 言い直さなくても脳内変換してくれるだろうな。と思ったものの、初心者とかは そのまま読んでしまいそうなので、訂正に来ました。 誤:URLでコード 正:URLデコード urldecode() の 事です。

  • bm_hiro
  • ベストアンサー率51% (200/388)
回答No.2

> http://mydomain/test.php?a=1&b=2 正直、こんな使い方をした事は ありませんでしたので、 これで、ちゃんと変数が取得できる事すら、知りませんでした。 ただ、URLでコードすれば、ちゃんと & になってくれるようですので、動作はするんですね。 > test.php内で、 > print "a=".$a.":"."b=".$b; > のときは、PHP4 でも $a, $b に値は入らないはずですが、PHPのバージョンをご確認下さい。 あと、#1さんが指摘しているコレは昔のPHPでは register_globals = On になっており、$_GETでなくても普通に取得できていたのです。 現在は、デフォルトでOffですし、将来的に register_globals は削除予定のようですので、今後は コレには頼らないほうがいいでしょう。 ・参考 http://php.net/manual/ja/security.globals.php Another HTML-lintの解説は 読みましたが、よく分かりませんでした。 すみません。 以下、超どうでもいい話。 タイトルの「値引き渡し」を「ねびきわたし」と読んで、バーゲンの30%オフとか そういうものか?とか 思ってしまった俺がいます。

neo1124
質問者

お礼

今後、$_GETを利用しようと思います。 ちなみに、PHP5では、.htaccessで register_globals = On にしても、&を&にしていると値を取得できませんでした。 試していませんが、URLデコードすると、良かったのかもしれませんね。 参考になりました。 ご回答ありがとうございました。

noname#111181
noname#111181
回答No.1

> Another HTML-lintの解説では、&amp;でなくてはいけないとかいてありますが、 失礼ながら、誤解があるようです。 HTML規格では、<a href=>タグなどでURLを記すときに、'&' を '&amp;' と記述することを規定していますが、ブラウザのURL欄に直接 '&amp;' を書くのは間違いです。 以下を実行していただくと分かるかと思います。 print "<a href=\"test.php?a=1&amp;b=2\">" . phpversion() . "</a><br />"; print "a=".$_GET['a'].":"."b=".$_GET['b']; また、 http://mydomain/test.php?a=1&b=2 として、 test.php内で、 print "a=".$a.":"."b=".$b; のときは、PHP4 でも $a, $b に値は入らないはずですが、PHPのバージョンをご確認下さい。

neo1124
質問者

お礼

ご教示いただいたサンプルを実行してみました。 確かにURLでは&amp;が、&になっていますね。 参考になりました! <img>タグに&amp;の入ったURLを入れてスクリプトを 呼び出す場合、 PHP4では動作していたものが、PHP5では動作せず、 &amp;→& に変えて動作したので、疑問に思いお聞き した次第です。 ご回答ありがとうございました。