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!

フォームの値をデータベースに保存する

フォームの値をデータベースに保存する

phpmyadminを使用してphpとデータベースの紐付けを行なっているが、接続はできているはずなのに、データベースに保存ができていない。

例)
phpで作成した、お問い合わせフォームとデータベースの紐付けを行なっています。データベースとの紐付けができていないからか、insert.phpに入力された文字列をDBに保存するテストは行っているがphpmyadmin上に更新されていない。

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

insert.php
接続成功
Notice: Undefined variable: stmt in /Applications/MAMP/htdocs/04_php_form/cafe/mainte/insert.php on line 35

Fatal error: Uncaught Error: Call to a member function execute() on null in /Applications/MAMP/htdocs/04_php_form/cafe/mainte/insert.php:35 Stack trace: #0 {main} thrown in /Applications/MAMP/htdocs/04_php_form/cafe/mainte/insert.php on line 35

phpmyadmin
https://i.gyazo.com/21f0458f8cfc28f3d1b5fa1f8913c2ac.png

イメージとしては以下
https://i.gyazo.com/d06509b70d46807393fb81ddd16d4caf.png

該当するソースコード

complete.php
<?php
  session_start(); 
  $_SESSION = array();
  session_destroy();
  $referer = $_SERVER['HTTP_REFERER']; 
  $url = "confirm.php";
  if(!strstr($referer,$url)){
    header("Location: contact.php");
  exit;
  }
  $_POST = $_SESSION;
  
  //DBの接続
  //DBへの保存

  
?>
  <?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>
      <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'; ?>

該当するソースコード

db_connection.php
<?php

const DB_HOST = 'mysql:dbname=cafe;host=localhost;charset=utf8';
const DB_USER = 'php_user';
const PASSWORD = 'ykb02566';


//例外処理Exeption
try{
  $pdo = new PDO(DB_HOST,DB_USER,PASSWORD, [
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //連想配列
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, //例外
    PDO::ATTR_EMULATE_PREPARES => false, //SQLインジェクション対応
  ]);
  echo '接続成功';
} catch(PDOException $e){
  echo '接続失敗' . $e->getMessage()."\n";
  exit();
}
?>

該当するソースコード

connect.php
<?php

//DB接続 PDO
require 'db_connection.php';

// $sql = 'select * from contacts where id = 1'; //sql
// $stmt = $pdo->query($sql); //sqlステートメント

// $result = $stmt->fetchall();

// echo '<pre>';
// var_dump($result);
// echo '</pre>';

//ユーザー入力あり prepare, bind, execute 悪意ユーザー delete * SQLインジェクション
$sql = 'select * from contacts where id = id;'; //名前つきプレースホルダー
$stmt = $pdo->prepare($sql);
$stmt->bindValue('id', 5, PDO::PARAM_INT);//紐付け
$stmt->execute();//実行

$result = $stmt->fetchall();
echo '<pre>';
var_dump($result);
echo '</pre>';

$pdo->beginTransaction();

try{
  //sql処理
  $stmt = $pdo->prepare($sql);
  $stmt->bindValue('id', 5, PDO::PARAM_INT);//紐付け
  $stmt->execute();//実行
  $pdo->commit();

}catch(PDOException $e){
  $pdo->rollback();
}

該当するソースコード

mainte/insert.php
<?php

//DB接続PDO
require '/Applications/MAMP/htdocs/04_php_form/cafe/db_connection.php';
//入力 DB保存 prepare, bind, execute

// 入力 DB保存
 $params = [
   'id' => null,
   'name' => 'はなやねん',
   'kana' => 'ナマエ',
   'tel' => '0506039300',
   'email' => 'test@test',
   'body' => 'こんにちは',
   'created_at' => null
 ];

 $count = 0;
 $columns = ',';
 $values = ',';

 foreach(array_keys($params) as $key){
   if($count++>0){
     $columns .=',';
     $values .=','; db
   }
   $columns .= $key;
   $values .= ':'.$key;
 }
$sql = 'insert into contacts ('.$columns.')values('.$values.')'; 

// var_dump($sql);
// exit;

$stmt->execute($params);

自分で試したこと

https://teratail.com/questions/282730
なぜ、データベースと接続ができていないのか、わからないためどなたかご教授願います。

0

3Answer

接続失敗時のエラーメッセージは確認しましたか?

echo '接続失敗' . $e->getMessage()."\n";

0Like

Comments

  1. @yopisan

    Questioner

    ありがとうございます。確認いたしました。以下のようなメッセージがです。
    接続失敗SQLSTATE[HY000] [1045] Access denied for user 'php_user'@'localhost' (using password: NO)

原因はエラーメッセージのとおりです。

Notice: Undefined variable: stmt in /Applications/MAMP/htdocs/04_php_form/cafe/mainte/insert.php on line 35

mainte/insert.php
$stmt->execute($params); // 35行目

この変数$stmtが未定義です。
読み込んでいるdb_connection.phpを含めて、ここに到達するまで定義されていないようです。

Fatal error: Uncaught Error: Call to a member function execute() on null

定義されていないのでexecuteメソッドは持っていません。
つまり、データを保存するためのINSERTクエリは実行できません。

接続はできているはずなのに、データベースに保存ができていない。

データベース接続は、データを保存するための前提条件になります。
接続できているからといって、その後の操作が保証されるわけではありません。

connect.phpが正しく実行されているなら、接続は問題ないのだと思います。
前提条件はクリアされているわけですから、データを保存するための処理を確認しましょう。

0Like

This answer has been deleted for violation of our Terms of Service.

Your answer might help someone💌