@souwasora (takei souwa)

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!

PHP SQLデータベースに追加させたい

解決したいこと

ここに解決したい内容を記載してください。

例)
現在PHPでお問い合わせフォームを作成中です。
contact.phpで問い合わせフォームを作成してまして、
名前等入力したら、データベースに反映されて、それを一覧で表示させたい。
いろいろ調べ、データベースとの接続はうまくできたが、フォームで入力したものはデータベースに反映されません。
データベースに直接手入力実施して、表示させることは問題なくできたが、
image.png
のように表示させたい。
解決方法を教えて下さい。

発生している問題・エラー

Warning: PDOStatement::execute() expects parameter 1 to be array, string given in

contact.php
image.png
image.png

または、問題・エラーが起きている画像をここにドラッグアンドドロップ

該当するソースコード

<?php
// require_once('../Models/Db.php');
// $name       = $_POST["name"];
// $kana       = $_POST["kana"];
// $tel        = $_POST["tel"];
// $email      = $_POST["email"];

$dsn = 'mysql:host=localhost;dbname=casteria;charset=utf8';
$user = 'root';
$password = '';

try {
  $dbh = new PDO($dsn, $user, $password);
  // 今あるデータを持ってきてる データは手打ち
  $sql = 'SELECT * FROM contacts';
  // ↓このコードで作成するものだと思ってる
  // $sql = 'INSERT INTO contacts(name,kana,tel,email) VALUES(:name,:kana,:tel,email)';
  // ②SQLの実行
  $stmt = $dbh->query($sql);
  // $stmt = $dbh->prepare($sql);
  // ↓このコードで作成するものだと思ってる
  // エラー Warning: PDOStatement::execute() expects parameter 1 to be array, string given
  // $stmt ->bindValue(':name','[$name]', PDO::PARAM_STR);
  // $stmt ->bindValue(':kana',[$kana], PDO::PARAM_STR);
  // $stmt ->bindValue(':tel',[$tel], PDO::PARAM_STR);
  // $stmt ->bindValue(':email',[$email], PDO::PARAM_STR);
  // ③SQLの結果を受け取る
  $stmt->execute($sql);
  $result = $stmt->fetchAll(PDO::FETCH_ASSOC);

  // var_dump($result);
} catch (PDOException $e) {
  echo "接続失敗: " . $e->getMessage() . "\n";
  exit();
}

  $error_message = array();
  if( isset($_POST["btn"] ) && $_POST["btn"] ){
    //エラー項目の確認
    //ニックネームが空の場合
    if( !$_POST['name'] ) {
	    $error_message[] = "名前を入力してください";
    } else if( mb_strlen($_POST['name']) > 100 ){
	    $error_message[] = "名前は10文字以内にしてください";
    }

    if(!$_POST['kana']) {
      $error_message[] = "フリガナを入力してください";
    } else if( mb_strlen($_POST['kana']) > 100 ) {
      $error_message[] = "カナは10文字以内にしてください";
    }
    if(! preg_match("/^[0-9]+$/", $tel)){
      $error_message[] = "数字を見直してください";
    }
    if(!$_POST['email']) {
      $error_message[] = "メールアドレスを入力してください";
    } else if(! filter_var($_POST['email'],FILTER_VALIDATE_EMAIL)) {
      $error_message[] = "正しく入力してください";
    }
    if(!$_POST['content']) {
      $error_message[] = "問い合わせ内容を記述してください";
    }
  }
  if (!empty($_POST['name']) && ($_POST['kana']) && ($_POST['email']) && ($_POST['content'])){
    header("Location: confirm.php", true, 307);
  }
?>

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>お問い合わせ</title>
  <link rel="stylesheet" href="../public/css/contact.css">
  <link rel="stylesheet" href="../public/css/css/bootstrap.min.css">
  <script type="text/javascript" src="contact.js"></script>
</head>
<body>
<div class="container">
  <h1 class="company">Company Name</h1>
  <div class="row">
    <div><h2>お問い合わせ</h2></div>
  </div>
  <?php
    if( $error_message ){
      echo '<div style="color:red;">';
      echo implode('<br>', $error_message );
      echo '</div>';
    }
  ?>
  <div class="row mt-5">
  <form action="contact.php" method="POST" name="form" onsubmit="return validate()" >
    <h1 class="contact-title">お問い合わせ 内容入力</h1>
    <p>お問い合わせ内容ご入力の上,「確認画面へ」ボタンをクリックしてください。</p>
  </div>
  <div class="col-10">
    <div class="form-row">
      <div class="form-group col-md-7">
        <label>名前<span class="btn btn-danger btn-sm">必須</span></label>
        <input type="text" name="name"  class = "form-control" placeholder="例) 水瀬いのり" value="">
      </div>
      <div class="form-group col-md-7">
        <label>フリガナ<span class="btn btn-danger btn-sm">必須</span></label>
        <input type="text" name="kana"  class = "form-control" placeholder="例) ミナセイノリ" value="">
      </div>
      <div class="form-group col-md-7">
        <label>電話番号<span class="btn btn-danger btn-sm">必須</span></label>
        <input type="text" name="tel"  class = "form-control" placeholder="例) 00000000000" value="">
      </div>
      <div class="form-group col-md-7">
        <label>メールアドレス<span class="btn btn-danger btn-sm">必須</span></label>
        <input type="text" name="email"  class = "form-control" placeholder="例) sample@sample.com" value="">
      </div>
      <div class="form-group col-7">
        <label>お問い合わせ<span class="btn btn-danger btn-sm">必須</span></label>
        <textarea name="content"  class = "form-control" placeholder="お問合せ内容を入力"></textarea>
      </div>
    </div>
    <!-- <button type="submit" name= "btn" class="btn btn-success">確認画面へ</button> -->
    <input type="submit" name="btn" class="btn btn-success"value="確認画面へ">
  </form>
  <div>
  <table class="table table-bordered">
    <tr>
      <th>id</th>
      <th>名前</th>
      <th>ふりがな</th>
      <th>電話番号</th>
      <th>メールアドレス</th>
      <th>お問い合わせ内容</th>
    </tr>
    <?php foreach($result as $column) : ?>
    <tr>
      <th><?php echo $column['id'] ?></th>
      <th><?php echo $column['name'] ?></th>
    </tr>
    <?php endforeach; ?>
  </table>
</div>
</body>
</html>

自分で試したこと

根本的に理解できていないのが、原因だと思います。
stmt ->bindValue(':name','[$name]', PDO::PARAM_STR);
などしても全く無意味で。。。
どうしたらフォームに入力して、それがデータベースに反映されるかさっぱりです。
解決策教えてください。。。

0 likes

1Answer

Warning: PDOStatement::execute() expects parameter 1 to be array, string given in

inの後の行数などが記載されていませんが、おそらく下記の箇所が問題です。

$stmt->execute($sql);

エラーメッセージを翻訳すると「PDOStatement::execute()のパラメーター1は配列を期待しているが、文字列が与えられている」という意味です。

SQLは$dbh->query($sql)で指定されているのですから、書き間違いではないですか?

0Like

Comments

  1. @souwasora

    Questioner

    @blue32a様
    回答ありがとうございます。
    上記修正しました。
    フォームに入力した値をデータベースに追加させるのは
    $stmt ->bindValue(':name','[$name]', PDO::PARAM_STR);
    だと思っていたのですが、反映されません、。
    何が問題なのでしょうか。
  2. 反映されない、とは具体的にどういう状態でしょうか?
    何かエラーが出るのでしょうか?それとも、想定して値が反映されないという事ですか?あるいは全くデータが追加されないということでしょうか?

    bindValue()はSQLのパラメータに値をバインドするためのメソッドなので、これ自体はデータベースにデータを登録しません。
  3. @souwasora

    Questioner

    @blie32a様 返信ありがとうございます。。
    そうなんですね。データベースに登録できないんですね。。。
    分かりました。ありがとうございます。。
  4. 分からない時は小さな歩幅で順序立てて解決していくことが大切です。
    今回の場合はフォームに入力した値をデータベースに登録したいのでしょうから、

    1. 素のINSERT文でデータ登録してみる(パラメータなどは使用しない)
    2. 適当な値をパラメータとして使用して、データを登録してみる
    3. フォームの入力値を使ってデータを登録してみる

    のようなステップを踏むなどして、解決していきます。
    まとめて色々やろうとすると、どこが問題なのか分からなくて解決できない、ということになってしまいます。

Your answer might help someone💌