• ベストアンサー

データの送受信を行うための環境

PHPの環境を作ってサンプルスクリプトを変更しながらいろいろ試しています。 ループ処理で、今までは手で1つ1つ書いていたテーブルも一瞬で作れてしまったりと、感動しています。 ところが、どうもデータ送受信系のスクリプトがうまく動かないようです。 たとえば1番最初のサンプルは3つの送信ボタンがあって、クリックするボタンによって3通りのメッセージを表示するというものですが、クリックしてもアドレス欄に訳の分からん記号が表示されるだけで、それ以外は何も起こりません。 その他のサンプルスクリプトもデータの送受信に関するものはことごとく失敗しています。 何かサーバー機の設定とかが足りないのですか。

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

  • ベストアンサー
回答No.5

あ、そうか、わかりました。確かにサンプルが古いせいですね、これは。 PHPの古いバージョンでは、例えばフォームの <input type="text" name="text">の内容が、受け取る側のスクリプトで$textという変数に入っていました。しかしこれはセキュリティ上問題があるんです。スクリプト内部の変数名がわかっていれば、その値を外から与える事ができる訳ですから。そのため、どのバージョンからか忘れましたが、デフォルト状態でこのような使い方ができなくなりました。 そこで代わりになるのが$_GET変数、$_POST変数などです。このあたりは参考URLを参照して下さい。但しこれはPHPの設定で回避する事もできます。推奨されていませんが、register_globalsという設定項目の値をいじる事で動くようになります。参考URLをご覧下さい。推奨はされていませんので、慣れたら$_GET,$_POSTの形で書くようにした方がいいと思います。 アドレス欄の文字列というのは、GETの変数だったんですね。これは異常でも何でもありません。HTTPリクエストにはGETとPOSTがあって、GETの場合は変数類がURLの一部として表示されます。 http://okweb.jp/kotaeru.php3?q=1442547 こちらのNO2の回答でGETとPOSTについて説明しています。

参考URL:
http://www.php.net/manual/ja/language.variables.predefined.php
zyousuke
質問者

お礼

wakame0729さん、ご回答ありがとうございます。 register_globalsの値を変更したら、サンプルスクリプトが正しく動くようになりました。 設定方法が良く分からなかったので、手っ取り早く参考URLの.htaccessの方法をやりました。 wakame0729さんの助言通り、まず全てのサンプルスクリプトを見るため、しばらくこの設定にして、慣れてきたら$_GETや$_POSTを使ってやるようにします。 とりあえず、問題は解決しましたが、 ちょっと興味深い?話を書きます。 今、私が読んでる本には、ご丁寧に環境の作成手順が書かれており、私は本に書かれているとおりに環境作成を行いました。アパッチやPHPは本で紹介されているのと全く同じバージョンをあちこち探してインストールしました。何が言いたいのかというと、この本のどこかにregister_globalsについての記述があれば、ここで皆さんに質問することは無かったなぁということです。まあ、まだ全部読み終わってませんから、どこかに書いてあるのかも。書いてあったらごめんなさい。

その他の回答 (6)

回答No.7

>この本のどこかにregister_globalsについての記述があれば その本が執筆された時は、デフォルトがregister_globals=onだったので、その後PHPのデフォルト設定が変わった時の加筆修正がされていないのでしょう。僕自身、その変更があった時の事なんてすっかり忘れていました。 慣れるとregister_globals=offの方が、通常の変数と、外から来るパラメータを別けて考える事がしやすいので、スマートなスクリプトが書けますよ。今は既にこちらの方が普通になっていると思うので、できるだけ早く要領をつかんで移行されることをオススメします。

zyousuke
質問者

お礼

wakame0729さん、ありがとうございます。 執筆開始時と完成時にはかなりの時間差ができますものね。 ところで、この本は2年前に買ったものです。 何で今になって急に読み始めたのかってのはさておき、 今では、なんとPHP5なんてものが登場しているではありませんか。 PHP4は既に一昔前の技術となってしまい、しかも、それを今から頑張って学ぼうとしているオレ・・・

  • ryouchi
  • ベストアンサー率41% (52/125)
回答No.6

wakame0729さんがご指摘されたphpの古いバージョンの仕様は存じ上げませんでした。(勉強になりました>wakame0729さん) phpでもperlでもColdFusionでも基本はサーバにリクエストした結果をサーバ側で処理(計算)し、最終的にHTMLファイル(画像だったりすることもありますが)として返すというのが基本だったりします。 ですので、できるだけ省略せずに記載するのがよいと思います。 ちなみに、今回zyousukeさんはsubmit.phpという名前でファイルを作られたかと思いますが、私の記載方法で、 actionの部分に$_SERVER["PHP_SELF"]という書き方をしているのにお気づきでしょうか? これは自分自身(submit.php)を指すときによく使う方法です。この記載方法であれば、ファイル名を気にせずに作れるので覚えていると楽だと思います。 #勿論大掛かりなプログラムを作る場合はきちんと設計したほうがよいと思います。 ではでは。

zyousuke
質問者

お礼

質問者だけでなく回答者も勉強できる! さすが教えて!gooですね。 PHP_SELFのような汎用的な変数を使えば、後々メンテが不要だったり、メンテの際にも影響範囲が狭くなりますね。ソフト開発の基本ですね!

回答No.4

>依然としてアドレス欄に文字が表示されるだけなのです。 アドレス欄にはどんな文字列が表示されているのですか?

zyousuke
質問者

お礼

ご返信ありがとうございます。 No.3さんのソースを使用したところうまく動くようになりました。 しかし、私の中にはまだ疑問が残っています。 No.3さんのお礼欄を読んでいただけますか。 アドレス欄に表示される文字はNo.3さんの2個目のスクリプトを使用した場合と 私が超簡略化したやつを使用した場合で次のように異なります。 ※テキストボックスにaを入力して送信ボタンをクリックした時のアドレス欄 No.3さんのスクリプトの場合: 元からあったアドレス+?text=a 私が超簡略化したスクリプトの場合: 元からあったアドレス+?text=a&submit=%83N%83G%83%8A%91%97%90M ただしNo.3さんの1個目のスクリプトの場合は私が簡略化したスクリプトと同じアドレスになります。 なのでアドレス欄に表示される文字は特にバグとは関係ないと思います。

  • ryouchi
  • ベストアンサー率41% (52/125)
回答No.3

やりたいことはこういうことでしょうか? <FORM> <INPUT TYPE="text" NAME="text"> <INPUT TYPE="submit" NAME="submit"> </FORM> <?php if (isset($_GET["text"])) print $_GET["text"] ?> 私ならこう書きます。 <?php echo '<form method="get" action="'.$_SERVER["PHP_SELF"].'">'; ?> <INPUT TYPE="text" NAME="text"> <INPUT TYPE="submit" value="submit"> </FORM> <?php if (isset($_GET["text"])) print $_GET["text"] ?> ちなみに、 <INPUT TYPE="submit" NAME="submit"> にはvalueがないのですが、何か特別なことをしているのでしょうか? なお、単純に文字化けの場合は文字コードを確認してみてください。

zyousuke
質問者

お礼

ryouchiさん、ご返信ありがとうございます。 頂いたソースを使用してみたところ、 なんと、やりたかったことが出来ました。 これってひょっとして環境が問題なのではなく、 単にサンプルスクリプトがバグってたということですか。 サンプルスクリプトの変数名のところを$_GET["変数名"]の形に書き換えたら、動くようになりました。 他の動かなかったサンプルスクリプトも集成してみます。 ただ、この本はずっと前に出版されたものなので、公式サイトで紹介しているサンプルがこんなにたくさんバグってるとなれば、読者からの指摘でとっくに修正されているはずだと思うのです。 なので今回ryouchiさんのソースに変更したら動きましたが、サンプルのままでもサーバーの設定とかで正しく動くのではと思っていました。 どう思いますか。 ちなみにvalueがないのには深い訳はないです。 サンプルスクリプトを超簡略化するために省いただけです。私の環境ではvalueを省いた場合、「クエリ送信」というボタンが出来ました。

回答No.2

formタグにはaction属性を書いてないんですね。という事は自分自身をリクエストしているのだと思いますが・・・念のためお聞きしますが、ファイル名を日本語で付けたりしてないですよね?日本語のファイル名を付けても多分うまくいかないと思います。 <form action="自分のファイル名">としてやるとうまく動くようになるんじゃないでしょうか。サンプルソースはこのaction属性、つまり飛び先を省略しています。原因はわかりませんが、このために期待したとび先に飛んでないのではないか、と思いました。

zyousuke
質問者

お礼

wakame0729さん、ご返信ありがとうございます。 ファイル名は日本にはしていません。 昨日のスクリプトを次のように変更しました。 ファイル名はsubmit.phpです。 <FORM ACTION="submit.php"> <INPUT TYPE="text" NAME="text"> <INPUT TYPE="submit" NAME="submit"> </FORM> <?php if (isset($submit)) print $text ?> action属性の書き方は正しいでしょうか。 このスクリプトを試してみましたが、依然としてアドレス欄に文字が表示されるだけなのです。 スミマセンが他にも何か思い当たることがありましたら、是非教えてください。

回答No.1

>クリックしてもアドレス欄に訳の分からん記号 Javascriptで処理している訳でなく、単純なフォームの構造なんですよね?それでアドレス欄がこうなるのでしたら、<form>タグのaction属性がおかしくなってるのではないでしょうか。フォームの部分のHTMLをソース表示するとどうなってますか? 「3つの送信ボタン」とありますが、formタグも3つありますか?もし1つのformタグしかないとしたら、JavaScriptを使って、押したボタンによって飛び先を変えてるなんて事はないですか?だとしたらPHPの問題じゃなくてJavaScriptの問題です。他でもフォームの送信絡みが正常に動作しないとの事なんですが、なんか根本的な間違いがあるように感じます。差し支えない範囲でもう少し詳しい情報下さい。

zyousuke
質問者

お礼

wakame0729さん、ご返信ありがとうございます。 Javascriptは使っていないと思います。 また、サンプルスクリプトは公式サイトからダウンロードしたやつですので、正しいはずだと思います。 サンプルスクリプトをそのまま貼り付けると怒られそうなので、超簡略化したソースを貼り付けます。 <FORM> <INPUT TYPE="text" NAME="text"> <INPUT TYPE="submit" NAME="submit"> </FORM> <?php if (isset($submit)) print $text ?> これは送信ボタンをクリックするとテキストボックスに入力した文字を表示するスクリプトなのですが、クリックしてもやはりアドレス欄が変わるだけなのです。 ソースは正しいですよね??? 何か思い当たる点がありましたら教えてください。 ちょっと今日はもう寝ないと明日がやばいので寝ますね。

関連するQ&A