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

このQ&Aのポイント
  • PHP初学者がregister_globalや$$という変数について質問
  • register_globals=Onでは正常に動作ができるが、Offでは問題が発生
  • test.phpの一部とsupport.phpの一部についての具体的な質問
回答を見る
  • ベストアンサー

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つ連続した変数は今のところ、初めて見ました。これはどういう意味なのでしょうか? お詳しい方がおられましたら、何卒アドバイスのを頂戴できればと思います。よろしくお願いいたします。

  • PHP
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • t_ohta
  • ベストアンサー率38% (5078/13272)
回答No.1

部分的にしかソースがないので推測になりますが、まず 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 が出力されます ====================

nughduse
質問者

お礼

ご回答ありがとうございます。無事に解決いたしました。 ご指摘の通り、$val = $_POST['name'];では無反応でしたが、$val = $_POST[$name];できちんと反応してくれました。 初心者の私にも理解できる非常に丁寧で解りやすいご解説をいただき、誠に感謝いたします。 (1)と(2)の両方の質問に対するご解説も納得できました。ありがとうございます。 なお、(1)のご質問についてですが、 >カンマ「,」ではなくピリオド「.」ではないでしょうか? とのご指摘ですが、確認しましたところ、ピリオド「.」ではなくカンマ「,」でした。試しにピリオド「.」に置換してみたところ、正常に反応しました。 ただし、カンマ「,」でも正常に反応するのが(といいますか、デフォルトがどうしてピリオド「.」でなくカンマ「,」なのか)今回唯一の未解決案件ではございます。(ただし、動作的には全く問題ありません。) そのため(すぐに締切ってせめて感謝の意を込めて20ポイントを差し上げたいのですが)この点にもしお気づきがございましたら、 ご教授願えないかとの恐縮な希望もございますので、しばらく締め切らずにおかせていただきます。 それはともかく、お蔭様で昨日、一晩中苦悶していた問題を解決することができました。心より感謝申し上げます。

その他の回答 (1)

  • t_ohta
  • ベストアンサー率38% (5078/13272)
回答No.2

echo の中でカンマ区切りでも表示できているという件ですが、調べてみたところ echo 関数はカンマ区切りで複数の値を与えるとくっつけて表示してくれるようです。(私も勉強になりました) 私は普段 echo より print を使ってます。 print の方はカンマ区切りで複数の値を与えるとエラーになってしまうので、私の認識の中ではピリオドを使ってくっつけるのが正解だと思ってました。

参考URL:
http://www.php.net/manual/ja/function.echo.php
nughduse
質問者

お礼

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

関連するQ&A

  • phpのregister_globalsについて

    xamppのPHP5.6.3で、register_globalsを有効にする方法がありましたらご教授ください。 なぜ、有効にする必要があるかと言いますと 参考にしている書籍(少々古いのですが)の環境はPHP4.3.11で、register_globalsを有効にしたサンプルがあるためです。 下記のような有効/無効にした例があります。 現在の私の環境では、2は表示されますが1はエラーとなります。 <? // login.php ?> <html> <body> 1:<?= $login ?><br> 2:<?= $_GET['login'] ?><br> <form action="login.php" method="get"> <input type"hidden" name="login" value="ログインします"> <input type="submit"> </form> </body> </html> 色々と調べてはみたのですが・・・ htdocs内に.htaccessで php_flag register_globals on にする方法を試してみましが、1はエラーで表示されます。 やり方が悪いのか、根本的に別の問題かわからず困っております。 xamppの古いバージョンを入れ直さずに動作確認できる方法がありましたら、よろしくご教授のほど、お願いします。

    • ベストアンサー
    • PHP
  • セッションの変数の受渡しについて

    よろしくお願いします。 セッションを利用して変数受渡しを行おうと思い、初めての試み なので簡単なものを作ってやってみたのですが、変数に値をセットしたtest.phpでは値が表示されますが、リンク先のtest2.phpでは表示されません。 以下のソースで試しています。 -------------------------------------------------- test.php <?php session_start(); session_register("aa"); $_SESSION['aa'] = 1234; print $_SESSION['aa']; print "<p>"; print "<a href='test2.php'>next</a>";←ここの画面では表示されます。 ?> test2.php <?php session_start(); print $_SESSION['aa'];←表示されません ?> ---------------------------------------------- 想定では画面に”1234”と出ると思っていたんですが・・。 他質問をみて真似て色々試したのですが、やはり表示できませんでした。 環境は以下です apache2 php ver4.4.4 session Session Support enabled Registered save handlers files user Directive Local Value Master Value session.auto_start Off Off session.bug_compat_42 On On session.bug_compat_warn On On session.cache_expire 180 180 session.cache_limiter nocache nocache session.cookie_domain no value no value session.cookie_lifetime 0 0 session.cookie_path / / session.cookie_secure Off Off session.entropy_file no value no value session.entropy_length 0 0 session.gc_divisor 100 100 session.gc_maxlifetime 1440 1440 session.gc_probability 1 1 session.name PHPSESSID PHPSESSID session.referer_check no value no value session.save_handler files files session.save_path c:\windows\Temp c:\windows\Temp session.serialize_handler php php session.use_cookies Off Off session.use_only_cookies On On session.use_trans_sid On On 環境の問題でしょうか?各ブラウザで試したのですが、ダメでした。 初歩的質問で申し訳ありませんが、ご教示よろしくお願いします。

    • ベストアンサー
    • PHP
  • 検索フォームからPHPに変数が渡せない際のSQL文の記述方法

    フォームから検索して結果リストを出力する、のような仕組みで、 ■フォーム <form method="post" action="result.php" name="query"> <input size="25" type="text" name="booktitle"> を含む</td> ■PHP内のSQL $sql = "SELECT * FROM MYDB WHERE BOOK LIKE '%$booktitle%') "; としても、変数「booktitle」が渡せません。 調べてみると「register_globals」の設定でFAQ化していることは なんとなく理解できました。register_globalsをONにすることは できないのですが、この場合SQL側の「'%$booktitle%'」の部分には なんと記述したらよいでしょうか?

    • ベストアンサー
    • PHP
  • セッションが変数が取得できません

    こんにちは。初心者で大変申し訳ないのですが、2日間悩みましたがどうしても解決できないため質問させて頂きました。どうかご教授下さい。 PHPのセッション機能の利用をしようと以下のような環境でテストスクリプトを実行したのですが、うまくいきません。 PHPバージョン4.3.10 register_globals On session.auto_start Off session.bug_compat_42 On session.bug_compat_warn On session.cache_expire 180 session.cache_limiter nocache session.cookie_domain no value session.cookie_lifetime 0 session.cookie_path / session.cookie_secure Off session.entropy_file no value no session.entropy_length 0 session.gc_divisor 100 session.gc_maxlifetime 1440 session.gc_probability 1 session.name PHPSESSID session.referer_check no value session.save_handler files session.save_path /tmp session.serialize_handler php session.use_cookies Off session.use_only_cookies Off session.use_trans_sid On SESSION登録側スクリプト <?php session_start(); $_SESSION['tarou'] = 50; ?> <a href="test.php">test</a> 結果表示側スクリプト <?php session_start(); echo($_SESSION['tarou']); ?> session.use_trans_sid Onで透過的にURIにセッションIDを埋め込むタイプで、 セッションファイル自体は作られているのですが セッション変数は登録されておらず、空のセッションファイルとなってしまっています。 色々と調べてみたのですがどうしても解決できません。 大変お手数ですがどうか宜しくお願い致します。

    • ベストアンサー
    • PHP
  • register_globalsがOFFの状態で処理をさせる方法

    今現在、register_globalsがデフォルトでOFFだ というのは知っていますが、 実際にONを前提に書いている人、私も含めて多いと思いますが、 どうやって代替させるのかを 具体的に書いているサイトを知っていましたら、 教えて下さい。 色々なサイトを見ても、問題点は書いているけど、 代替方法があまり書いていないので、 どうすればいいのかよく分からず、 OFFに切り替えたいけど、 出来ない状態でいます ($_POST["***"]等を使うのは見ますが)。 hiddenを使うのは推奨されないということでしょうか? 値の引き渡しをしないで、 どうやって処理させるのか、 リンクで直接パラメーターを書くのも推奨されないと いうことでしょうか? 例: http://www.***.jp/index.php?***=**&***=1 是非ともご回答をお待ちしています。

    • 締切済み
    • PHP
  • register_globalsについて

    こんにちわ。お世話になってます。 register_globalsについての質問なのですが、現在、PHP3で書かれたソースをPHP4のregister_globalsを使ったものに書き換えています。 そこで、ファイルのアップロードに関するところで、 <FORM ENCTYPE="multipart/form-data" ACTION="ext_kakunin.php3" METHOD="POST"> <TABLE border="0" cellspacing="0" cellpadding="0"> <TR> <TD>CSV</TD> <TD ALIGN=center width=20>:</TD> <TD><INPUT TYPE=FILE SIZE=50 NAME="csv"></TD> </TR> <TR> <TD>&nbsp;</TD><TD>&nbsp;</TD> <TD><FONT size=3color=#FFFFCB>c:\_sa\re\re.csv</FONT></TD> </TR> </form>

    • ベストアンサー
    • PHP
  • 受け渡した変数が、プログラム実行後に消えてしまう?!

    いつもありがとうございますm(_ _)m。入力画面test1.phpをlocation.replaceを使って[リロードしない為]切り替えて、別の画面test2.phpと連携させています。JSのwindow.openは顧客環境では使えません(大泣) test1.php→test2.php→test1.phpという流れで二つの変数を受け渡ししたいのですが。。。 (1)test1.phpにある変数 $row1[code] $row1[name] inputボタンをクリックすることで、URLを使って次のファイルに渡す <input type="button" value="go2" onClick='location.replace ("http://********/test2.php?row1[code]=<? echo $row1[code];?>&row1[name]=<? echo $row1[name];?>")' name="button"> (2)test2.php フォームのテキストフィールドが用意されている <input name="code" type="text" value="<? echo $row1[code]; ?>"> <input name="name" type="text" value="<? echo $row1[name]; ?>"> test1.phpから、test2.phpの画面に切り替わった瞬間には、2つのの値がキチンと表示されている。 ここでnameに入った値を元に、サブミットボタンで処理。 <input type="submit" name="read" value="読み込み"> この時name部分に関しては、DB読込・結果をname&その他の項目と共にフォーム上にちゃんと再表示できるが、codeの値が消えてしまう。。 PHPの処理部$read部に以下のように2通り、書き加え試しましたが、だめでした。 $row1[code] = $row1[code]; $row1[code] = $_GET['$row1[code]']; なぜ消えてしまうのか? 変数をキープするにはどうしたらいいでしょうか? あるいは、他に良いアイディアなどありましたら、教えて下さい。よろしくお願いいたします。。。

    • ベストアンサー
    • PHP
  • regsiter_globalsがoffの場合の処理

    regsiter_globalsがoffの場合の 引数の渡し方と受け取り方を教えていただきたいです。 regsiter_globalsがonの場合は、 「http://****/test.php?test=1」 こんな感じでできたのですが、 offの場合はどのようにすれば良いのでしょうか? 参考になるページでも良いので、教えてください。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • PHPの変数の渡し方

    現在以下のような位置関係のファイルでa.phpからb.phpに変数を渡したいのですが、うまく行きません。 ├dir1 │ └a.php └dir2   └b.php a.php <?php public function a(){ $value = "test"; } ?> b.php <?php public funcition b(){ print($value); } ?> phpについてwebで調べ、a.phpで$valueをglobalにしてb.phpでは 関数内でinclude('../dir1/a.php')を記述して$GLOBALS['$value']を 使ってみたのですが、うまく値がとれませんでした。 a.phpで変数をテンプレートに設定して $smarty->Set('Value', $value); それをb.phpで取得しようとしたのですが $smarty->getTemplateVars(Value); 取得する事ができませんでした。 同じようにgeTTemplateVarsを使って別のphpでは取得出来たりするのですが、 このsmartyのスコープ?というのもわかりません。 phpScheduleItというスケジュール管理のパッケージを触っていて、 php自体初めてで深い実装が全て追えていません。 勉強不足で申し訳ないのですが、何かヒントとなる事がありましたらご教示頂けますでしょうか。 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • global_register=onが前提のサンプルをOffの環境で使いたい・・・

    PHP4.4.4 + MySQL4.0.26で、入門本のサンプルを用い、 次のようなオーソドックスな仕組みを流用しています。 (1) リスト画面の編集ボタンを押下で該当IDの編集画面edit.phpへ (2) 編集後、登録押下で入力値がupdate.phpに渡され、入力チェックなどされる。  ($PHP_SELFで全フォームがreadonlyの確認画面が表示される) (3) 再度登録を押下でUPDATEがなされるが、キャンセル押下でlist.phpに戻る、 これは、global_register =On の前提のサンプルなので、Onで動作を確認済み なのですが、本番環境はglobal_register = OffなのでOffにしたら、ソースの冒頭で $cancel = $_POST["cancel"]; $regok = $_POST["regok"]; と宣言したのですが、登録やキャンセルボタンを押下しても$PHP_SELF されてしまいます(同じ画面が何度も表示される無限ループ)。 構造をすごい端折って骨子を示すと、次のような感じですが、↑のような変数宣言 をしてもだめなのでしょうか? <?php if (isset($cancel)) {  //キャンセルボタンが押されたら投稿一覧へリダイレクト  header("Location: list.php");  exit(); } ?> <HTML> <BODY> <?php //投稿編集フォームから呼び出されたとき if (!isset($regok)) {  if (strlen($title) == 0) {   $errmsg .= "タイトルが未入力<BR>";  } } // 投稿編集フォームから呼び出されたとき  if (!isset($regok)) : ?> <FORM method="POST" action="<?= $PHP_SELF ?>?no=<?= $no ?>"> <INPUT name="title" value="<?= $title ?>" readonly> <INPUT type="submit" name="regok" value=" 登録 "> <INPUT type="submit" name="cancel" value="キャンセル"> </FORM> <?php else: //このスクリプトの[登録]ボタンから呼び出されたとき //MySQLに接続、DB選択 //レコード更新SQL endif; ?> </BODY> </HTML>

    • 締切済み
    • PHP

専門家に質問してみよう