php

500エラー直った!……のに警告?「Undefined array key」って何?

前回、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サイトを作るなら知っておきたい、安全に文字を表示する方法へ進みます。

☆ この授業をあとで見返す

学生登録(無料)すると、お気に入りに保存できます。授業は登録しなくても読めます。

☆ この授業をあとで見返す

学生登録(無料)すると、お気に入りに保存できます。授業は登録しなくても読めます。