みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

register_globalや$$という変数について・・・

PHPの勉強を始めて2週間足らずの初学者です。
質問させていただきます。
環境はwindowsXP+xampp+PHP5.2です。

現在、やや古めのPHP書籍のサンプルを試しています。
register_globals=Onの状態では、問題なく動作しました。
しかし、Offにすると反応しない部分があります。

test.phpにてsupport.phpをincludeしているのですが、
以下の箇所をそれぞれregister_globals=Off用に書き換える知恵が
ありません。ほんの一部のみの抜粋にて恐縮ですがご査収願います。

---「test.phpの一部」-----------------------------------------
echo '<INPUT TYPE="radio" NAME="',$name,'"VALUE="',$kaitoubango,'">',"$val\n<br />";}
---「support.phpの一部」--------------------------------------
$kaitoubango++;
$name = $kaitoubango;
$val = $$name;
--------------------------------------------------------------

繰り返しになりますが、register_globals=Onの状態では、問題なく動作しましたが、Offでこの状態でフォームアクションしても$val = $$name;に値がありません。
「support.php」の$$nameを$_POST['name']に変更すれば、可能かと思いましたが、ダメでした。

なお、部分的な質問になりますが、
(1)「test.php」のNAME="',$name,'"VALUE="',$kaitoubango,'"ですが、
何故、NAME="$name" VALUE="$kaitoubango"でないのでしょうか?
「',」は何を意味しているのでしょうか?
(2)「support.php」の$$nameという変数ですが、$が2つ連続した変数は今のところ、初めて見ました。これはどういう意味なのでしょうか?

お詳しい方がおられましたら、何卒アドバイスのを頂戴できればと思います。よろしくお願いいたします。

投稿日時 - 2009-02-25 03:31:59

QNo.4747108

困ってます

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

部分的にしかソースがないので推測になりますが、まず register_globals=Off で $val = $$name; で値が入らないのは $val = $_GET[$name]; または $val = $_POST[$name]; で対応できると思います。(formのmethodがGETかPOSTかで違います)

(1)のご質問についてですが、カンマ「,」ではなくピリオド「.」ではないでしょうか?
まず基本ルールとして、文字列をダブルコーテーションで囲んでいる中では変数が展開されますが、シングルコーテーションで囲んでいる中では展開されません。
echoの中でシングルコーテーションとダブルコーテーションがごちゃごちゃになっていて解り辛くなってますが、前半部分は文字列をシングルコーテーションで囲んでいて、$valあたりからは文字列をダブルコーテーションで囲んでいるようです。
シングルコーテーション部分では変数が展開されないので、一旦文字列を終わらせて文字列演算子の「.」で変数をくっつけているのだと思います。
見やすくするなら
echo "<INPUT TYPE='radio' NAME='$name' VALUE='$kaitoubango'>$val\n<br />";
と、PHPで扱う文字列をダブルコーテーションで囲んで、HTMLタグ内はシングルコーテーションを使用するようにするのが良いのではないでしょうか。

(2)の$が二つくっついた変数ですが、変数名に変数の値を使用する手法で、変数名を動的に扱う際に使います。
例えば$nameの中が abc だとすると $$name は $abc と同等になります。
====================
$abc = 1;
$name = "abc";
echo $abc // 結果は 1 が出力されます
echo $$name // これも 1 が出力されます
====================

投稿日時 - 2009-02-25 07:31:08

お礼

ご回答ありがとうございます。無事に解決いたしました。
ご指摘の通り、$val = $_POST['name'];では無反応でしたが、$val = $_POST[$name];できちんと反応してくれました。
初心者の私にも理解できる非常に丁寧で解りやすいご解説をいただき、誠に感謝いたします。

(1)と(2)の両方の質問に対するご解説も納得できました。ありがとうございます。

なお、(1)のご質問についてですが、

>カンマ「,」ではなくピリオド「.」ではないでしょうか?

とのご指摘ですが、確認しましたところ、ピリオド「.」ではなくカンマ「,」でした。試しにピリオド「.」に置換してみたところ、正常に反応しました。
ただし、カンマ「,」でも正常に反応するのが(といいますか、デフォルトがどうしてピリオド「.」でなくカンマ「,」なのか)今回唯一の未解決案件ではございます。(ただし、動作的には全く問題ありません。)
そのため(すぐに締切ってせめて感謝の意を込めて20ポイントを差し上げたいのですが)この点にもしお気づきがございましたら、
ご教授願えないかとの恐縮な希望もございますので、しばらく締め切らずにおかせていただきます。

それはともかく、お蔭様で昨日、一晩中苦悶していた問題を解決することができました。心より感謝申し上げます。

投稿日時 - 2009-02-25 16:57:27

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

echo の中でカンマ区切りでも表示できているという件ですが、調べてみたところ echo 関数はカンマ区切りで複数の値を与えるとくっつけて表示してくれるようです。(私も勉強になりました)

私は普段 echo より print を使ってます。
print の方はカンマ区切りで複数の値を与えるとエラーになってしまうので、私の認識の中ではピリオドを使ってくっつけるのが正解だと思ってました。

参考URL:http://www.php.net/manual/ja/function.echo.php

投稿日時 - 2009-02-25 17:16:44

お礼

再度のご回答ありがとうございます。たいへん痛み入ります。
わざわざ調べていただいて、まことに恐縮です。
おかげでたいへん勉強になりました。

思い切って初めてこちらのサイトで質問を投稿させていただきましたが、想像以上の有用性の高さに驚いています。今後もPHPの勉強を進めるにあたり、質問させていただくことが多くなりそうです。
また機会がございましたら、たいへんお手数ですが、何卒よろしくお願い申し上げます。

投稿日時 - 2009-02-26 14:31:41

あなたにオススメの質問