質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

1248閲覧

MAMP PDOでDB接続し、INSERTするがうまくいかない

shohei_nagamura

総合スコア13

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2022/01/26 18:07

前提・実現したいこと

超初心者です。
MAMPを使って簡単なメモアプリを作成しています。
PDOでDB接続して、INSERTしようとしたのですが、
テーブルを見ても値が入っていません。

該当のソースコード

php

1<?php 2 //データベースへ接続 3 $dsn = "mysql:dbname=memo_app;host=localhost;charset=utf8mb4"; 4 $username = "root"; 5 $password = "root"; 6 $options = []; 7 $pdo = new PDO($dsn, $username, $password, $options); 8 //保存ボタンが押された時の処理 9 if (null !== $_POST["create"]) { //保存ボタンが押されたかどうかを確認 10 if($_POST["memo"] != ""){ //値か入力されているかを確認 11 $stmt = $pdo->prepare("INSERT INTO memos(memo) VALUE (:memo)"); //SQL文を準備 12 $stmt->bindvalue(":memo", $_POST["memo"]); //:memoをpost送信されたmemoの内容に置換 13 $stmt->execute(); //SQL文を実行 14 } 15 } 16?> 17 18 19<!DOCTYPE html> 20<html lang="ja"> 21<head> 22 <meta charset="UTF-8"> 23 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 24 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 25 <link rel="stylesheet" href="./css/style.css"> 26 <title>Memo_app</title> 27</head> 28<body> 29 <header> 30 <div class = "header-title"> 31 <h1>メモアプリ</h1> 32 </div> 33 </header> 34 35 <main> 36 <h2>新規作成</h2><br> 37 <form action="index.php" method="POST"> 38 <label for="text">メモの内容</label><br> 39 <textarea name="memo" id="text" cols="30" rows="10"></textarea><br> 40 <button type="submit" name = "create">作成</button> 41 </form> 42 </main> 43 44</body> 45</html>

試したこと

大変お恥ずかしいですが、
調べてもどうしたらいいかわからず質問させていただいております。
こういう場合のログの場所など解決方法など押していただけると幸いです。

補足情報(FW/ツールのバージョンなど)

php7.4.21
mysql5.7.34

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

PDOのINSERT文のサンプル を見ると、列が2つのテーブルで

insert into tテーブル名 (列名1, 列名2) values (?, ?)'

とあります。
質問のINSERTにはvalues がありません。

投稿2022/01/26 18:35

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

そもそもデータベースへの接続はできているのか?という疑問もあります。
確認するためには、pdo接続するところから見直しをしてみます。
参考:PHPでデータベースに接続するときのまとめ - Qiita

php

1try { 2 //データベースへ接続 3 $dsn = "mysql:dbname=memo_app;host=localhost;charset=utf8mb4"; 4 $username = "root"; 5 $password = "root"; 6 $options = [ 7 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 8 PDO::ATTR_EMULATE_PREPARES => false, 9 ]; 10 $pdo = new PDO($dsn, $username, $password, $options); 11 var_dump($pdo); // 念のため false などではないことを確認、確認できたらこの行自体削除。 12 //保存ボタンが押された時の処理 13 $pdo->beginTransaction(); 14 try { 15 if (isset($_POST["create"])) { //保存ボタンが押されたかどうかを確認 16 if (isset($_POST["memo"])) { //値か入力されているかを確認 17 $stmt = $pdo->prepare("INSERT INTO memos(memo) VALUE (:memo)"); //SQL文を準備 18 $stmt->bindvalue(":memo", $_POST["memo"]); //:memoをpost送信されたmemoの内容に置換 19 $stmt->execute(); //SQL文を実行 20 $pdo->commit(); 21 } 22 } 23 } 24 catch (PDOException $e) { 25 $pdo->rollBack(); 26 throw $e; 27 } 28} 29catch (PDOException $e) { 30 header('Content-Type: text/plain; charset=UTF-8', true, 500); 31 exit($e->getMessage()); 32}

とかでしょうか。
$_POST["create"]$_POST["memo"]に値が入っているかどうか、という簡単な判定に見直しも加えてあります。
そもそもフォーム送信されていなければ$_POST["create"]$_POST["memo"]は「未定義」となるため、
isset()にて存在確認するのが良いのではないでしょうか。
なお、filter_inputを駆使することで、
フォーム送信されていないデータを空文字列にしてしまう方法もあります。

php

1$create = filter_input(INPUT_POST, 'create'); 2$memo = filter_input(INPUT_POST, 'memo'); 3if ($create !== NULL) { 4 if ($memo !== NULL) { 5 // ~ 6 } 7}

詳しい使い方は示したドキュメントを参照してください。

投稿2022/01/27 04:45

編集2022/01/27 06:28
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2022/01/27 06:07

filter_inputの返却値として >変数が設定されていなければ false、 フィルタリングに失敗したら null を返します ので、必須のリクエスト項目なのであれば「空ではない」より「nullではない」のほうが良さそうに思います。(特にcreateは送信ボタンなので)
退会済みユーザー

退会済みユーザー

2022/01/27 06:29

ご指摘ありがとうございます。コードを改めさせていただきました。
guest

0

ベストアンサー

PDOで処理するときにはエラーモードの設定をしてtry-catchで問題を特定します

PHP

1try{ 2 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 3 $stmt = $pdo->prepare($sql); 4 $stmt->execute([]); 5}catch(PDOException $e){ 6 die($e->getMessage()); 7}

投稿2022/01/27 00:06

yambejp

総合スコア114769

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問