ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

ゼロからはじめるPHP講座コミュのその1 PHPは、どうすれば使えるの??

  • mixiチェック
  • このエントリーをはてなブックマークに追加
その1 PHPは、どうすれば使えるの??

どうも佐々木です。「ゼロからはじめるPHP講座」をやっていきます。
一緒に勉強していきましょう!

では早速、PHPとはどういう仕組みで動くのでしょうか。
PHPはサーバサイド言語です。
つまり、あなたのパソコンがどんなに高性能でも、あなたが公開するホームページの
サーバがPHPに対応していないと、PHPは使えません。
これは、どういうことでしょうか? もっとわかりやすく実例を使って説明します。

Aさんは、こういうHTMLを作りました。
題名 today.html
<html>
<head>
<title>
今日の日付
</title>
</head>
<body>
今日は2005年7月20日です。<br>
</body>
</html>

でも、これではいつHPを見ても7月20日ですよね。
毎日更新しないといけないですよね。正月も、大晦日も・・・。
しかも毎日0時に書き換えないといけないのは厳しい!! 飲みに行く日もあるのにねー。
そこで、これを更新しなくていいようにPHPで書きましょう。

題名 today.php (拡張子はphpで!)
<html>
<head>
<title>
今日の日付
</title>
</head>
<body>
<?php
echo date("今日はY年m月d日です<\b\r>");
/* 修正しました...7/25 */
?>
</body>
</html>

変わったところは、どこですか? そうです。<body>の中の
「<?php」 と「?>」で囲まれたところです。
これが、PHPの言語にあたる部分です。
PHP以外のところは、普通にHTMLのタグで書いていいんです。
そのまんまでいいのです。PerlやCとは、ここが大きく違います。
(PerlやCは非常に面倒くさい・・・。)

じゃあ、さっそく自分のホームページのFTPにアップしてみましょうか。
today.htmlも、today.phpも同じように見えましたか?
(あっ、実行するのが7月20日じゃなかったら同じようには見えないね・・・。
そこは分かって頂戴ね!)

※とく2にあっぷしました。
http://www35.tok2.com/home/zerokara/today.html
http://www35.tok2.com/home/zerokara/today.php

それでは、today.phpをブラウザで見ている状態で、
ブラウザからtoday.phpのHTMLソースを見てみましょう!
(Windowsの場合は「表示(V)」から「ソースの表示(C)」を押してね。)

どういう風に見えますか?
そうです。「<?php」 と「?>」の部分が消えて、普通に「今日は2005年7月20日です。<br>」と
なってませんか?

これが、PHPのサーバーサイド言語たる所以です。
ホームページを公開するWEBサーバーは、拡張子がPHPのファイルを公開するときに
「あ、これはPHPだな。よし、書いてあるPHPの命令どおりに書き換えるぞ!」
と、「<?php」 と「?>」の部分の所を実行して、書き換えてくれます。
だから、ホームページサーバがPHPに対応していないと、PHPが使えないんです。

ここで中身の説明をします。
echo date("今日はY年m月d日です。<\b\r>");

「echo」で内容を表示する命令。後ろに付いているものを書き出すってこと。
「date("今日はY年m月d日です。<\b\r>")」でYは年、mは月、dは日をあらわします。
<\b\r>は、ご存知HTMLの<br>、「改行」という意味ですね。
そして最後の「;」は文の終わりを意味します。これは重要。これがないとエラーになります。

詳しいechoの使い方はまた次回やります。

この「date」という命令は高機能なので、たくさんの種類のものを扱えます。
曜日や英語表記の月など、色々なことができます。
PHPのdateの説明は http://jp2.php.net/date
を参考に色々やってみてください。
(色々やっていると、ひょっとしたらあることに気づくかもしれません。
その対策の方法は、また次回お教えします。)

というわけで、いきなりPHPのdate文まで説明しましたが、レベルはどうでしたか?
今回の主眼は、サーバサイドとはどういうことか、なのでdate文が分からなくても
問題ありません。

PHPはサーバが実行します。
正確に言うと、Webを公開してくれるHTTPDというプログラムが実行してくれるのです。(Apacheとかが有名ですね。)
それに対して、PerlやCのCGIは、新たに違うプロセスができてしまいます。
(プロセスというのは実行中のプログラムのことです。)
沢山の人がアクセスすると、沢山のプロセスができるのでCPUやメモリを圧迫し遅くなることがあります。
PHPはHTTPDが実行してくれるので、プロセスが沢山できることはありません。
したがって、PerlやCのCGIよりサーバに負担をかけません。

次回は、echo文の使い方と文字列、変数について説明します。
質問、意見等あったらバンバンどうぞ。

P.S
PHPが使えるホームページサーバを探しましょう。
あなたのホームページはPHPが使えますか? 使えない場合、新天地を求める必要がありますね!
無料のホームページは、審査や抽選がほとんどでなかなか登録できないのが現状です。
有料ホームページはお金はかかるのですが、それでも月々数百円と割安なところも多いです。
今すぐ使いたい!でもお金をかけたくない!というわがままな人は自分でサーバを作ってください!(笑)

・無料ホームページサーバ紹介
http://www.kooss.com/hp/
・有料ホームページサーバ紹介
http://www.wsj21.net/hp-space/hp-space-share.html
・いいや、俺は自分でサーバを作る!(難しいけどおススめ。LINUXです。)
http://www.hizlab.net/app/

コメント(46)

あんまり良くないソースを上げてしまいました。(笑)
(EUCだと出ないんだけど、SHIFTJISだとでるみたいで気づかなかったです・・・・。ゴメン!)

これに関しては、「その2」の一番最後の「P.S.2」にもかいてあるんですが、
date文は決まっている「英文字」を日付に変えてしまうんです。
だからここでは<br>のrが日付になってしまうんです。
(何が変わるかはこちらを見てね http://jp2.php.net/date )

対処法としては

echo date("今日はY年m月d日です<\b\r>");
もしくは、
echo date("今日はY年m月d日です") . '<br>';

としてください。
うまくいくはずです。

お互い失敗しながら勉強していきましょう!
アッチさんへ
上のほうは、うまくいってるんじゃないですか?
左下のエラー(?)は見つけられませんでしたよ。
なんて書いてあるか教えてくれませんか?

下の方は、PHPに対応してないようですね。
ブラウザからソースを見ても、<?php がのこってますもの。

サーバでPHPが使えるかどうかは調べておくといいでしょう。
また、
「phpinfo.php」とかっていう題名で
「<?php phpinfo();?>」
これ一行だけ(!)のホームページをアップして見てみましょう。
PHPが使えれば、細かい設定の画面を見ることができますよ!
これが見れなかったらPHPは使えないってことですねー。
コメントありがとうございます。早速試してみます。
7> 佐々木さんへ

修正して試した結果、前に表示された「・52」という部分はなくなりました。
でも句点が出ないので、イマイチすっきりしてません。
「これから勉強したら、わかるようになるんだ!」と、
今回は無理やり自分を納得させました。

これからもお手数をおかけすると思いますが、
よろしくお願いします<(_ _)>
やっちゃんさん、こんばんわ

>でも句点が出ないので、イマイチすっきりしてません。

うーん、句点が出ないというのは、どういうことですか?
これ「echo date("今日はY年m月d日です<\b\r>");」
(もしくは「echo date("今日はY年m月d日です") . '<br>';」 )
の結果「今日は2005年7月24日です」と表示されませんか?
疑問があったら、どうぞソースと表示結果をコメントしてください!!
えー、句点が表示されない、というのはですねぇ、

(1)echo date("今日はY年m月d日です<\b\r>"); の場合、
ソース:今日は2005年07月24日です<br>

(2)echo date("今日はY年m月d日です。<\b\r>"); の場合、
ソース:今日は2005年07月24日です・50<br>

という具合です。
画像と照らし合わせていただけるとわかっていただけるかな?
句点なんかにこだわるのは、我ながら細かいなぁ〜と思うんですが、
最初のに句点があったので、つい気になって。
やっちゃんさんへ

これは、シフトJISコードという漢字コードを使用するとこうなります。

解決策は、「。」をdate文の外に出してください。
つまり、「echo date("今日はY年m月d日です")."。<br>";」としてください。
(または、文字コードでEUCを使用してください。)

**** 解 説 ****
なんでこうなるのでしょうか、文字コードの話を簡単に説明します。
シフトJISコードは、漢字や全角ひらがなを表現するための「技」というか「工夫」です。ウィンドウズはシフトJISを使っています。
その漢字を表現する方法ですが、半角文字を2文字使用して、
「これは漢字だよ!」って表現しているんです。
・シフトJISで使う文字
http://www.hidecnet.ne.jp/~sinzan/tips/etc/etc_tip08.htm
を見てください。
漢字を表現する場合、半角文字2文字で表現するんですが、
1文字目(1バイト目)はこのページの上の表の、青いところを使います。
青いところには何も書いてませんね。つまり、漢字を表現するときは「半角文字として定義されていない青い所」を1文字目にしているんです。
これで、この青いところの文字が出てくると、「あ、これは漢字が始まる合図だな」とコンピューターは準備します。
そして、次の2文字目で、何の漢字か確定できます。2文字目(2バイト目)も何を使うか決まっていて、下の表の青い所になります。

そこで、「。」は、シフトJISで表現すると、どういう風になるんでしょうか?
・シフトJIS表です。ちょっとサイズが大きいです。
http://www.kishugiken.co.jp/cn/code04c.html
これを見ると「。」は
「S-JIS第一バイト=0x81の42のところ」とありますよね。
(「0x」というのは、16進数という意味です。)
つまり、「一文字目は81番です。2文字目は42番です。」
という風に定義されています。
私たちが目に見るときには「。」に見えますが、
実際は81番と42番の半角2文字なんです。
さて、これを最初に紹介したページの表で見てみると
http://www.hidecnet.ne.jp/~sinzan/tips/etc/etc_tip08.htm
81番は何も書いていませんね、つまり定義されていない文字です。ここでは「・」とでも書いておきましょうか。
42番は「B」ですね。
つまり「・B」 が「。」をあらわすための文字コードなんです。

で、dateに「。」を書くと、文字コード上「・B」が入ります。
すると、「・B」を漢字にする前に「あれBがあるよ。これは日付に直さないと!」とコンピューターは考えます。
日付の対応表はこれを見てください。
http://jp2.php.net/date
これをみると「B Swatch インターネット時間 000 から 999」ってあります。
「なんだ?Swatch インターネット時間って?」って思いますよね。
これはスイスの時計メーカーのスウォッチが考えた時間を表現する方式です。
http://internet.watch.impress.co.jp/www/article/1999/0119/swatch.htm
つまり、「。」をシフトJISでdate文の中に入れてしまうと、
「・B」と結局入力されたも同じなので、コンピューターは勘違いして、漢字ではなく、日付のコードと思うわけです。

そういうわけで、WINDOWSの人は(シフトJISの人は)
「echo date("今日はY年m月d日です")."。<br>";」
とわけてください。
文字コードは少しややこしいですが、
これで少し概要はわかったと思います。
シフトJISはこういったもの以外にも勘違いをすることが多いので、文字化けの原因となることもあります。
おわかりになりましたか?
疑問があったら、コメントしてください。
む、難しいですね^_^;
でも概要はわかりました。
詳しい説明、ありがとうございました。

文字コードは、まだまだ自分でも苦手なところです。
これからも精進したいと思います。
これはおもしろい♪

本気で一緒に勉強したいと思っています。
よろしくお願いいたします。
初めまして、先程参加させていただきました C H I Fと申します。

個人的な意見ですが、<\b\r>としたり、."<br>"
とするよりも、
echo date("****");

echo "<br>\n";
分けたほうが初心者の方にも分かり易いし、ソースも読みやすいと思います。
date等の変わった関数でなければ."***"でもいいと思いますが、
\r等、特殊な文字が持つ意味合いは慣れてからの方がいいとも思います。

ちなみに当方環境では、ソース部分で
今日は2005年10月03日です<b
>
ときっちり\rがキャリッジリターンとしてのレスポンスを受けています。

「ゼロから〜」どこまでかはわかりませんが、
そのうち、サーバがWindowsどうこう、Linuxどうこうなるかもしれませんし、
最初のうちから環境に依存しない形
(もしくは、こうやっちゃうとこの環境だとこうなっちゃう)
というのを含めて「ゼロからの〜〜」にした方が方がいいと思います。

楽しくされている所を濁してしまって申し訳ないです。
(どうせ覚えるなら、間違っていない知識をと思い
 書かせていただきました。)

追記ですが、<?php phpinfo();?>も
php.iniの設定次第で動作しませんので、
ホスティング元によってはPHPが使えてもphpinfoが動きません。
又、
>PHPはHTTPDが実行してくれるので、プロセスが沢山できることはありません。
>したがって、PerlやCのCGIよりサーバに負担をかけません。
サーバに負荷を与える与えないにプロセス生成は1つの要因ではありますが、プロセス生成だけで測れるものではないので、
断言されるのはどうかと思います。
個人的には
「今日は」「Y年m月d日」「です。」を全部分けてほしいです。

date関数は「ローカルの日付/時刻を書式化する」ことなので、日付や時刻以外のものに関しては、関数の引数としては取らないほうが賢明なんじゃないだろうか?という意見です。

たとえばマニュアルには以下の例が載っています。
// Prints: July 1, 2000 is on a Saturday
echo "July 1, 2000 is on a " . date("l", mktime(0, 0, 0, 7, 1, 2000));

しかしまた一方でdate関数の説明の中で「エスケープするには」について述べていることにも注目してよいと思います。
例 3. date()の文字をエスケープする
<?php
// Wednesday the 15th のように出力
echo date("l \\t\h\e jS");
?>


> C H I Fさん

phpinfoが使えない場合、どのようなエラーメッセージになりますか?そこまで提示してあげられればより親切だと思うのですが。
>KIDD@余命(違)一月 さん
そうですね。
error_reportingの値次第ですが、
Warning: phpinfo() has been disabled for security reasons in /home/chif/public_html/test.php on line 3
の様な出力がでる場合と、何も出力されない場合とがあります。

date関数中での特殊文字への対処
1.date関数で特別な意味を持つ文字を表示するには。
 対処:文字として表示させたいものの頭に\をつける。
 例:「USJ」と言う文字を表示させる。
   echo date("\U\SJ");
   U、S共にdate関数内で意味を持つため\でエスケープ
   Jは意味を持たないためエスケープの必要なし。
2.エスケープシーケンスで使われている
 対処:文字として表示させたいものの頭に\\をつける。
 例:「then」という文字列を表示させる
   echo date("\\t\he\\n");
   hは1に該当するので\h
   eは意味を持たないのでエスケープの必要なし
   t、nは2に該当するため\\t、\\nと記述。
   1にも該当するが、それぞれ\t、\nとしても
   タブ、改行として出力されてしまう。
   
こんな感じだと思います。
CHIFさん
KIDD@余命(違)一月さん

確かにそのとおりですね。
みなさんありがとうございます。
わかりやすいかなって点に主眼をおいたんですが、
エラーを出すようなコードを置いたりして混乱させてしまったと思います。
これからも書き込んでください。
みなさんのサポートありがとうございます。
CHIFさん
KIDD@余命(違)一月さん

確かにそのとおりですね。
みなさんありがとうございます。
わかりやすいかなって点に主眼をおいたんですが、
エラーを出すようなコードを置いたりして混乱させてしまったと思います。
これからも書き込んでください。
みなさんのサポートありがとうございます。
C H I Fさん

当たり前のことですが「PHPとしては動作している」ことが確認できた上で「phpinfo()がエラーになる」ってことがわかるってことですね。

error_reportingがfalseのって結構イタイですよね(まぁセキュリティ的にはそりゃそれでいいんですが)。別のトピックだかどこかで、「エラーにならないのに」って言ってる人がいました。
こんにちはー。はじめまして。
これは楽しそうで、お勉強になりそう!!
こっそりと学ばせていただきますのでよろしくお願いします。
KIDD@余命(違)一月さん

>当たり前のことですが「PHPとしては動作している」ことが確認できた上で「phpinfo()がエラーになる」ってことがわかるってことですね。

そうですね。
ただ、「ゼロからはじめるPHP講座」という事もありまして、
HTMLは出来るけどPHPは初めてな方や、HTML自体も良く知らない方なども居ると思います。
ソースでの確認をされない方も多いのではないかと思います。

その点も考慮に入れまして、エラーと書かず、動きませんと書かせていただきました。

エラーメッセージが出力されるならともかく、
エラーメッセージが出力されない環境で
<?php
echo phpinfo();
?>
とだけ記述して、PHPが使えるかどうかを試された方の場合、
ソースを確認されなければブラウザでは何も表示されません。
PHPが使えない環境でも何も表示されなかったと思います。
(Win版IE6ではそうなったと思います。確認はしていません)
ですので、「PHP使えないんだ」と思われる方もいるかもしれないと思いまして。

PHPが使える環境かどうかでしたら、
<?php
echo 'hello world';
?>
の方がありきたりですが、しっくりくるなぁと感じます。
※hellow worldと表示されれば使用可。
 何も表示されなければ不可。
 (これもWinIE6以外ではわかりませんが・・しかも確認していません)
私はphpinfoはphp.iniの設定と、拡張モジュールの確認以外に使う必要ないと思っていますし・・。


>error_reportingがfalseのって結構イタイですよね
セキュリティ的には有難い設定だとは私も思います。
まあ・・・ローカル環境できっちりテストしてエラー起きないよう心がけるのが一番ですね。


※現在酔っ払っていますのでおかしな事を書いている可能性ありです。すいません(汗)
hellowってなんだ。

・・・と投稿してから思いました。すいません。
> HTMLは出来るけどPHPは初めてな方

横からスミマセン。私はこのHTMLはわかるけど、PHPはまったくわからないクチです。

先日某所のPHPセミナーに参加してきました。
たぶん、ただのPHPセミナーだとわけわからなかったと思うんですが、
そのセミナーはWebデザイナー向けのものでしたので、私にも理解することができました。

一言で「PHP」と言っても、受け取り方はさまざまです。
すべてを網羅することは難しいと思うので、
私が受講したセミナーのように、Webデザイナー向けとか、プログラマ向けとか、ちゃんと分かれているといいのになって思いました。
設定環境もさまざまですしね。
#ちなみに私のテストサーバーは自分のパソコンで、Apache2.0.52+PHP5を入れました。
環境について、教えてください。

25でも書きましたが、私は自分のローカルマシンに
Apache2.0.52+PHP5をインストールしています。

このスレッドの今日の日付のphpとか、
<?php
if ($file=fopen("**.htm","r")) fpassthru($file);
?>
この程度なら、ちゃんと動くんですが、
今日サンプルで作ったものを確認しようとしたら、動きませんでした。
レンタルサーバーで同じものをテストしたら動いていたので、私のPCのPHPの設定がおかしいのではないかと疑いました。

php.inとか、httpd.confを見直してみましたが、インストールの設定などの書かれている書籍の説明と、ちゃんと同じようになっていました。
いったい何が悪くて動かないのでしょうか?
エラーメッセージなどはでず、phpが動かないだけです。

ちなみにテストしてみたファイルは、コレです。
書籍のサンプルをそのまま写しているし、レンタルサーバーでは動いていたので、
スクリプトのせいではないと思うのですが、念のため。

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis" />
<title>submit.php</title>
</head>
<body>
<?php
if (isset($submit1) and (! empty($text1))) {
print "<p>送信1ボタンがクリックされました。<br />";
print "入力データは「 $text1 」です。</p>";

} elseif (isset($submit2) and (! empty($text2))) {
print "<p>送信2ボタンがクリックされました。<br />";
print "入力データは「 $text2 」です。</p>";

} elseif (isset($submit3) and (! empty($text3))) {
print "<p>送信3ボタンがクリックされました。<br />";
print "入力データは「 $text3 」です。</p>";
}
?>

<p>入力ボックスへ入力後、送信ボタンをクリックしてください。</p>
<form>
<input name="text1" type="text" value="<?php print $text1 ?>" size="30" maxlength="12" /><br />
<input name="submit1" type="submit" value="送信1" /><input type="reset" /><br />
</form>

<form>
<input name="text2" type="text" value="<?php print $text2 ?> " size="30" maxlength="22" /><br />
<input name="submit2" type="submit" value="送信2" /><input type="reset" /><br />
</form>

<form>
<input name="text3" type="text" value="<?php print $text3 ?> " size="30" maxlength="32" /><br />
<input name="submit3" type="submit" value="送信3" /><input type="reset" /><br />
</form>
</body>
</html>
formのactionが指定されていないからでは。

おそらく
<form method="POST" action="<?php $_SERVER['self']?>">

25で
>私はこのHTMLはわかるけど、

と書いてあるので、はずしてるかもしれませんが・・・
なんとなく「そのまま写している」がほんと?と思うのですが。(他にも根拠があってそう思っている)
横から補足させていただくと

<form method="POST" action="<?php $_SERVER['self']?>">



<form method="POST" action="<?php echo($_SERVER['PHP_SELF'])?>">

だと思いますよ。
↑まともに調べずに書いたばかりか、echoの部分まで・・・。

少しは検証しろって話ですね。^-^;
#単語一つってちょっとそんなん書いた覚えがなくて違和感はあったんです

フォローありがとうございます
いえいえとんでもないです。

自分も
for(i=0;i<10;i++){
〜〜

って感じで書いて
FORが回らないなぁなんて言って悩むクチなんで^^;

ちなみに正解は
for($i=0;$i<10;$i++){
ですよね^^
NAO.comさん KIDD@TV募集中さん、
お返事をありがとうございます。

まず一つ訂正。
今見たら、自分で最初に作ったものを書き写していました。
ですが、1行目の宣言が書籍サンプルにはなかったことと、
shift_jisがEUC_JPであったこと以外は、書籍の丸写しです。

で、↑で教えていただいたものを試してみましたが、
昨晩同様、ローカルマシンの環境下では、動きませんでした。
ほかに、考えられるようなことってありますでしょうか?
<?php
if ($file=fopen("**.htm","r")) fpassthru($file);
?>

↑は動くけど
Formが絡むそのソースはうまく動かないってことですか?
もしどのphpファイルも動かないのであれば足回りの
php.iniの設定やApacheのルートディレクトリに置かれているかなどを
疑いますが
動くやつと動かないやつがあるのは正直何が原因かわからないです。

動かないというのは真っ白の画面のまま
エラーすら出力されないってことですよね?
特に変わったことをしているソースではないし
レンタルサーバーで動くのならソースには問題ないと思います。

PHPとApacheは設定変更してからちゃんと再起動していますよね?Apacheのほうを。
設定変更をした後にApacheを再起動してあげないと
設定が適応されないので一応念のために。
NAO.comさん

> Formが絡むそのソースはうまく動かないってことですか?
ほかのformを含むサンプルをまだ試していないので、
断言はできません。
が、
<?php
if ($file=fopen("**.htm","r")) fpassthru($file);
?>

これや、このスレッドの一番最初の today.phpは
ちゃんと、動作していることを確認しました。

> 動かないというのは真っ白の画面のまま
> エラーすら出力されないってことですよね?
html部分は表示されています。
phpでエラーがあると、よく表示されるようなものは
今回は出ていせん。

フォームにテスト入力して送信ボタンを押しても
それまでと同じhtmlが表示されているだけで、
「送信1ボタンがクリックされました。
 print "入力データは「 **** 」です。」
は表示されません。

> PHPとApacheは設定変更してからちゃんと再起動していますよね?
はい。気をつけています。
パソコンそのものも再起動をしています。

やっぱ原因不明ですか?
では、わたしが27で指摘した「写してるのは本当か?」と思った根拠について書きます。

まずプログラム中の$test1とか$submit1いう変数には一体何が入るべきなのでしょう?

その答えは、フォームのsubmitを押したときに送信されるものに関連するものでしょう。

つまりこのプログラムでは
$text1 = $_POST['text1'];や
$submit1 = $_POST['submit1'];
などの処理が欠けているので、フォームから値が送信されていても(そこまではPHPの問題ではなくHTMLの問題)、それを受け取った処理をしていないので、初期呼び出しと同じ動きになっているのでしょう。

#formのmethodでPOSTと書いたら$_POST、GETなら$_GET。まぁ両方吸収する手として$_REQUESTもありますが。

|<?php
|if (isset($submit1) and (! empty($text1))) {
|print "<p>送信1ボタンがクリックされました。<br />";
|print "入力データは「 $text1 」です。</p>";
|
|} elseif (isset($submit2) and (! empty($text2))) {
|print "<p>送信2ボタンがクリックされました。<br />";
|print "入力データは「 $text2 」です。</p>";
|
|} elseif (isset($submit3) and (! empty($text3))) {
|print "<p>送信3ボタンがクリックされました。<br />";
|print "入力データは「 $text3 」です。</p>";
|}

これらの送信された値を出力する部分はすべて「〜がsetされていれば」「〜が空でなければ」という処理になっています。このあたり、formを絡めた基本的な処理になると思うので、書籍を読まれている場合はその部分を中心に復習されるとよいと思います。

#ところで、本当に写したのだとしたら書籍に問題があるのではないか?なんていう本ですか?
自己レスですが

> formを絡めた基本的な処理になると思うので、書籍を読まれている場合はその部分を中心に復習されるとよいと思います。

すでに佐々木さんが第三回としてこのテーマで書かれています。ご参考に。

その3 if文とフォームを組み合わせる
http://mixi.jp/view_bbs.pl?id=1615884
ん〜、あと考えられる原因は
決められたディレクトリ(ドキュメントルートにおいて)
動作確認をしていないってことくらいですかねぇ・・・

一度上のフォームのサンプルソースの中に
わざとエラーを仕込ませてエラーが吐き出されるか
やってみるといいかもしれません。

例えばifのとこをわざとafとか適当なものにすると
おそらくPHPが正常に動いていれば何らかの返事が
表示されるはずです。

それでエラーが表示されない場合
PHPファイルとして認識されてない可能性が考えられます。
ってことでそれをお試しください。
36:NAO.comさん

「PHPとして動いているか」だけであれば実行したときのHTMLソースを見れば

<form method="POST" action="<?php echo($_SERVER['PHP_SELF'])?>">

の部分が
<form method="POST" action="/hogehoge/submit.php">
とかに変換されていると思いますし、<?php〜?>までの部分が特に表示がされていない(と思われる)ことを考えるとそのセンは薄いかな、という予感はします。

あくまで予感ですが。
確かにそうですね^^;
ソースはサーバーで確認済みっていうことだったので
足回りを疑ってしまいました^^;

>34でのKIDD@TV募集中さんのご指摘の点
確かに自分も引っかかりました。

この場合
$_POST['submit']
$_REQUEST['submit']
のどちらかを使ってフォームの情報を
PHPで受け取らないとうまく動かない(はず)ですね。

「サーバーで動いた」っていうところの
どうして動いたかという説明が
できないのがひっかかりますが・・・
・サーバで動いて、ローカルで動かない。
これの「動かない」がどう動かないのかわかりませんが、
送信ボタンを押してもその結果が反映されないと言うのであれば、
上のソースを見た限りでは、php.ini内の
「register_globals」をOffにされているだけかと思います。

視点ずれてたらすいません。
33読みました。
どう動かないのかわかりました。
(遅いですね。すいません。)

register_globals = On
に設定を変えてApacheを再起動してみてください。

register_globalsの設定がOffの状態ですと、
$submit1 = $_POST{'submit1'}
のように自分で値を取得してこなければなりません。

どの環境でも対応できるように上記のように書くべきなのと、
セキュリティ的な観点から、register_globalsがOnであっても上記のように取得、又、普段使用する変数も$values = '';
のように値設定するように心がけた方がよいと思います。
KIDD@TV募集中さん、NAO.comさん、C H I Fさん、
いろいろありがとうございました。

C H I Fさんのアドバイスにありました、
register_globals = On
にしたところ、ちゃんと動くようになりました。

35.
> #ところで、本当に写したのだとしたら書籍に問題があるのではないか?なんていう本ですか?

今回試したサンプルが書籍の一番最初の部分であること、
もう数ページ先を見ましたら、このサンプルを書き換えて、
method ="post"、method ="get"について、
説明をするところがあるようです。
またこの書籍が悪いかどうかの判断も私にはできないので、
とりあえずここではお返事は割愛させていただいてもよろしいでしょうか?

40
> どの環境でも対応できるように上記のように書くべきなのと(以下、中略)
…に値設定するように心がけた方がよいと思います。

なるほど。まだ自分ではどうすればそうなるのかがわかっていませんが、
そういうことも頭に入れて、勉強して取り組みたいと思います。

みなさん、いろいろとありがとうございました<(_ _)>
自分がローカル(WinXP)にテスト環境を用意したときにはエラー吐き出しの設定部分は
デフォルトでON(吐き出す)になってたので
まさかそこだとは思っていませんでした(´`;

的外れなコメントばかりでスイマセンでした(^^;
42:NAO.comさん

それってregister_globalsじゃなくてerror_reporting?


register_globalsはOnになっていることがまずほとんどないので、存在として忘れていました。(なのでソースを見てもそれが原因とすぐわからず。勉強になりました)

そういう意味では書籍が少し古いのではないかという印象。
そうですね(´▽`;
その設定項目の存在すら知りませんでした…
ためになりました!
> そういう意味では書籍が少し古いのではないかという印象。

書籍の奥付には2002年とありました。
この業界、3年前はひと昔(ふた昔!?)ですよね^^;
ちなみにPHP4.1.0まではその値はデフォルトでOnだそうです。

4.1.1のリリースが 26 Dec 2001です。
http://www.php.net/releases.php

むかーしむかーしのことーじゃったー(まんが日本昔話風)

ついでにココ読んておくと良さげ。
http://www.linux.or.jp/JF/JFdocs/Secure-Programs-HOWTO/php.html

ログインすると、残り6件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

ゼロからはじめるPHP講座 更新情報

ゼロからはじめるPHP講座のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング