
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=2
↓
http://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.h …
ご存知の方が居られましたら、ご教示ください。
よろしくお願い致します。
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
と解釈してリクエストしなければならないのが、本来の仕様なのでしょう。(※>の説明を見るとなおさら)
クリックした際に、アドレス欄のURLには&のまま残ってませんか?
PHPとしては、&b=2 と渡されたので、$_GET['amp;b']としないと値を取れないというところでしょうね。
過去に、&を使っても動作していたというのであれば、もしかすると、リンク先の文献は既に過去のものになった仕様に基づいて書かれた過去の文献で、新しい仕様が勧告されているのかも知れませんね。
ま、私個人は『修正するならブラウザ側です』というつもりはないので、RFCやらW3Cには直接興味なしでそのあたりはまったく知りません。
なるほど。
本来、ブラウザが&を&として解釈しないということですね。
確かに値が取得できないケースでは、URL欄に&のまま残って
いました。
&b=2 と渡した場合、$_GET['amp;b']とするお話し、参考に
なりました。
URLデコードでなく、そのような対処法も可能なのですね。
私は、&を&に戻して対応したのですが、W3Cで構文チェックする
と、&にしろ、と言われるので、少し混乱しました。
でもブラウザの問題を含めて考えると、現状が把握できたような
気がします。
とりあえず、構文に多少警告が出ても実用で動く方を採用しようと
思います。
ご回答ありがとうございました。
No.4
- 回答日時:
#2です。
言い直さなくても脳内変換してくれるだろうな。と思ったものの、初心者とかは そのまま読んでしまいそうなので、訂正に来ました。
誤:URLでコード
正:URLデコード
urldecode() の 事です。
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%オフとか そういうものか?とか 思ってしまった俺がいます。
今後、$_GETを利用しようと思います。
ちなみに、PHP5では、.htaccessで register_globals = On
にしても、&を&にしていると値を取得できませんでした。
試していませんが、URLデコードすると、良かったのかもしれませんね。
参考になりました。
ご回答ありがとうございました。
No.1
- 回答日時:
> Another HTML-lintの解説では、&でなくてはいけないとかいてありますが、
失礼ながら、誤解があるようです。
HTML規格では、<a href=>タグなどでURLを記すときに、'&' を '&' と記述することを規定していますが、ブラウザのURL欄に直接 '&' を書くのは間違いです。
以下を実行していただくと分かるかと思います。
print "<a href=\"test.php?a=1&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のバージョンをご確認下さい。
ご教示いただいたサンプルを実行してみました。
確かにURLでは&が、&になっていますね。
参考になりました!
<img>タグに&の入ったURLを入れてスクリプトを
呼び出す場合、
PHP4では動作していたものが、PHP5では動作せず、
&→& に変えて動作したので、疑問に思いお聞き
した次第です。
ご回答ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PLY yacc での IF 文実装
-
「取得先」という表現について
-
開始と終了を指定して、その間...
-
DTOとEntityの差は何ですか。
-
Dosブロンプトでtabを出力したい
-
WordでExcelデータを差込...
-
VBA内でのGetPixelを使用した時...
-
完全なセッション破棄をしたい
-
PHP4からPHP5へ移行した際、セ...
-
VB.NETからVBAマクロ(引数)を呼...
-
INIファイル
-
PHPでの画像の形式の変換
-
Worksheet_Changeについて
-
ps3で久しぶりにCDの音楽情報取...
-
C言語で地図を描きたい
-
ローカルのコンピュータ名を取...
-
ミュージックのアートワークを...
-
C#で特定LANアダプタの状態を取...
-
過去にVBAでの「シフト表の何日...
-
classの再定義エラーについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
<A href ~で複数の値を渡したい
-
parse_ini_fileでダブルクォー...
-
「次の10件を表示する」のよ...
-
テーブルに送信ボタンをつける
-
!==について
-
ヒアドキュメントの中で関数の実行
-
PHPでwait処理ってできます?
-
$_SERVER["QUERY_STRING"]の仕...
-
初歩的な質問だと思います。IF...
-
phpからoracle関数を使ってコミ...
-
PHP declare文について、ticks...
-
null代入とunset()の違いについて
-
PHP ハイパーリンク
-
PHPの質問です : -> 等
-
重い処理の最中の経過を出力したい
-
書籍とその書籍が提供している...
-
printの出力結果を変数に代入す...
-
ヒアドキュメントでstaticメン...
-
CakePHP リッチテキストエディ...
-
ランダム文字について
おすすめ情報