• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:PHPでエラーを元の画面にかえすには)

PHPでエラーを元の画面にかえす方法

このQ&Aのポイント
  • PHPを使用して、エラーメッセージを次の画面に遷移せずに、新規登録ボタンを押した場合に、エラー表示を入力している画面に表示する方法を教えてください。
  • また、javascriptを使用せずに実現する方法があれば、そのサンプルも教えてください。
  • 適切な入力がない場合に、エラー表示を入力フォームに表示して、ユーザに再度入力させたいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • agunuz
  • ベストアンサー率65% (288/438)
回答No.4

>重複チェックしているのなんでエラーが出るのでしょうかね? スクリプト側で重複チェックしていませんからね。必要ならinsert前にselectしてチェックしてください。 >氏名と住所が空白でも登録できてしまいます おっと、失礼。登録前のエラーチェックが抜けましたね(汗 <?php if ($_POST) { ____$errmsg = array(); ____$id = isset($_POST['ID']) ? trim($_POST['ID']) : ''; ____$name = isset($_POST['NAME']) ? trim($_POST['NAME']) : ''; ____$addr = isset($_POST['ADDR']) ? trim($_POST['ADDR']) : ''; ____if (!ctype_digit($id)) { $errmsg[] = '番号を入力してください'; } ____if ($name === '') { $errmsg[] = '名前を入力してください'; } ____if ($addr === '') { $errmsg[] = '住所を入力してください'; } ____if (count($errmsg) === 0) { ________try { ____________$pdo = new PDO('mysql:host=localhost;dbname=db_test;charset=utf8', 'root', ''); ____________$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); ____________$stmt = $pdo->prepare("INSERT INTO tbl_test VALUES(?, ?, ?)"); ____________$stmt->execute(array($id, $name, $addr)); ____________if($stmt->rowCount() > 0) { ________________header('Location: http://localhost/top.php'); ____________} else { ________________$errmsg[] = '登録出来ません'; ____________} ________} catch (PDOException $e) { ____________$errmsg[] = 'DB Error:' . $e->getMessage(); ________} ____} } header('Content-type: text/html; charset="utf-8"'); ?> <html> <head><title>新規登録</title></head> <body> <div style="margin:30px"> <form action="" method="POST"> <h2>登録画面</h2> すべての項目入力してください<br> 番号<input type="number" name="ID" value="<?= isset($id) ? $id : ''; ?>">(一覧画面にない番号を入力してください) <br> 氏名<input type="text" size="50" name="NAME" value="<?= isset($name) ? $name : ''; ?>"><br> 住所<input type="text" size="130" name="ADDR" value="<?= isset($addr) ? $addr : ''; ?>"><br> <input type="submit" value="登録する"> <a href="http://localhost/top.php"><button type="button">一覧に戻る</button></a> </form> <?php if (isset($errmsg)&&(count($errmsg) > 0)) { print '<div style="color:red">' . implode('<div>', $errmsg) . '</div>'; } ?> </div> </body> </html> #issetをemptyにしてもダメでしょww

noname#197690
質問者

お礼

ありがとうございます 無事やりたい操作ができました

その他の回答 (3)

  • agunuz
  • ベストアンサー率65% (288/438)
回答No.3

サンプル(行頭のタブをアンダースコア4つに置換しています) <?php if ($_POST) { ____$errmsg = array(); ____$id = isset($_POST['ID']) ? trim($_POST['ID']) : ''; ____$name = isset($_POST['NAME']) ? trim($_POST['NAME']) : ''; ____$addr = isset($_POST['ADDR']) ? trim($_POST['ADDR']) : ''; ____if (!ctype_digit($id)) { $errmsg[] = '番号を入力してください'; } ____if ($name === '') { $errmsg[] = '名前を入力してください'; } ____if ($addr === '') { $errmsg[] = '住所を入力してください'; } ____try { ________$pdo = new PDO('mysql:host=localhost;dbname=db_test;charset=utf8', 'root', ''); ________$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); ________$stmt = $pdo->prepare("INSERT INTO tbl_test VALUES(?, ?, ?)"); ________$stmt->execute(array($id, $name, $addr)); ________if($stmt->rowCount() > 0) { ____________header('Location: http://localhost/top.php'); ________} else { ____________$errmsg[] = '登録出来ません'; ________} ____} catch (PDOException $e) { ________$errmsg[] = 'DB Error:' . $e->getMessage(); ____} } header('Content-type: text/html; charset="utf-8"'); ?> <html> <head><title>新規登録</title></head> <body> <div style="margin:30px"> <form action="" method="POST"> <h2>登録画面</h2> すべての項目入力してください<br> 番号<input type="number" name="ID" value="<?= isset($id) ? $id : ''; ?>">(一覧画面にない番号を入力してください) <br> 氏名<input type="text" size="50" name="NAME" value="<?= isset($name) ? $name : ''; ?>"><br> 住所<input type="text" size="130" name="ADDR" value="<?= isset($addr) ? $addr : ''; ?>"><br> <input type="submit" value="登録する"> <a href="http://localhost/top.php"><button type="button">一覧に戻る</button></a> </form> <?php if (isset($errmsg)&&(count($errmsg) > 0)) { print '<div style="color:red">' . implode('<div>', $errmsg) . '</div>'; } ?> </div> </body> </html>

noname#197690
質問者

お礼

ありがとうございます。 参考にいたします DB Error:SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '1' for key 'PRIMARY' と主キーが被ってますって意味ですよね? 重複チェックしているのなんでエラーが出るのでしょうかね?

noname#197690
質問者

補足

また番号がかぶってなかったら氏名と住所が空白でも登録できてしまいます issetをemptyに変更すればできますかね

  • agunuz
  • ベストアンサー率65% (288/438)
回答No.2

>下記がインセプトphpなのですが インセプトとは何でしょうか? >一緒にするということですか そうです(ANo.1がそう読み取れなかったらすみません)。

noname#197690
質問者

お礼

すいません!insert.phpでフォームの送り先です。 勉強不足ですいません。 どう一緒にわからなくって 少し自分のプログラムでサンプル書いていただけないですか?

noname#197690
質問者

補足

また番号がかぶってなかったら氏名と住所が空白でも登録できてしまいますといいましたがやっぱり空白だったらできないです DB Error:SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '1' for key 'PRIMARY' が出ます 出ない方法ありますか?

  • agunuz
  • ベストアンサー率65% (288/438)
回答No.1

一番手っ取り早いのは ><form action = "insert.php" method = "POST"> actionを自分自身にすること。 で、スクリプトの動作自体をPOSTの有無で分ける <?php if ($_POST) { // POSTされたデータの処理 // エラーがあったら、$errmsgに格納 if (!isset($errmsg)) { // エラーがなかったら ?> 処理したあとで表示するhtmlソース <?php exit; } // end of isset($errmsg) } // end of POST 入力フォームのhtmlソース(1) <?php // 適当な位置にメッセージ表示を挟む if (isset($errmsg)) { print '<div style="color:red">' . $errmsg . '</div>'; } ?> 入力フォームのhtmlソース(2)

noname#197690
質問者

お礼

返信ありがとうございます 下記がインセプトphpなのですが一緒にするということですか <?php $err = ""; if(empty($_POST['ID'])) $err.= "<br><br>番号入力してください。<br><br>"; if(empty($_POST['NAME'])) $err.= "<br><br>氏名入力してください。<br><br>"; if(empty($_POST['ADDR'])) $err.= "<br><br>住所を入力してください。<br><br>"; if(empty($err)) { $pdo = new PDO("mysql:dbname=db_test;host=localhost", "root", "admin"); $st = $pdo->prepare("INSERT INTO tbl_test VALUES(?,?,?)"); $st->execute(array($_POST['ID'], $_POST['NAME'],$_POST['ADDR'])); if($st->rowCount()>0) { header('Location: http://localhost/top.php'); }else{ print "既に登録している番号です"; } } echo $err; ?>

関連するQ&A

専門家に質問してみよう