yopisan
@yopisan (kota)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

お問い合わせフォームのとDBの挿入がうまくいかない

お問い合わせフォームからデータを送信し、送信されたデータの中身を確認したときにnullで表示されてしまう。

DB上での結果

制約

phpmyadminでの制約

phpmyadminでの制約設定後のcomplete.php

該当するソースコード

contact.php
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title></title>
  <link rel="stylesheet" type="text/css" href="base.css">
  <meta name="viewport" content="width=device-width,initial-scale=1">
  <link href="https://use.fontawesome.com/releases/v5.6.1/css/all.css" rel="stylesheet">
  <script type="text/javascript" src="index.js"></script>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
</head>
<body>

    <?php include 'layouts/header.php'; ?>
    <?php  session_start() ?>
    <div class="form-wrapper">
      <div class="error">
        <h1>
          <?php 
            if(isset($_SESSION["texts"])){
            foreach($_SESSION["texts"] as $error){
              echo $error."<br>";
              }
            }?>
        </h1>
      </div>        
      <div class="form">
        <div class="form-title">
          <h1 style="text-align:center;">お問い合わせ </h1>
        </div>
        <div class="form-main">
          <div class="back">  
            <h2>下記の項目をご記入の上送信ボタンを押してください</h2>
          </div>  
            <p>送信頂いた件につきましては、当社より折り返しご連絡を差し上げます。<br>
               なお、ご連絡までに、お時間を頂く場合もございますので予めご了承ください。<br>
            <span>*</span>は必須項目となります。</p>
            <form action="" method="POST">
              <div class="form-contents">
                <div class="form-content">
                  <h3>氏名<span>*</span></h3>
                  <input type="text" name="name" 
                    value="<?php 
                      if(!empty($_SESSION["name"])){
                        echo $_SESSION["name"];
                      }
                      ?>" placeholder="山田太郎" class="inputName">
                </div>
                <div class="form-content">
                  <h3>フリガナ<span>*</span></h3>
                  <input type="text" name="kana" 
                    value="<?php 
                      if(!empty($_SESSION["kana"])){
                        echo $_SESSION["kana"];
                      }
                      ?>" placeholder="ヤマダタロウ" class="inputKana">
                </div>
                <div class="form-content">
                  <h3>電話番号</h3>
                  <input type="text" name="phone" 
                  value="<?php 
                   if(!empty($_SESSION["phone"])){
                    echo $_SESSION["phone"];
                  }
                  ?>" placeholder="09012345678" class="inputPhone">
                </div>
                <div class="form-content">
                  <h3>メールアドレス<span>*</span></h3>
                  <input type="text" name="address"
                    value="<?php 
                    if(!empty($_SESSION["address"])){
                      echo $_SESSION["address"];
                    }
                    ?>" placeholder="test@test.co.jp" class="inputAddress">
                </div>
              </div>
              <div class="back">  
                <h2>お問い合わせ内容をご記入ください<span>*</span></h2>
              </div>  
              <textarea name="question" class="inputQuestion"><?php 
                if(!empty($_SESSION["question"])){
                  echo $_SESSION["question"];
                }?></textarea><br>
              <input type="submit" value="送    信" class="form-submit" formaction="validate.php" >
            </form>
           
          </div>
        </div>
       
    </div>

    <section id=db>
        <?php
        //DB接続
        include "db_open.php";

        try {
            $conn = db_open();
            $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

            $sql = "SELECT * FROM cafe.contacts";
            $stmt = $conn->prepare($sql);
            $stmt->execute();
        } catch (PDOException $Exception) {
            die('接続エラー:' . $Exception->getMessage());
        }
        ?>

        <table>
            <tr>
                <th>システムID</th>
                <th>氏名</th>
                <th>フリガナ</th>
                <th>電話番号</th>
                <th>メールアドレス</th>
                <th>お問い合わせ</th>
                <th>送信日時</th>
            </tr>

            <?php
            $row = filter_input_array(INPUT_POST, FILTER_SANITIZE_FULL_SPECIAL_CHARS);
            while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
            ?>

                <tr>
                    <td><?= $row['id'] ?></td>
                    <td><?= $row['name'] ?></td>
                    <td><?= $row['kana'] ?></td>
                    <td><?= $row['phone'] ?></td>
                    <td><?= $row['address'] ?></td>
                    <td><?= nl2br($row['question']) ?></td>
                    <td><?= $row['created_at'] ?></td>
                    <td><a href="edit.php? id=<?php echo (int)$row['id']; ?>">編集</a></th>
                    <td><a href="dele.php? id=<?php echo (int) $row['id']; ?>" onclick="return confirm('本当に削除しますか?')">削除</a></td>
                </tr>
 
            <?php
           }
            $pdh = null;
            ?>

        </table>

    </section>

    <?php include 'layouts/footer.php'; ?>
    <!-- <script type="text/javascript" src="index.js"></script>
     <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script> -->

</body>
</html>

該当するソースコード

confirm.php
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title></title>
  <link rel="stylesheet" type="text/css" href="base.css">
  <meta name="viewport" content="width=device-width,initial-scale=1">
  <link href="https://use.fontawesome.com/releases/v5.6.1/css/all.css" rel="stylesheet">
  <script type="text/javascript" src="index.js"></script>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
</head>
<body>
<?php
  session_start();
  $referer = $_SERVER['HTTP_REFERER']; 
  $url = "contact.php"; 
  if(!strstr($referer,$url)){
    header("Location: contact.php");
    exit;
  }
  unset($_SESSION["texts"]);
    $_POST = $_SESSION;
?>


    <?php include 'layouts/header.php'; ?>

    <div class="form-wrapper">
      <div class="form">
        <div class="form-title">
          <h1 style="text-align:center;">お問い合わせ</h1>
        </div>
      <div class="confirm-group">
        <form>
          <p class=confirm-text>
            下記の内容をご確認の上送信ボタンを押してください<br>
            内容を訂正する場合は戻るを押してください。
          </p>

          <div class="confirm-contents">
            <div class="confirm-content">
              <h1>氏名</h1>
              <h2><?php echo htmlspecialchars($_POST["name"], ENT_QUOTES, 'UTF-8'); ?></h2>
            </div>
            <div class="confirm-content">
              <h1>フリガナ</h1>
              <h2><?php echo htmlspecialchars($_POST["kana"], ENT_QUOTES, 'UTF-8');  ?></h2>
            </div>
            <div class="confirm-content">
              <h1>電話番号</h1>
              <h2><?php echo htmlspecialchars($_POST["phone"], ENT_QUOTES, 'UTF-8'); ?></h2>
            </div>
            <div class="confirm-content">
              <h1>メールアドレス</h1>
              <h2><?php echo htmlspecialchars($_POST["address"], ENT_QUOTES, 'UTF-8'); ?></h2>
            </div>
            <div class="confirm-content">
              <h1>お問い合わせ内容</h1>
              <h2><?php echo nl2br(htmlspecialchars($_POST["question"], ENT_QUOTES, 'UTF-8')); ?></h2>
            </div>
          </div>
          <div class="buttons">
            <input type="submit" value="送   信" class="confirm-submit" formaction="complete.php">
            <input type="submit" value="戻   る" class="confirm-return" formaction="contact.php">
          </div>
        </form>
      </div>
    </div>
  </div>
    <?php include 'layouts/footer.php'; ?>
 <script type="text/javascript" src="index.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
</body>
</html>

該当するソースコード

complete.php
<?php
  session_start(); 
   $referer = $_SERVER['HTTP_REFERER']; 
   $url = "confirm.php";
   if(!strstr($referer,$url)){
     header("Location: contact.php");
   exit;
   }
   $post = $_SESSION['form'];
  
   session_destroy();
 
  include "db_open.php";

try {
  $dbh = db_open();
  $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

  $sql = "INSERT INTO contacts (name,kana,phone,address,question)
  VALUES (:name, :kana, :phone, :address, :question)";

  $stmt = $dbh->prepare($sql);
  $stmt->bindParam(":name", $post['name'], PDO::PARAM_STR);
  $stmt->bindParam(":kana", $post['kana'], PDO::PARAM_STR);
  $stmt->bindParam(":phone", $post['phone'], PDO::PARAM_STR);
  $stmt->bindParam(":address", $post['address'], PDO::PARAM_STR);
  $stmt->bindParam(":question", $post['question'], PDO::PARAM_STR);

  $stmt->execute();
} catch (PDOException $e) {
  echo '接続失敗' . $e->getMessage();
  exit();
}
?>
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title></title>
  <link rel="stylesheet" type="text/css" href="base.css">
  <meta name="viewport" content="width=device-width,initial-scale=1">
  <link href="https://use.fontawesome.com/releases/v5.6.1/css/all.css" rel="stylesheet">
  <script type="text/javascript" src="index.js"></script>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
</head>
<body>

  <?php include 'layouts/header.php'; ?>

  <section>
    <div class="form" style= "margin-top:50px; margin-bottom:50px;">
      <div class="form-title">
        <h1 style="text-align:center;">お問い合わせ</h1>
      </div>
      <form action=""method="post">
        <div class="complete-main">
            <p class=complete-text>
              お問い合わせ頂きありがとうございます。<br>
              送信頂いた件につきましては、当社より折り返しご連絡を差し上げます。<br>
              なお、ご連絡までに、お時間を頂く場合もございますので予めご了承ください。
            </p>
          <div class="top">
            <a href="index.php">トップへ戻る</a>
          </div>
      </form>
    </div>
  </div>
  </section>

<?php include 'layouts/footer.php'; ?>
<script type="text/javascript" src="index.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
</body>
</html>


データベース設定

該当するソースコード

db_open.php
<?php
function db_open() :PDO{
  $db='mysql:dbname=cafe;host=localhost;charset=utf8';
  $db_user='php_user';
  $db_password='ykb02566';
  $db_opt=[
    PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_EMULATE_PREPARES=>false,
  ];
  $dbh = new PDO($db,$db_user,$db_password,$db_opt);
    return $dbh;
}
?>

該当するソースコード

db_connection.php
<?php
//セッション接続
session_start();

$post = $_SESSION['form'];
// var_dump ($post);
$id = $post['id'];
$name = $post['name'];
$kana = $post['kana'];
$phone = $post['phone'];
$address = $post['address'];
$question = $post['question'];
//URLからの接続禁止
$referer = $_SERVER['HTTP_REFERER'];
$url = "edit.php";
if (!strstr($referer, $url)) {
  header("Location: contact.php");
  exit;
}

session_destroy();
//DB接続
include "db_open.php";
$dbh = db_open();
//更新
$sql = "UPDATE contacts
       SET name=:name,kana=:kana,phone=:phone,address=:address,question=:question
      -- SET name='坂本',kana='サカモト',phone='098932535',address='sakamoto@sakamorto',question='コンニチは';
       Where id=:id";

try {
  $stmt = $dbh->prepare($sql);
  $stmt->bindValue(":name", $name, PDO::PARAM_STR);
   $stmt->bindValue(":kana", $kana, PDO::PARAM_STR);
   $stmt->bindValue(":phone", $phone, PDO::PARAM_STR);
   $stmt->bindValue(":address", $address, PDO::PARAM_STR);
   $stmt->bindValue(":question", $question, PDO::PARAM_STR);
   $stmt->bindValue(":id", $id, PDO::PARAM_INT);
   $stmt->execute();
 

  echo "データが更新されました。" . "<br/>";
  echo "<a href='contact.php'>お問い合わせページに戻る</a>";
} catch (Exception $e) {
  echo "エラーが発生しました:" . ($e->getMessage()) . "<br>";
  exit;
}
?>

<!DOCTYPE html>
<html lang="ja" dir="ltr">

<head>
  <meta charset="utf-8">
  <title>Lesson Sample Site</title>
</head>

<body>
</body>

</html>

該当するソースコード

validate.php
<?php
session_start();
foreach($_POST as $key => $val){
    $_SESSION[$key] = $val;   
}

    $error = 0;
    $errorText = [];

    if(empty($_SESSION["name"])) {
        array_push($errorText,"名前を入力してください。");
        $error++;
    };


    if(mb_strlen($_SESSION["name"]) >10) {
        array_push($errorText,"名前は10文字以内で入力してください。");
        $error++;
    };

    if(empty($_SESSION["kana"])) {
        array_push($errorText,"フリガナを入力してください。");
        $error++;
    };
    
    if(mb_strlen($_SESSION["kana"]) > 10) {
        array_push($errorText,"フリガナは10文字以内で入力してください。");
        $error++;
    };
    
    if(is_numeric($_SESSION["phone"]) == false && $_SESSION["phone"] !="") {
        array_push($errorText,"電話番号は0~9の数字で入力してください。");
        $error++;
    };

    if(empty($_SESSION["address"])) {
        array_push($errorText,"メールアドレスを入力してください。");
        $error++;
    };
    
    if(!empty($_SESSION["address"]) && !preg_match("/.@./",$_SESSION["address"])) {
        array_push($errorText,"正しいメールアドレスを入力してください。");
        $error++;
    };

    if(empty($_SESSION["question"])) {
        array_push($errorText,"お問い合わせ内容を入力してください。");
        $error++;
    };

    if($error == 0 ){
        header("Location:confirm.php");
    } else {
        unset($_SESSION["texts"]);
        foreach($errorText as $text){
            $_SESSION["texts"][] = $text;
        }
        header("Location:contact.php");
    }
?>


### 該当するソースコード
```edit.php
<?php
session_cache_limiter('none');
//セッション接続
session_start();

$err['name'] = '';
$err['kana'] = '';
$err['phone'] = '';
$err['address'] = '';
$err['question'] = '';

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  $result = filter_input_array(INPUT_POST, FILTER_SANITIZE_FULL_SPECIAL_CHARS);

  if ($result['name'] === '') {
    $err['name'] = 'err';
  } elseif (10 < mb_strlen($result['name'], 'UTF-8')) {
    $err['name'] = 'err';
  }
  if ($result['kana'] === '') {
    $err['kana'] = 'err';
  } elseif (10 < mb_strlen($result['kana'], 'UTF-8')) {
    $err['kana'] = 'err';
  }
  if ($result['phone'] === '') {
    true;
  } elseif (!preg_match('/^[0-9]+$/', $result['phone'])) {
    $err['phone'] = 'err';
  }
  if ($result['address'] === '') {
    $err['address'] = '';
  } elseif (!preg_match('/^[0-9a-z_.\/?-]+@([0-9a-z-]+\.)+[0-9a-z-]+$/', $result['address'])) {
    $err['address'] = 'err';
  }
  if ($result['question'] === '') {
    $err['question'] = 'err';
  }

  if (empty($err['name']) && empty($err['kana']) && empty($err['phone']) && empty($err['address']) && empty($err['question'])) {
    $_SESSION['form'] = $result;
    header("Location: db_connection.php");
    exit;
  }
}

session_destroy();

//DB接続
include "db_open.php";

$dbh = db_open();
//データ取得&表示
$stmt = $dbh->prepare('SELECT * FROM cafe.contacts WHERE id=:id');
$id = $_GET['id'];
$stmt->bindValue(':id', (int)$id, PDO::PARAM_INT);

$stmt->execute();

$result = $stmt->fetch(PDO::FETCH_ASSOC);
?>

<!DOCTYPE html>
<html lang="ja" dir="ltr">

<head>
  <meta charset="UTF-8">
  <title></title>
  <link rel="stylesheet" type="text/css" href="base.css">
  <meta name="viewport" content="width=device-width,initial-scale=1">
  <link href="https://use.fontawesome.com/releases/v5.6.1/css/all.css" rel="stylesheet">
  <script type="text/javascript" src="index.js"></script>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
</head>

<body>

  <!--header-->
 
  <?php include 'layouts/header.php'; ?>
  <!--header-->

  <section>
    <div class="contact-box">
      <h2>更新画面</h2>
      <form action="" method="post">
        <h3>下記の項目をご記入の上送信ボタンを押してください</h3>
        <p class="c-text">
          <font color="red">*</font>は必須項目となります。
        </p>

        <dl>

          <input type="hidden" id="id" name="id" value="<?php echo $result['id']; ?>">

          <dt><label for="name">氏名<font color="red">*</font></label></dt>
          <dd>
            <input type="text" name="name" id="name" value="<?php echo $result['name']; ?>">
            <?php if ($err['name'] === 'err') : ?>
              <p class="error">
                <font color=red>氏名は、必須入力です。10文字以内でご入力ください</font>
              </p>
            <?php endif; ?>
          </dd>

          <dt><label for="kana">カナ<font color="red">*</font></label></dt>
          <dd>
            <input type="text" name="kana" id="kana" value="<?php echo $result['kana']; ?>">
            <?php if ($err['kana'] === 'err') : ?>
              <p class="error">
                <font color="red">フリガナは、必須入力です。10文字以内でご入力ください。</font>
              </p>
            <?php endif; ?>
          </dd>

          <dt><label for="tel">電話番号</label></dt>
          <dd>
            <input type="text" name="phone" id="phone" value="<?php echo $result['phone']; ?>">
            <?php if ($err['phone'] === 'num') : ?>
              <p class="error">
                <font color="red">電話番号は0-9の数字でのご入力ください。</font>
              </p>
            <?php endif; ?>
          </dd>

          <dt><label for="address">メールアドレス<font color="red">*</font></label></dt>
          <dd>
            <input type="text" name="address" id="address" value="<?php echo $result['address']; ?>">
            <?php if ($err['address'] === 'err' || $err['address'] === 'address') : ?>
              <p class="error">
                <font color="red">メールアドレスは、正しくご入力ください。</font>
              </p>
            <?php endif; ?>
          </dd>
        </dl>
        <h3><label for="question">お問い合わせ内容をご記入ください<font color="red">*</font></label></h3>
        <dl class="body">
          <dd>
            <textarea name="question" id="question"><?php echo $result['question']; ?></textarea>
            <?php if ($err['question'] === 'err') : ?>
              <p class="error">
                <font color="red">お問い合わせ内容は、必須入力です。</font>
              </p>
            <?php endif; ?>
          </dd>
        </dl>
        <div class="btn">
          <input type="submit" value="送信">
        </div>
      </form>
    </div>
  </section>

  <!--footer-->
  <?php include "layouts/footer.php" ?>
  <!--footer-->

</body>

</html>
### 該当するソースコード
```dele.php

<?php
//URLからの接続禁止
$referer = $_SERVER['HTTP_REFERER'];
$url = "contact.php";
if (!strstr($referer, $url)) {
  header("Location: contact.php");
  exit;
}

include 'db_open.php';


try {
  $dbh= db_open();
  $stmt = $dbh->prepare('DELETE FROM contacts WHERE id = :id');

  $stmt->execute(array(':id' => $_GET["id"]));

  echo "削除しました。";
} catch (Exception $e) {
  echo 'エラーが発生しました。:' . $e->getMessage();
}
?>
<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <title>削除完了</title>
</head>

<body>
  <p>
    <a href="contact.php">お問い合わせ一覧へ</a>
  </p>
</body>

</html>

自分で試したこと

データベースの保存ができているか前項でテーブルに登録したデータを参照し、 Cafe-Cafeのお問い合わせ入力画面の下部に
テーブルタグを使用して表示して確かめた。
DBの挿入はうまくいっているが、全てnull表示されているため、データベース上に入力した文字列が表示されていない。
その解決策として、phpmyadmin上から氏名、フリガナ、アドレスのみnotnullに変更し、保存したが、変更できずnull表示のままだった。
どうすれば、入力された文字列がテーブルに表示できるかわからないため、どなたかご教授のほどお願いいたします。
     ⇩
phpmyadminで制約の設定をnotnullに設定した[name,kana,email(address)]その後お問い合わせフォームから送信した際にcomplete.phpでデータベースとの接続失敗と表示されるのはなぜか。
尚全て制約がnullだった場合は接続できていた模様。

またcomplete.phpの
9行目$post = $_SESSION['form'];にもエラー表示が出ていたため、
var_dump($post);してみたところ、本来データの出力を期待していたはずが、文字数が表示されていたので、ここも起因なのかなと思い。
正直、どこから解決すればいいのかわからないので、どなたかご教授願います

どなたかご教授願います

0

1Answer

ソースがアレな点はさておき、complete.phpにてsession_start直後の無意味なセッション初期化によって、変数$postのはずです。結果的に何もないインサート文が送られているはずです。
complete.phpでエラーメッセージが出てたはずですが、PHPやSQLのログの確認はしていますか?

以下は本題と関係ないため、マニュアルを熟読することをおすすめします。

session_destroyはしても良いですが、事足りてません。
https://www.php.net/manual/ja/function.session-destroy.php

headerについてもいくつかで動作しないパターンがあります。
https://www.php.net/manual/ja/function.header

0Like

Comments

  1. @yopisan

    Questioner

    ありがとうございます。
    なるほどですね。
    session_start直後に入っていたものが無意味だったので、保存には何もないということなのですね。
    マニュアルの資料ありがとうございます

Your answer might help someone💌