kamatamaudon
@kamatamaudon

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

html php 未入力エラー

<実現したいこと>
複数入力項目がある中、未入力の場合、それぞれのテキストボックスの下にエラー表示させたい。

<困っていること>
入力項目が複数ある中、1つしかうまくエラーが表示されません。
以下にコードを貼っていますが、以下の結果になりました。
原因が分かりましたら、教えていただけますでしょうか。よろしくお願いいたします。

<結果>
・「日付」だけが未入力の場合、エラーは表示されない、ページは遷移しない。
・「種別」、「タイトル」だけが未入力の場合、エラーは表示されない、ページは遷移する。
・「内容」だけが未入力の場合、エラー表示される。ページは遷移しない。
・「内容」と他の項目が未入力だと、内容も他の項目もエラー表示されます。

if (isset($_POST['edit'])) {
$regist_date = $_POST['regist_date'];
$category = $_POST['category'];
$title = htmlspecialchars($_POST['title'], ENT_QUOTES, "UTF-8");
$content = htmlspecialchars(nl2br($_POST['content']), ENT_QUOTES, "UTF-8");
$errors = array();
    if (empty($regist_date)) {
    $errors['regits_date'] = "日付が選択されていません";
    } 
    if (empty($category)) {
    $errors['category'] = "種別が選択されていません";

    } 
   if (empty($title)) {
    $errors['title'] = "タイトルが入力されていません";
    } 
    if (empty($content)) {
    $errors['content'] = "内容が入力されていません";
    } 

    <form action="" method="post" enctype="multipart/form-data">
    <table class="form-table registration_table">
    <tbody>
    <?php if (isset($result)) { while ($row = mysqli_fetch_assoc($result)) {?>
     <tr>
      <th>投稿日</th>
      <td>
      <input type="date" name="regist_date" value="<?=$row['regist_date']?>"/>
      <?php if(isset($errors['regist_date'])) { ?>
      <?="<span class='error'>".$errors['regist_date'] ."</span>"?>
      <?php } ?>
      </td>
     </tr>
     <tr>
      <th>種別</th>
      <td>
      <select name="category" value ="<?=$row['category']?>">
      <option value="">選択してください</option>
      <?php foreach($array_category as $key =>$value){ ?>
      <option value="<?=$value?>" <?php if ($row['category'] == $value) { echo 'selected'; }?>><?=$value?></option>
      <?php }?>
      </select>
      <?php if(isset($errors['category'])) { ?>
      <?="<span class='error'>".$errors['category']."</span>"?>
      <?php } ?>
      </td>
     </tr> 
     <tr>
      <th>タイトル</th>
      <td>
      <input type="text" name="title" value="<?=$row['title']?>"/> 
      <?php if(isset($errors['title'])) { ?>
      <?="<span class='error'>".$errors['title']."</span>"?>
      <?php } ?>
      </td>
     </tr> 
     <tr>
      <th>内容</th>
      <td>
      <textarea name="content" cols="20" rows="2"><?=$row['content']?></textarea>
      <?php if(isset($errors['content'])) { ?>
      <?="<span class='error'>".$errors['content']."</span>"?>
      <?php } ?>
      </td>
     </tr>
0

2Answer

こちらのif文はきちんと閉じてないのでは?文法エラーになりませんか?

if (isset($_POST['edit'])) {

0Like

いま説明されている状況から原因を言い当てるのは難しそうです。
例えば以下の部分が不明瞭です。

  • コード全体
  • 「ページ遷移」とは、どこからどこへの事なのか
  • 画面イメージ
  • 具体的な入力値

気になるのは while ($row = mysqli_fetch_assoc($result)) とループ処理している点です。これは投稿日などの項目が1種類につき複数あることが考えられます。にも関わらずname属性や受け取り方$_POST['regist_date']からは単一であるように処理されています。よくあるトラブルとして、name属性が重複していて予期せぬ値が送信されているケースがあります。

プログラムの変数の値が具体的にどのようになっているのか、処理がどのように進んでいるのかを調べることをお勧めします。
echovar_dump関数を使うことで変数の中身を表示できます。
exitを使えば処理を途中で止めることができます。
原始的ですがこれらを活用てデバッグすることで、処理の流れを把握することができます。

0Like

Your answer might help someone💌