前回、AIに書いてもらったPHPコードを追加したところ、突然の HTTP ERROR 500。
原因は、たった1つの ; の付け忘れでした。
では、セミコロンを追加してもう一度ページを開いてみましょう。
<?php
$name = $_POST['name'];
if ($name) {
echo "こんにちは、" . $name . "さん";
}
今度はページが表示されました。
よし、直った!
……と思ったら。
画面に、こんな警告が表示されることがあります。
Warning: Undefined array key "name"
500エラーを直したばかりなのに、今度は何だこれ?
今回は、この Undefined array key を追いかけてみましょう。
まず確認。今回は「500エラー」ではない
前回とは、少し状況が違います。
前回のコードには、
$name = $_POST['name']
と、最後の ; がありませんでした。
PHPの文法そのものに問題があったため、処理を続けられず、環境によってはHTTP ERROR 500になってしまいます。
今回は、
$name = $_POST['name'];
と、文法上は正しくなっています。
実際、ページそのものは表示されています。
でも、
Warning: Undefined array key "name"
という警告が出ている。
つまり、
PHPそのものが完全に止まっているわけではない。何か別の問題が起きている。
ということです。
ここで大切なのは、英語の警告を見てすぐ諦めないこと。
エラーメッセージは、原因を探すためのヒントです。
分からないエラーは、そのままAIに聞いていい
せっかくエラーメッセージが出ているので、そのままAIに渡してみましょう。
ただし、
PHPが動きません。直してください。
だけでは、少しもったいない。
今回なら、
PHPで
Warning: Undefined array key "name"
と表示されました。
初心者にも分かるように、この警告が何を意味しているのか教えてください。
これだけでも、かなり具体的な回答を得られます。
おそらくAIは、
$_POSTの中にnameというキーが存在しない状態で、$_POST['name']を読み込もうとしています。
というような説明をしてくれるでしょう。
……。
キー?
また知らない言葉が出てきました。
でも大丈夫。
全部覚える必要はありません。
今回必要なところだけ見ていきましょう。
$_POST['name'] は何をしている?
問題になっているのは、この部分です。
$name = $_POST['name'];
前回は、
フォームか何かから送られてきた「名前」を受け取っているっぽい。
ここまで分かれば合格でした。
今回は、もう一歩だけ進んでみましょう。
たとえば、こんなフォームがあったとします。
<form method="post">
<input type="text" name="name">
<button type="submit">送信</button>
</form>
入力欄に、
みのり
と入力して「送信」を押します。
するとPHP側では、送られてきたデータを $_POST から受け取ることができます。
今回の、
$_POST['name']
なら、
送られてきたデータの中から「name」を取り出す
くらいに考えてください。
だから、
$name = $_POST['name'];
は、
送られてきた
nameの値を$nameに入れる
という処理です。
少しコードが読めるようになってきました。
では、なぜ警告が出た?
ここで問題です。
まだフォームから何も送信していない状態で、ページを開いたらどうなるでしょう?
PHPは、
$_POST['name']
を見て、送られてきたデータの中から name を探します。
ところが、まだフォームは送信されていません。
当然、name もありません。
それなのに、
nameの値を取り出して!
と命令されているわけです。
その結果、
Warning: Undefined array key "name"
という警告が出ます。
かなりざっくり日本語にすると、
「nameっていうデータを取りに行ったけど、まだ無いよ!」
くらいでOKです。
今日の合格ライン
今日覚えて帰ってほしいのは、これだけです。
$_POST['name']は、フォームなどから送られてきたnameの値を取り出している。
そして、
まだ
nameが送られていないのに取り出そうとすると、警告が出ることがある。
ここまで分かれば合格です。
$_POST の細かい仕組みを暗記する必要はありません。
必要になったら、また調べればいいんです。
では、どう直せばいい?
原因が分かったので、今度はAIにこう聞いてみましょう。
nameがまだ送信されていないときには、警告を出さないようにしたいです。初心者にも分かる方法を教えてください。
すると、こんなコードを提案されるかもしれません。
$name = $_POST['name'] ?? '';
……。
また知らない記号が増えました。
??
です。
でも、これも今は難しく考えなくて大丈夫。
?? は、
左側に値がなかったら、右側を使ってね
くらいに考えてください。
つまり、
$_POST['name'] ?? ''
なら、
nameがあれば、その値を使う。nameがなければ、空っぽの文字''を使う。
という感じです。
これなら、まだフォームが送信されていなくても、
$name = '';
という状態になるので、先ほどの警告を避けられます。
「POSTされたときだけ動かす」という方法もある
もう少し進めると、こんなコードをAIが提案してくることもあります。
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$name = $_POST['name'] ?? '';
if ($name !== '') {
echo 'こんにちは、' . $name . 'さん';
}
}
急に難しくなったように見えます。
でも、一行ずつ見れば大丈夫です。
まず、
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
これは、
POSTで送信されたときだけ、この中を動かす
くらいでOK。
次に、
$name = $_POST['name'] ?? '';
は、さっきやりました。
nameがあれば受け取る。なければ空にする。
そして、
if ($name !== '') {
は、
名前が空っぽじゃなかったら
最後に、
echo 'こんにちは、' . $name . 'さん';
で、
「こんにちは、○○さん」と表示する。
こうやって一行ずつ見てみると、
「なんとなく何をしているコードなのか」
が見えてきませんか?
それで十分です。
AI時代の「コードが読める」は、全部暗記することじゃない
今回出てきた、
$name = $_POST['name'] ?? '';
これを暗記する必要はありません。
忘れたら、またAIに聞けばいい。
大切なのは、このコードを見たとき、
「フォームからnameを受け取ろうとしているのかな」
と推測できることです。
それだけでも、AIへの質問が変わります。
たとえば、
「動かない!直して!」
ではなく、
「フォームからnameを受け取っている部分だと思うのですが、送信前に警告が出ます。どう直せばいいですか?」
と聞けるようになります。
この差は大きいです。
AIを使わないことが勉強ではありません。
AIに相談しながら、
「何が起きているのか」を少しずつ理解できるようになる。
それが、オコジョキャンパスで目指しているところです。
ワンポイント:Warningは公開サイトに出していいの?
今回のようなPHPの警告は、開発中にはとても役立ちます。
どこで何が起きているのかを教えてくれるからです。
ただし、実際に公開しているWebサイトでPHPの警告やエラーをそのまま訪問者に表示するのはおすすめできません。
エラー内容によっては、ファイル名やサーバー内部のパスなど、外部に見せる必要のない情報まで表示される場合があります。
今は、
開発中 → エラーは原因を探す大事な手掛かり
公開中 → 訪問者にはなるべく見せない
くらい覚えておけばOKです。
エラー表示やログについては、また別の授業で詳しく扱いましょう。
これで完成……ではありません
さて。
警告も消えました。
フォームに名前を入力して送信すると、
こんにちは、みのりさん
と表示されました。
今度こそ完成!
……と言いたいところですが、実はまだ気になる部分があります。
現在のコードは、
フォームに入力された文字を、そのまま画面に表示しています。
普通の名前なら問題なさそうです。
では――
名前ではなく、HTMLのような文字を入力されたらどうなるのでしょう?
次回は、
入力された文字をそのまま表示して大丈夫?
htmlspecialchars()って何?
Webサイトを作るなら知っておきたい、安全に文字を表示する方法へ進みます。
