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

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

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

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

14418閲覧

PHPの入力チェックでエラーメッセージを画面遷移させずに表示させたい

hj_petricall

総合スコア2

foreach

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2020/06/24 05:52

編集2020/06/24 12:16

前提・実現したいこと

PHP、HTML、mysqlを使用し社員の情報の登録を行うページを作っています。
その際、入力チェックを行うのですが、エラーの際は画面遷移させずに上のほうに
エラーメッセージを表示させ、すべて内容がokな場合は登録完了のページに飛ぶようにしたいです。

今回の条件
・入力値が空欄、未選択の場合(空白スペースもエラー)に画面遷移させずに、上記のほうに先頭に「・」付きの赤字でエラーを出したい

・すべての項目がokの場合は「add.php」(登録完了用の画面)に値を渡して画面遷移(登録完了画面は作成済み)

・ファイルはすべて同じフォルダにある

・エラー時に入力した値は保持する

・赤字はcssを用意(これはわかるので大丈夫)

補足
・ブートストラップはまだシートを当てただけで実装はしてないです。
・赤字は別にCSSを作成します

form.php

PHP

1 2<? 3// 初期化 4$error = array(); 5 6// エラーメッセージ 7if($_POST['employee_num'] === "") 8{ 9 $error[] = "社員番号は必ず入力してください。"; 10} 11if($_POST['employee_name'] === "") 12{ 13 $error[] = "氏名は必ず入力してください。"; 14} 15if($_POST['sexual'] === "") 16{ 17 $error[] = "性別が選択されていません。"; 18} 19 20if($_POST['department'] === "") 21{ 22 $error[] = "所属部署が選択されていません。"; 23} 24 25if($_POST['phone_num'] === "") 26{ 27 $error[] = "電話番号は必ず入力してください。"; 28} 29if($_POST['street'] === "") 30{ 31 $error[] = "住所は必ず入力してください。"; 32} 33?> 34 35 36<!DOCTYPE html> 37<html lang = "ja"> 38<head> 39<meta charset="UTF-8"> 40<title>新規登録画面</title> 41<link rel="stylesheet" href="../css/bootstrap.css"> 42</head> 43<body> 44<h2>新規登録</h2> 45 46// ↓ここから 47<?php 48if(isset($_POST['send'])) 49{ 50 if(isset($error)) 51 { 52?> 53 <ul class="error_message"> 54 <?php 55 foreach($error as $value) 56 { 57 echo $value."<br>"; 58 } 59 } 60 ?> 61 </ul> 62} 63// ↑↑ここまでがエラーメッセージ表示枠 64 65// ここからフォーム画面 66 <form method="POST" action="add.php"> 67 <p> 68 社員番号: 69 <input type="number" min="1" max="9999" name="employee_num"> 70 </p> 71 <p> 72 氏名: 73 <input type="text" name="employee_name"> 74 </p> 75 <p> 76 性別 77 <select name = "sexual"> 78 <option value="">-</option> 79 <option value="1"></option> 80 <option value="2"></option> 81 </select> 82 </p> 83 <p> 84 所属部署: 85 <select name="department"> 86 <option value="" hidden>選択してください</option> 87 <option value="1">システム部</option> 88 <option value="2">営業部</option> 89 <option value="3">総務部</option> 90 </select> 91 </p> 92 <p> 93 生年月日: 94 <?php 95 echo '<select name="year">'. "\n"; 96 $start = date('Y'); 97 $end = date('Y') - 100; 98 for($i = $start; $i >= $end; $i--) 99 { 100 echo '<option value="' .$i . '">' . $i .'</option>'. "\n"; 101 } 102 echo '</select>年' . "\n"; 103 echo '<select name="month">' . "\n"; 104 for ($i = 1; $i <= 12; $i++) 105 { 106 echo '<option value="' .$i . '">' . $i .'</option>'. "\n"; 107 } 108 echo '</select>月' . "\n"; 109 echo '<select name="day">' . "\n"; 110 for ($i = 1; $i <= 31; $i++) 111 { 112 echo '<option value="' .$i . '">' . $i .'</option>'. "\n"; 113 } 114 echo '</select>日' . "\n"; 115 ?> 116 </p> 117 <p> 118 電話番号: 119 <input type="text" name="phone_num" onKeyup="this.value=this.value.replace(/[^0-9]+/,'')"> 120 </p> 121 <p> 122 住所: 123 <input type = "text" name="street"> 124 </p> 125 <input type="submit" name="send" value="登録"> 126 </form> 127</body> 128</html>

###add.php

PHP

1<?php 2 3$employee_num = (int)$_POST['employee_num']; 4$employee_name = $_POST['employee_name']; 5$sexual = (int)$_POST['sexual']; 6$department = (int) $_POST['department']; 7$year = $_POST['year']; 8$month = $_POST['month']; 9$day = $_POST['day']; 10$select_month = sprintf('%02d', $month); 11$select_day = sprintf('%02d', $day); 12$total = $year.$select_month.$select_day; 13$birthday = date("Y-m-d",strtotime($total)); 14$phone_num = $_POST['phone_num']; 15$street = $_POST['street']; 16 17 18require_once '\MAMP\db_config.php'; 19try 20{ 21 // DB接続 22 $dbh = new PDO('mysql:host=localhost;dbname=employee_db;charset=utf8', $user, $pass); 23 $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 24 $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 25 $sql = "INSERT INTO employee (employee_num, employee_name, sexual, department, birthday, phone_num, street) VALUES (?, ?, ?, ?, ?, ?, ?)"; 26 $stmt = $dbh->prepare($sql); 27 $stmt->bindValue(1, $employee_num, PDO::PARAM_INT); 28 $stmt->bindValue(2, $employee_name, PDO::PARAM_STR); 29 $stmt->bindValue(3, $sexual, PDO::PARAM_INT); 30 $stmt->bindValue(4, $department, PDO::PARAM_INT); 31 $stmt->bindValue(5, $birthday, PDO::PARAM_STR); 32 $stmt->bindValue(6, $phone_num, PDO::PARAM_STR); 33 $stmt->bindValue(7, $street, PDO::PARAM_STR); 34 $stmt->execute(); 35 $dbh = null; 36 37 echo "社員の登録が完了しました。<br>"; 38 echo "<a href='index.php'>トップページへ戻る</a>"; 39} 40catch(Exception $e) 41{ 42 echo "エラー発生: " . htmlspecialchars($e->getMessage(), ENT_QUOTES, 'UTF-8') . "<br>"; 43 die(); 44}

試したこと

登録ボタンが押されたとき、$errorに格納されていればforeachで格納されているメッセージを吐き出すというところまでの理解まではできているのですが、実装の部分でつまっています。
現状の実装状況を記述しましたので、どのように実装すればよいのかコード等でご教示いただければ幸いです。。

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーの際は画面遷移させずに

JavaScript使わないと無理です。

質問文の内容から鑑みた挙動を見る限りでは、
formactionが同ページを指しているようなので、
同ページなら、遷移走っても、見え方的に問題ないのでは?
と思いますが。

コードの追記に対しての回答

まず、前者のコードが、form.php
後者のコードがadd.phpとして回答しますと、
処理の流れが、下記のようになっていますので、

form.phpにて入力と送信 → add.phpにPOSTして遷移 → DBに情報登録

となっています。
よって、なんぼform.phpでエラーチェックを入れようが何かろうが、送信時にはもうform.phpからは離れていますので、無駄になります。
なので、add.phpに、入力チェックを入れ、エラーがあれば、form.phpに遷移、
エラーが無ければ、DBに情報登録の上、成功時に完了ページに遷移との処理に変えましょう。

かもしくは、回答冒頭にもあります、JavaScriptをうまく使うしかないかと。

もし、何かネットで拾ってきたコードをそのままコピペしてるだけなら、
それにしては、初心者が、理解しないでやるのは、危ない処理(特にDBに登録の部分)になっているので、
コードは弄りつつも、しっかり処理の流れ追いながら、HTML、PHPの仕様を学習しましょう。

投稿2020/06/24 07:13

編集2020/06/25 01:16
miyabi_takatsuk

総合スコア9528

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

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

javahack

2020/06/24 08:00

別ページに移動した場合のみ「画面遷移」と認識しているかも。
hj_petricall

2020/06/24 10:29

確かにこのコードだとactionがadd.phpになってるので入力情報が送信ボタンを押した際にadd.phpに渡されるのですが、エラーがないときだけadd.phpに移動してエラーがあるときはこのform.php(フォーム画面)の上のところにエラーを出せるようにしたいのです…。 条件分岐をいじったりしてるのですがなかなかどうもうまく動いてくれなくて八方塞がりです…。 どうかお知恵を拝借できないでしょうか…。
miyabi_takatsuk

2020/06/24 11:01 編集

ん? このコードは、form.phpというファイルなのですか? であれば話変わってきますよ。 add.phpにpostしちゃったら、add.phpの方で、入力チェックしないと、戻す処理とか、次に遷移させるとかできませんよ。 add.phpが別なら、add.phpの内容も記載して下さい。 質問本文に 基本的に、formはactionで指定したパスに遷移を行います。送信内容付きで。 なので、その仕組みを理解していないと正しい構築はできません。
miyabi_takatsuk

2020/06/24 11:02

javahackさんのご指摘がドンピシャな気がしてきました 汗
hj_petricall

2020/06/24 12:59 編集

質問のほうにadd.phpとform.phpを分けて記載しました。 まだプログラム初心者でいろいろと説明不足が多く申し訳ないです。。。 add.php側で入力チェックするんですね... add.phpで渡った値が不正な値だった場合にform.phpに差し戻されるという認識で宜しいでしょうか、、、?
miyabi_takatsuk

2020/06/24 13:21 編集

> add.php側で入力チェックするんですね... いや、だから、そうせざるを得ない作りをしてしまっているのは質問者さんです。 とかく、actionに指定したパスに遷移が発生するので、今回の場合は、add.phpが指定されているので、遷移先で様々やるしかないですよ、ってことです。つまり、送信した時点で、 form.phpを離れてしまっているので、form.phpではなんもできないですよ、ってことです。 > add.phpで渡った値が不正な値だった場合にform.phpに差し戻されるという認識で宜しいでしょうか、、、? 知りません。 add.phpにそういう処理を書いているならそうなります。 見る限りそのようには全くなっていません。
miyabi_takatsuk

2020/06/24 13:19 編集

あの、これもしや、質問者さんが書いたんじゃなくて、どっかから引っ張ってきたコードってことですか? だったらどうりで話合わないわけですね。 そうだったら、そのように書かないと、解決に向けた回答は得られませんよ。 なぜなら、プログラムは書いた本人が一番理解してるものなので。 今回の質問の仕方だと、理解もしてない(自分で書いてない)コードでする質問ではないです。 (せめて、拾ったコードだからわからない、くらいは記載ないと、第三者は勘違いする)
hj_petricall

2020/06/25 01:26

親切な解説ありがとうございます。 miyabi_takatsukさんの解説の通り、入力チェックと登録を分けようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問