PHPファイルがうまく実行できない
- 評価
- クリップ 0
- VIEW 425

退会済みユーザー
O'REILLYの「はじめてのPHP」で勉強しています。
xamppを使っています
php7.4.7です。
selectメニューを表示するプログラムです。
期待する実行結果は以下の通りです。
<form method="post" action="oder.php">
Your Order: <select name="order">
<option>Sesame Seed Puff</option>
<option>Coconut Milk Gelatin Square</option>
<option>Brown Sugar Cake</option>
<option>Sweet Rice and Meat</option>
</select >
<br/>
<input type="submit" value="Order">
</form>
発生している問題・エラーメッセージ
実行すると以下のように表示されて終わり、期待されたプリント結果が表示されません。
hiroko@HIROKO711 C:\xampp\htdocs\chap07
# php 7-18h.php
hiroko@HIROKO711 C:\xampp\htdocs\chap07
#
ヒアドキュメントの
<form method="post" action="$_SERVER[PHP_SELF]">
Your Order: <select name="order" >
$sweets...
を
<form method="post" action="{$_SERVER[PHP_SELF]}">
Your Order: <select name="{order}" >
{$sweets}...
にしてみましたが、変化ありませんでした。
ヒアドキュメントだけのシンプルなコードで練習するとちゃんと表示されるのですが、
構文チェックをするとエラーはありませんと出ます。
よろしくお願いいたします。
//7-18.php
<?php
$sweets = array('Sesame Seed Puff','Coconut Milk Gelatin Square',
'Brown Sugar Cake','Sweet Rice and Meat');
function generate_options($options){
$html = '';
foreach ($options as $option){
$html .= "<option>$option</option>\n";
}
return $html;
}
// フォームを表示する
function show_form(){
$sweets = generate_options($GLOBALS['sweets']);
print<<<_HTML_
<form method="post" action="$_SERVER[PHP_SELF]">
Your Order: <select name="order" >
$sweets
</select>
<br/>
<input type="submit" value="Order">
</form>
_HTML_;
}
?>
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
+3
「<?php ?>」をあちこち入れていた時に
まずはここから改善する必要があります。
PHPマニュアル:PHPタグ
「あちこち入れる」のではなく「適切に入れる」ことを覚えましょう。
最後に提示されているコードは明らかに不適切なところで利用されていますし、構文エラーが出ます。
↓こう書いているようなものです
<?php
<?php
?>
あとは$GLOBALS
昨今では使うことないのではないでしょうか。
これ自体の使い方は間違ってないように見えますけどね。
簡単なコードを組んでみれば分かります。
<?php
$hoge = "test";
function a(){
echo $GLOBALS['hoge'];
}
a();
今回も実は$GLOBALSを使うメリットってありません。
なぜなら、optionの中身とかは別途設定ファイルで持つか、DBでマスタとして持つのが本来のやり方だからです。
「変数」で持つとコードを直接編集しなければなりません。
でも「変数」はやはり「リクエストにより常に書き換えられる動的な情報」を持つべきものなので、「内容はほとんど変わらないもの」なのであれば「変数」で持っておくメリットはありません。
コードの中に持つことでメンテナンス性も落ちます。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
-2
以下のように修正して、目的の実行結果を得られました。
function show_form(){
Your Order: Sesame Seed Puff
Coconut Milk Gelatin Square
Brown Sugar Cake
Sweet Rice and Meat
order(ボタン)
}
//上のソースコードは
function show_form(){
<form method="post" action="/O'REILLY/chap07/7-18f.php">
Your Order: <select name="order" multiple>
<option>Sesame Seed Puff</option>
<option>Coconut Milk Gelatin Square</option>
<option>Brown Sugar Cake</option>
<option>Sweet Rice and Meat</option>
</select>
<br />
<input type="submit" value="Order">
</form>
}
ありがとうございました。
<?php
$sweets = array('Sesame Seed Puff','Coconut Milk Gelatin Square',
'Brown Sugar Cake','Sweet Rice and Meat');
function generate_options($options){
$html = '';
foreach ($options as $option){
$html .= "<option>$option</option>\n";
}
return $html;
}
// フォームデータをチェックする
function validate_form(){
// エラーメッセージを空の配列で初期化する
$errors = array();
$input = array();
$order='';
if(isset($input['order'])){
$input['order'] = $_POST['order'];
}
if(! in_array($input['order'] ,$GLOBALS['sweets'])){
$errors[] = 'Please choose a valid order.';
// 有効な
}
}
?>
function show_form(){
<?php
$sweets = generate_options($GLOBALS['sweets']);
?>
<?php
print<<<_HTML_
<form method="post" action="$_SERVER[PHP_SELF]">
Your Order:
<select name="order" multiple>
$sweets
</select>
<br />
<input type="submit" value="Order">
</form>
_HTML_;
?>
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.18%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
m.ts10806
2020/05/02 23:40
コードは全てマークダウンで対応してください。
m.ts10806
2020/05/02 23:41
また、$GLOBALSをどういう意図で使ったのか記載いただけますか?
そもそもユーザ変数のグローバル化はほとんど必要になりませんし、コードの見通しが悪くなります。
退会済みユーザー
2020/05/02 23:45
すみません、参考書のコードを見ながら実行し、そこからコードを読み解いています。
勉強不足で意味がよくわかりません。実行結果と説明文を読みながら進んでいます。
m.ts10806
2020/05/02 23:52
となると、アドバイスしても理解を得られるか非常に難しいところなので、
まず1つ1つ説明できるくらいにはなっておいたほうが良いと思います。
目的は書籍を書き写して実行できるようになることですか?
m.ts10806
2020/05/03 00:00 編集
と、言うのはですね。
全ての人が書籍で学習するわけではなく、書籍で学習していても同じ書籍を持っているとは限らないわけです。
「何を達成したいコードなのか」という説明なしには簡単には答えられないのが赤の他人としての事情です。(それに入門書だとそもそも手元にない人も多いのでは)
それに、PHPのバージョンが自身の環境と書籍で違えば当然使えない機能や実装も出てきます。
オライリー本の「はじめてのPHP」といえば、PHP技術者認定試験初級の教本として公式に紹介されているものであるので、私も書籍の存在自体は知っていますが、PHP7対応版だったとしても3年以上前に出版なので、ちょっと怪しいですし、$GLOBALSを利用しているところなどから、実装もかなり古いものと思われます。
つまり、書籍で学習したとして、果たして使えるものにはなるのだろうか?という疑問があるわけです。
PHP技術者認定も7の初級は去年受けたので知っていますが、実装の古さはずいぶんと改善されたので、提示のような実装を載せている書籍で頑張っても、実用的な実装は身に付かないのではないかと懸念しています。
退会済みユーザー
2020/05/03 00:12
書籍の発行日は2017.3.22 なっています。phpを学習して、プログラミングができるようになることです。
これで稼ぐことは想定していません。プログラミングすることが楽しいのです。
退会済みユーザー
2020/05/03 00:16
ここの章が私には、肝になると思っています。あとはデータベース、ファイルの読み書きですので、ある程度
理解が進むと思っています。
m.ts10806
2020/05/03 00:17
「プログラミングができるようになった先」も考えておいた方が良いかとは思いますが、古い実装を覚えたところで、おそらく楽しくはないと思いますし、質問したときにそこから突っ込まれます。
プログラミングの喜びって、人それぞれだとは思いますが、何かしらを達成したとき(問題解決・作りたいものができた)が多いと思います。
となると、「書籍を丸写しする」では達成感も低いのではと思います。
「実際に課題を設け、設計し、作り上げる」ほうにシフトしては如何でしょうか。
m.ts10806
2020/05/03 00:18
ただ、何にせよ、「このコードが何を達成すべく組まれたものなのか」
ゴールを明示されないと答えようがないのは変わりません。
コードは全てマークダウンにしてくださいね。
退会済みユーザー
2020/05/04 04:39
お手数かけています。7章を読み返してごらんのところまで来ました。
show_form()以下で
<form method="post" action="oder.php">
Your Order: <select name="order">
<option>Sesame Seed Puff</option>
<option>Coconut Milk Gelatin Square</option>
<option>Brown Sugar Cake</option>
<option>Sweet Rice and Meat</option>
</select >
<br/>
<input type="submit" value="Order">
</form>
のHTMLを出力するにはどうすればいいのでしょうか。よろしくお願いいたします。
m.ts10806
2020/05/04 08:30
>このコードはPHPコードのはずですが、1つも「<?php ?>」がありません。
ありますよ。自身で書いてるじゃないですか
kei344
2020/05/04 17:19
「このコードはPHPコードのはずですが、1つも「<?php ?>」がありません。」の表記が消されましたが、現在起きている問題を提示してください。「質問するときのヒント」を読んで問題課題を整理して、質問本文を改善してください。
【質問するときのヒント|teratail(テラテイル)】
https://teratail.com/help/question-tips
退会済みユーザー
2020/05/04 19:07
ありがとうございました。何とか自分で解決できました。
退会済みユーザー
2020/07/13 14:43
13章最後まで来て、7章のコードを使うところに来ました。以前質問し、解決済にしていたものを使おうとしたのですが、先送りした質問でしたので、困っています。
解決済を消して再度質問したいので、コードと質問を修正しています。
m.ts10806
2020/07/13 15:16
自己解決のままになっていますが…