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

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

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

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

PHP

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

Q&A

解決済

1回答

861閲覧

[PHP]MySQLに登録できない

pofinpouty

総合スコア20

MySQL

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

PHP

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

0グッド

0クリップ

投稿2021/12/07 05:15

編集2021/12/08 05:04

PHPでボタンクリック時の処理として、MySQLにデータを登録したいのですが、登録完了のメッセージが出ているものの、MySQL側で確認してみると登録ができておりません。
テーブル名:Test
+----+------------------------+------------------------+
| ID | beforeFile | afterFile |
+----+------------------------+------------------------+

insert.php

1<?php 2 3$dsn = 'mysql:host=*****;dbname=Test;charset=utf8;unix_socket=/mysql.sock'; 4$user = 'user'; 5$password = 'pass'; 6 7if (!empty($_POST)) { 8 $dbh = new PDO($dsn, $user, $password); 9 10 $before = isset($_POST['beforeFile']) ? $_POST['beforeFile'] : ''; 11 $after = isset($_POST['afterFile']) ? $_POST['afterFile'] : ''; 12 13 $stmt = $dbh->prepare('insert into Test(beforeFile, afterFile) value (?, ?)'); 14 15 $dbh = null; 16 //メッセージのセット 17 $msg = '登録完了'; 18} 19?> 20 21<head> 22 <title>登録画面</title> 23 <meta http-equiv="content-type" charset="UTF-8"> 24</head> 25 26<html> 27 28 <form action="insert.php" method="post"> 29 <p>before</p> 30 <input type="file" name="beforeFile" accept="image/jpg, image/png" required> 31 <p>after</p> 32 <input type="file" name="afterFile" accept="image/jpg" readonly> 33 34 <p><input type="submit" value="登録"></p> 35 </form> 36 37 <?php if ($msg): ?> 38 <p><?=$msg?></p> 39 <?php endif; ?> 40</html>

固定の値でボタンをクリックすると、登録されたのを確認できました。
どこが原因なのか教えていただきたいです。

追記
ご回答いただいた内容を反映しました。
ボタンクリック時にデータベースに1行追加されていることを確認できたのですが、自動生成される
IDのカラム以外は空白で登録されておりました。
INSERT文で"beforeFile"と"afterFile"を指定しているので間違っていないと思っていたのですが。。。
原因がありましたら教えていただきたいです。

PHP

1<?php 2 3$dsn = 'mysql:host=*****;dbname=Test;charset=utf8;unix_socket=/mysql.sock'; 4$user = 'user'; 5$password = 'pass'; 6 7if (!empty($_POST)) { 8 $dbh = new PDO($dsn, $user, $password); 9 10 $before = isset($_POST['beforeFile']) ? $_POST['beforeFile'] : ''; 11 $after = isset($_POST['afterFile']) ? $_POST['afterFile'] : ''; 12 13 $stmt = $dbh->prepare('insert into Test(beforeFile, afterFile) value (?, ?)'); 14 15 $stmt->bindValue(1, $before); 16 $stmt->bindValue(2, $after); 17 $stmt->execute(); 18 19 $dbh = null; 20 //メッセージのセット 21 $msg = '登録完了'; 22} 23?> 24 25<head> 26 <title>登録画面</title> 27 <meta http-equiv="content-type" charset="UTF-8"> 28</head> 29 30<html> 31 32 <form action="insert.php" method="post"> 33 <p>before</p> 34 <input type="file" name="beforeFile" accept="image/jpg, image/png" required> 35 <p>after</p> 36 <input type="file" name="afterFile" accept="image/jpg" readonly> 37 38 <p><input type="submit" value="登録"></p> 39 </form> 40 41 <?php if ($msg): ?> 42 <p><?=$msg?></p> 43 <?php endif; ?> 44</html>

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

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

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

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

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

guest

回答1

0

ベストアンサー

prepare() したあとの bindValue() する箇所がありませんし、
その後 execute() する箇所もないので、
そもそもinsert into文を実行していないのも同じ状態です。

PHPでデータベースに接続するときのまとめ - Qiita
「PDO::prepare → PDOStatement::bindValue → PDOStatement::execute の3ステップでクエリを実行する」
に掲載されているやり方と見比べて、最低限こうする必要があるかと。

php

1$stmt = $dbh->prepare('insert into Test(beforeFile, afterFile) value (?, ?)'); 2$stmt->bindValue(1, $before); 3$stmt->bindValue(2, $after); 4$stmt->execute();

なるべくは、例外をキャッチできる構造に直すとさらに良くなります。
同じ記事の「基本コーディング」「トランザクション処理」を真似てみてはいかがでしょうか。
insert into文の実行なので、ぜひトランザクション処理を追加してください。

投稿2021/12/07 05:56

編集2021/12/07 06:03
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

pofinpouty

2021/12/07 06:51

回答ありがとうございます! bindValueというものがあったのですね・・・知りませんでした。 executeは固定の時に書いていたはずなのですが抜けておりました。。。 記事の添付ありがとうございます。今はとりあえず登録できることを確認!と思っていたのですが、例外の設定をしないとエラーの原因がわかりませんでした、確認してみたいと思います。
pofinpouty

2021/12/07 06:53

それで、回答していただいた3行を追加して登録ボタンを押してみたところ、SQLに1行追加できたことを確認できたのですが、自動生成のID以外空白で登録されておりました。。 何か設定が間違っていたのでしょうか。
退会済みユーザー

退会済みユーザー

2021/12/07 09:22 編集

beforeFile, afterFileとして扱うつもりの $before や $after に正しく値が詰められていない恐れがあります。 var_dump($before); などとしてexecute() 直前にでも変数の内容を確認してみてください。
pofinpouty

2021/12/08 01:20

ありがとうございます 確認してみたところ、 string(0) "" string(0) "" のような結果となりました。ファイルをアップロードしたのですが空文字となっているようでした。調べてみます。
m.ts10806

2021/12/08 02:07

さらに $_POSTではなく$_FILESで適切に取り出す必要がある。
pofinpouty

2021/12/08 02:49

ありがとうございます。 今回はデータベースに値が入っていることを確認したかったため、実際にファイルを保存するのは次の段階。。と思っていたのですが、どのようにしたらファイル送信できるのか存じていなかったので大変参考になります。。 そして、大変お恥ずかしいのですが私の方でスペルミスがあったことを確認し修正したところ、値が格納されていることを確認できました!!! 本当にありがとうございました。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問