質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

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

バリデーション

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

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

706閲覧

配列から要素を指定して取得する方法

YYmd0525

総合スコア10

PHP

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

バリデーション

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

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/02/22 09:26

編集2020/02/23 22:25

前提・実現したいこと

PHPにてメールフォームを作っております。
あるホームページを見ながら、写経なのですが作りました。
そこで、バリデーションチェック後のエラーメッセージの表示を、
1つにまとめてするのではなく、
それぞれyour_name,email,commentでわけて取得する方法はないかと思い、質問させていただきました。

発生している問題・エラーメッセージ

PHP

1 2function validation ($data) { 3 $error = array(); 4 5 //氏名のバリデーション 6 if ( empty($data['your_name'])) { 7 $error[] = "名前は必ず入力してください"; 8 } elseif( 20 < mb_strlen($data['your_name']) ) { 9 $error[] = "名前は20文字以内で入力してください。"; 10 } 11 12 if( empty($data['email'])){ 13 $error[] = "メールアドレスは必ず入力してください"; 14 } elseif( !preg_match( '/^[0-9a-z_./?-]+@([0-9a-z-]+.)+[0-9a-z-]+$/', $data['email']) ) { 15 $error[] = "「メールアドレス」は正しい形式で入力してください。"; 16 } 17 18 if( empty($data['comment'])){ 19 $error[] = "コメントは必ず入力してください"; 20 } elseif( 10 >= mb_strlen($data['comment']) ) { 21 $error[] = "コメントは10文字以上で入力してください。"; 22 } 23 24 25 return $error; 26 }

PHP

1 <?php if( !empty($error) ): ?> 2 <?php foreach( $error as $value ): ?> 3 <?php echo $value; ?> 4 <?php endforeach; ?> 5 <?php endif; ?>

追記です↓ 20.02.24

PHP

1function validation ($data) { 2 $error = array(); 3 4 //氏名のバリデーション 5 if ( empty($data['your_name'])) { 6 $error['your_name'] = "名前は必ず入力してください"; 7 } elseif( 20 < mb_strlen($data['your_name']) ) { 8 $error['your_name'] = "名前は20文字以内で入力してください。"; 9 } 10 11 if( empty($data['email'])){ 12 $error['email'] = "メールアドレスは必ず入力してください"; 13 } elseif( !preg_match( '/^[0-9a-z_./?-]+@([0-9a-z-]+.)+[0-9a-z-]+$/', $data['email']) ) { 14 $error['email'] = "「メールアドレス」は正しい形式で入力してください。"; 15 } 16 17 if( empty($data['comment'])){ 18 $error['comment'] = "コメントは必ず入力してください"; 19 } elseif( 10 >= mb_strlen($data['comment']) ) { 20 $error['comment'] = "コメントは10文字以上で入力してください。"; 21 } 22 23 24 return $error; 25 }

HTML

1 <form method="post" action=""> 2 <p> 3 <label>お名前: 4 <?php 5 if( !empty($error) ) { 6 foreach( $error as $key => $value ) { 7 echo $error['your_name']; 8 } 9 } 10 ?> 11 <input type="text" name="your_name" value="<?php if( !empty($clean['your_name']) ) echo $clean['your_name']; ?>"> 12 </label> 13 </p> 14 <p> 15 <label>メールアドレス: 16 <?php 17 if( !empty($error) ) { 18 foreach( $error as $key => $value ) { 19 echo $error['email']; 20 } 21 } 22 ?> 23 <input type="text" name="email" value="<?php if( !empty($clean['email']) ) echo $clean['email']; ?>"> 24 </label> 25 </p> 26 <p> 27 <label>コメント: 28 <?php 29 if( !empty($error) ) { 30 foreach( $error as $key => $value ) { 31 echo $error['comment']; 32 } 33 } 34 ?> 35 <textarea name="comment" name="comment"><?php if( !empty($clean['comment']) ) echo $clean['comment']; ?></textarea> 36 </label> 37 </p> 38 <p><input type="submit" value="送信前に確認する" name="btn_confirm"></p> 39 </form>

イメージ説明

何も入力せずにsubmitすると、エラーメッセージは3回吐き出されます。
何かを入力すると、your_nameのみUndefinedが出てしまいます。

説明

この状態だと、配列errorにそれぞれ値が入力され、echo $valueで、errorの中身が書き出されます。
それを、それぞれyour_nameからのエラーですよ、emailからのエラーですよ、commentからのエラーですよ、とわけて表示させたいです。

配列のさらに元をたどる方法はあるのか、それとも別の方法でいい方法があれば教えていただきたいです。
よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

キーをつけてしまえばよいのではないでしょうか。

PHP

1$error[ 'your_name' ] = "名前は20文字以内で入力してください。";

【PHP: foreach - Manual】
https://www.php.net/manual/ja/control-structures.foreach.php

【PHP: 配列 - Manual】
https://www.php.net/manual/ja/language.types.array.php#角括弧構文で作成/修正

【[PHP] 配列・連想配列の初期化、結合、追加 - Qiita】
https://qiita.com/shuntaro_tamura/items/784cfd61f355516dfff0#キーを指定して初期化要素の追加


追記:

PHP

1<?php 2function validation($data) { 3 $error = array(); 4 //氏名のバリデーション 5 if (empty($data['your_name'])) { 6 $error['your_name'] = "名前は必ず入力してください"; 7 } 8 elseif(20 < mb_strlen($data['your_name'])) { 9 $error['your_name'] = "名前は20文字以内で入力してください。"; 10 } 11 if (empty($data['email'])) { 12 $error['email'] = "メールアドレスは必ず入力してください"; 13 } 14 elseif(!preg_match('/^[0-9a-z_./?-]+@([0-9a-z-]+.)+[0-9a-z-]+$/', $data['email'])) { 15 $error['email'] = "「メールアドレス」は正しい形式で入力してください。"; 16 } 17 if (empty($data['comment'])) { 18 $error['comment'] = "コメントは必ず入力してください"; 19 } 20 elseif(10 >= mb_strlen($data['comment'])) { 21 $error['comment'] = "コメントは10文字以上で入力してください。"; 22 } 23 return $error; 24} 25 26$error = validation([]); 27if( !empty($error) ): ?> 28<?php foreach( $error as $key=> $value ): ?> 29<?php echo $key.'//'.$value.PHP_EOL; ?> 30<?php endforeach; ?> 31<?php endif; 32```↓ 33```text 34your_name//名前は必ず入力してください 35email//メールアドレスは必ず入力してください 36comment//コメントは必ず入力してください

投稿2020/02/22 11:43

編集2020/02/23 03:09
kei344

総合スコア69366

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

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

YYmd0525

2020/02/22 23:24

ご回答ありがとうございます。 キーをつけてみて、キー付きのまま出力すると、そこに値がセットされていないとエラーになってしまいます。キーをつけてみて、その後はどのように出力すればよいでしょうか。 また、your_nameのエラーメッセージは$error1、emailのエラーメッセージを$error2、commentのエラーメッセージを$error3に、それぞれ入れる方法も試しましたが、returnで返す時にうまくいかないようです。
kei344

2020/02/23 03:04

どのように試したか、質問文にコードとエラー文を追記してください。
YYmd0525

2020/02/23 22:25

更新させていただきました。よろしくお願いいたします。
YYmd0525

2020/02/23 22:38

申し訳ありません、自分でいろいろと試したところ <form method="post" action=""> <p> <label>お名前: <?php if( !empty($error) ) { foreach( $error as $key => $value ) { if ($key === 'your_name') { echo $value; } } } ?> <input type="text" name="your_name" value="<?php if( !empty($clean['your_name']) ) echo $clean['your_name']; ?>"> </label> </p> <p> <label>メールアドレス: <?php if( !empty($error) ) { foreach( $error as $key => $value ) { if ($key === 'email') { echo $value; } } } ?> <input type="text" name="email" value="<?php if( !empty($clean['email']) ) echo $clean['email']; ?>"> </label> </p> <p> <label>コメント: <?php if( !empty($error) ) { foreach( $error as $key => $value ) { if ($key === 'comment') { echo $value; } } } ?> <textarea name="comment" name="comment"><?php if( !empty($clean['comment']) ) echo $clean['comment']; ?></textarea> </label> </p> <p><input type="submit" value="送信前に確認する" name="btn_confirm"></p> </form> 上記で解決したように思われました、、、他にやり方はありますでしょうか。
kei344

2020/02/23 23:57

> 他にやり方はありますでしょうか。 プログラムは目的に対していくつも書き方がある場合があります。配列から値を取り出してその後どう使うかは実装によるので、それに合った使い方をすればよいです。 ただ、連想配列に入っている値を取り出すだけなら下記で十分な気がします。 if ( !empty( $error[ 'comment' ] ) ) { echo $error[ 'comment' ]; }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問