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で質問しましょう!
似たような質問が見つかりました
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- PHP PHP MySql ページング 2 2022/09/20 06:38
- PHP ECCUBE4のページ管理でPHPを実行させたい 1 2023/04/06 11:42
- PHP PHP ページング データベース 1 2022/06/16 10:30
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- PHP preg_matchで Warning: Undefined variableが出ます 1 2022/11/15 17:06
- PHP htmlで複数の個数入力欄を表示させるには 1 2022/09/20 03:11
- PHP PHP MySql 画像を取得 1 2022/06/04 14:05
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PHPのif文「POSTしていな...
-
【UWSC】文字をa~zまで回したい...
-
逆順表示したい?
-
テーブルに送信ボタンをつける
-
if文の複数条件。
-
「次の10件を表示する」のよ...
-
<A href ~で複数の値を渡したい
-
Dosブロンプトでtabを出力したい
-
shシェルスクリプト 空白行の...
-
wordの差し込み印刷で文字...
-
「取得先」という表現について
-
switch()文で値の大小比較
-
バッチファイルでpingの結果を...
-
phpでcookieがうまく保存されない
-
DTOとEntityの差は何ですか。
-
開始と終了を指定して、その間...
-
format関数について
-
PHPのセッションについて
-
[C#]Arraylistに追加した構造体...
-
findstrのerrorlevel
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
日付を基にした乱数生成
-
<A href ~で複数の値を渡したい
-
テーブルに送信ボタンをつける
-
「次の10件を表示する」のよ...
-
if文の複数条件。
-
POSTされたかどうか確かめる方...
-
whileループの中でフォーム入力...
-
PHPにて自動計算した値をデータ...
-
PHPでのNULLの正規表現
-
if (isset($_a)&&$_a)この意味は
-
なぜエラーが出るのか分からな...
-
PHPのif文「POSTしていな...
-
$_SERVER["QUERY_STRING"]の仕...
-
Google chart API 、PHP、MySQL...
-
ヒアドキュメントでstaticメン...
-
日付・時刻を比較する方法について
-
逆順表示したい?
-
CakePHP リッチテキストエディ...
-
continueやbreakの後の数字につ...
-
microtime関数は、結構イイカゲ...
おすすめ情報