🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

バリデーション

Validationとは特定の入力データが、求められた条件に当てまっているかをチェックするために使われます。

Q&A

解決済

1回答

2092閲覧

電話番号のバリデーションでNotice: Undefined indexを解消したい

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

バリデーション

Validationとは特定の入力データが、求められた条件に当てまっているかをチェックするために使われます。

0グッド

0クリップ

投稿2021/02/27 03:20

編集2021/02/27 06:42

PHPでフォームのバリデーションを実装しているのですが、電話番号とメールアドレスで下記のようなエラーが発生するので、それを解消したいです。

イメージ説明

##該当のソースコード
contact.php

<form action="confirm.php" method="POST"> <div class="mb-3"> <label>氏名</label><label class="kome">*</label><br> <div class="vali"><?php echo $errors['name']; ?></div> <input type="text" id="f-name" name="name" value="" placeholder="山田太郎"> </div> <div class="mb-3"> <label>フリガナ</label><label class="kome">*</label><br> <div class="vali"><?php echo $errors['kana']; ?></div> <input type="text" id="f-kana" name="kana" value="" placeholder="ヤマダタロウ"> </div> <div class="mb-3"> <label>電話番号</label><br> <div class="vali"><?php echo $errors['tel']; ?></div> <input type="text" id="f-tel" name="tel" value="" placeholder="09012345678"> </div> <div class="mb-3"> <label>メールアドレス</label><label class="kome">*</label><br> <div class="vali"><?php echo $errors['email']; ?></div> <input type="text" id="f-email" name="email" value="" placeholder="test@test.co.jp"> </div> <div class="f-title f-bottom"> <h3>お問い合わせ内容をご記入ください<label class="kome">*</label></h3> </div> <div class="vali"><?php echo $errors['contact']; ?></div> <div class="mb-3"> <textarea id="contact" name="contact" rows="7"></textarea> </div> <input type="hidden" name="csrf_token" value="<?php echo setToken(); ?>"> <button type="submit" class="btn" name="btn_confirm">送信</button> </form>

バリデーション

<?php $errors = []; // 名前の空欄チェック if(empty($_POST['name']) || mb_strlen($_POST['name']) > 10) { $errors['name'] = "名前は必須です。10文字以内で入力してください。"; } // $_SESSION['name'] = htmlspecialchars($_POST['name'], ENT_QUOTES, "UTF-8"); // フリガナの空欄チェック if(empty($_POST['kana']) || mb_strlen($_POST['kana']) > 10) { $errors['kana'] = "フリガナは必須です。フリガナは10文字以内で入力してください"; } // 電話番号のチェック if(isset($_POST['tel'])) { if(!preg_match("/^[0-9]+$/", $_POST['tel'])) { $errors['tel'] = "電話番号は0-9までの数字を入力してください"; } } // 正しいEmailの形式化どうか if(isset($_POST['email'])) { if(!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) { $errors['email'] = "正しいメールアドレスを指定してください"; } } // お問い合わせ内容の空欄チェック if(empty($_POST['contact'])) { $errors['contact'] = "お問い合わせ内容は必須です"; } ?>

contact.phpの100行目

<div class="vali"><?php echo $errors['tel']; ?></div>

contact.phpの105行目

<div class="vali"><?php echo $errors['email']; ?></div>

##試したこと
Notice: Undefined indexなので、バリデーションする前にif(isset($_POST['tel']))をつけたが解決できない。

お願いいたします。

追記:
問題のcontact.phpに以下を追記しましたが、バリデーションのメッセージが表示されない。

<?php if(isset($_POST['tel'])): ?> <div class="vali"><?php echo $errors['tel']; ?></div> <?php endif; ?>

さらに追記:
・バリデーションエラーのメッセージは出るが、画面上部にエラーが出力されてしまう

<?php if(isset($errors)): ?> <div class="mb-3"> <label>氏名</label><label class="kome">*</label><br> <div class="vali"><?php echo $errors['name']; ?></div> <input type="text" id="f-name" name="name" value="" placeholder="山田太郎"> </div> <div class="mb-3"> <label>フリガナ</label><label class="kome">*</label><br> <div class="vali"><?php echo $errors['kana']; ?></div> <input type="text" id="f-kana" name="kana" value="" placeholder="ヤマダタロウ"> </div> <div class="mb-3"> <label>電話番号</label><label class="kome">*</label><br> <div class="vali"><?php echo $errors['tel']; ?></div> <input type="text" id="f-tel" name="tel" value="" placeholder="09012345678"> </div> <div class="mb-3"> <label>メールアドレス</label><label class="kome">*</label><br> <div class="vali"><?php echo $errors['email']; ?></div> <input type="text" id="f-email" name="email" value="" placeholder="test@test.co.jp"> </div> <div class="f-title f-bottom"> <h3>お問い合わせ内容をご記入ください<label class="kome">*</label></h3> </div> <div class="vali"><?php echo $errors['contact']; ?></div> <div class="mb-3"> <textarea id="contact" name="contact" rows="7"></textarea> </div> <input type="hidden" name="csrf_token" value="<?php echo setToken(); ?>"> <button type="submit" class="btn" name="btn_confirm">送信</button> <?php endif; ?>
<?php $errors = []; // 名前の空欄チェック if(empty($_POST['name']) || mb_strlen($_POST['name']) > 10) { $errors['name'] = "名前は必須です。10文字以内で入力してください。"; } // $_SESSION['name'] = htmlspecialchars($_POST['name'], ENT_QUOTES, "UTF-8"); // フリガナの空欄チェック if(empty($_POST['kana']) || mb_strlen($_POST['kana']) > 10) { $errors['kana'] = "フリガナは必須です。フリガナは10文字以内で入力してください"; } // 電話番号のチェック // if(isset($_POST['email'])) { if(!preg_match("/^[0-9]+$/", $_POST['tel'])) { $errors['tel'] = "電話番号は0-9までの数字を入力してください"; } // } // 正しいEmailの形式化どうか // if(isset($_POST['email'])) { if(!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) { $errors['email'] = "正しいメールアドレスを指定してください"; } // } // お問い合わせ内容の空欄チェック if(empty($_POST['contact'])) { $errors['contact'] = "お問い合わせ内容は必須です"; } ?>

イメージ説明

ただ、 // if(isset($_POST['email'])) {のコメントアウトを外すと、画面上部にエラ〜メッセージは出力されないが、バリデーションメッセージが無効になってしまう。
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Notice: Undefined indexなので、バリデーションする前にif(isset($_POST['tel']))をつけたが解決できない。

考え方は合っていますが、問題の箇所は自身で質問文に書かれている通り

<div class="vali"><?php echo $errors['tel']; ?></div>
<div class="vali"><?php echo $errors['email']; ?></div> です

判定するならその二ヶ所です

おまけ
https://www.php.net/manual/ja/migration70.new-features.php

/* Null 合体演算子 ¶ null 合体演算子 (??) がシンタックスシュガーとして追加されました。 三項演算子と isset() を組み合わせる よくありがちなパターンを、より簡単に書くためのものです。 この演算子は、もし第一オペランドが非 null の値であればそれを返し、 そうでない場合は第二オペランドを返します。 */ // $_GET['user'] を取得します。もし存在しない場合は // 'nobody' を用います。 $username = $_GET['user'] ?? 'nobody'; // 上のコードは、次のコードと同じ意味です。 $username = isset($_GET['user']) ? $_GET['user'] : 'nobody'; // 合体演算子を連結することもできます。次のように書くと、 // $_GET['user']、$_POST['user'] そして 'nobody' // の順に調べて、非 &null; が定義されている最初の値を返します。 $username = $_GET['user'] ?? $_POST['user'] ?? 'nobody'; ?>

投稿2021/02/27 03:34

hentaiman

総合スコア6426

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/02/27 03:57

ご回答ありがとうございます。該当箇所にも追記で書いたように、判定してみましたがエラーのバリデーションがかからないです。
hentaiman

2021/02/27 03:59

$errorsを使おうとしてエラーになってるのに$_POSTのチェックしてどうすんねん
退会済みユーザー

退会済みユーザー

2021/02/27 06:26

``` <?php if(isset($errors)): ?> <div class="vali"><?php echo $errors['email']; ?></div> <?php endif; ?> ``` このように書いてみましたが、Notice: Undefined indexのままでどうしたらいいのか..
hentaiman

2021/02/27 06:39

無いのは$errorsじゃなくて$errors['email']だからね、検査するなら$errors['email'] なのでエラーもUndefined variableではなくてUndefined indexでしょう
退会済みユーザー

退会済みユーザー

2021/02/27 06:55

ありがとうございます。解決しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問