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

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

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

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

MySQL

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

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

MAMP

Mac 上で WordPress などの動的ページのサイトが作れるように環境を構築するフリーソフト

Q&A

解決済

2回答

3717閲覧

Twitter風ひとこと掲示板で投稿ができない。(データベースへのデータの挿入ができない)

nopakat

総合スコア6

INSERT

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

MySQL

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

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

MAMP

Mac 上で WordPress などの動的ページのサイトが作れるように環境を構築するフリーソフト

0グッド

0クリップ

投稿2019/09/09 13:36

編集2019/09/09 22:52

PHP初学者です。

Macを使用し、エディタはAtom、ローカル開発環境はMAMPを使用しています。

現在、たにぐちまことさん著「よくわかるPHPの教科書 PHP7対応版」で学習を進めております。

Chapter6-7で「Twitter風ひとこと掲示板を作る」の中で、ログイン機能で、登録したユーザーでログインした後、投稿としてデータをINSERTしようとしますが上手くいきません。
(具体的には、元の投稿画面の何も入力されていない白紙の状態に戻り、データベースへは何も反映されていません。また、エラーログにも特にエラーは表示されていません。)

以下、記述コードです。

データベース名:mini_bbs
テーブル名:posts
|#|Name|Type|Extra|
|:--:|:--:|--:|
1|id|int(11)|AI
2|message|text|
3|member_id|int(11)|
4|reply_post_id|int(11)|
5|created|datetime|
6|modified|timestamp|

【dbconnect.php】

php

1<?php 2try { 3 $db = new PDO('mysql:dbname=mini_bbs;host=localhost;charset=utf8', 'root', 'root'); 4} catch (PDOException $e) { 5 echo 'DB接続エラー: ' . $e->getMessage(); 6} 7 ?>

【login.php】

php

1<?php 2require('dbconnect.php'); 3 4session_start(); 5 6if ($_COOKIE['email'] != '') { 7 $_POST['email'] = $_COOKIE['email']; 8 $_POST['password'] = $_COOKIE['password']; 9 $_POST['save'] = 'on'; 10} 11 12if(!empty($_POST)) { 13 // ログインの処理 14 if($_POST['email'] != '' && $_POST['password'] != '') { 15 $login = $db->prepare('SELECT * FROM members WHERE email=? AND password=?'); 16 $login->execute(array( 17 $_POST['email'], 18 sha1($_POST['password']) 19 )); 20 $member = $login->fetch(); 21 22 if($member) { 23 //ログイン成功 24 $_SESSION['id'] = $member['id']; 25 $_SESSION['time'] = time(); 26 27 //ログイン情報を記録する 28 if($_POST['save'] == 'on') { 29 setcookie('email', $_POST['email'], time()+60*60*24*14); 30 setcookie('password', $_POST['password'], time()+60*60*24*14); 31 } 32 33 header('Location: index.php'); exit(); 34 } else { 35 $error['login'] = 'failed'; 36 } 37 } else { 38 $error['login'] = 'blank'; 39 } 40} 41 ?> 42 43<!DOCTYPE html> 44<html lang="ja"> 45<head> 46<meta charset="UTF-8"> 47<meta name="viewpoint" content="width=device-width, initial-scale=1, shrink-to-fit=no"> 48 49<!-- Bootstrap CSS --> 50<link rel="stylesheet" href="css/style.css"> 51 52<title>よくわかるPHPの教科書</title> 53</head> 54<body> 55 <main> 56 <div id="lead"> 57 <p>メールアドレスとパスワードを記入してログインしてください。</p> 58 <p>入会手続きがまだの方はこちらからどうぞ。</p> 59 <p>&raquo;<a href="join/">入会手続きをする</a></p> 60 </div> 61 <form action="" method="post"> 62 <dl> 63 <dt>メールアドレス</dt> 64 <dd> 65 <input type="text" name="email" size="35" maxlength="255" 66 value="<?php echo htmlspecialchars($_POST['email'], ENT_QUOTES); ?>" /> 67 <?php if($error['login'] == 'blank'): ?> 68 <p class="error">* メールアドレスとパスワードをご記入ください</p> 69 <?php endif; ?> 70 <?php if($error['login'] == 'failed'): ?> 71 <p class="error">* ログインに失敗しました。正しくご記入ください。</p> 72 <?php endif; ?> 73 </dd> 74 <dt>パスワード</dt> 75 <dd><input type="password" name="password" size="35" maxlength="255" value="<?php echo htmlspecialchars($_POST['password'], ENT_QUOTES); ?>" /> 76 </dd> 77 <dt>ログイン情報の記録</dt> 78 <dd> 79 <input id="save" type="checkbox" name="save" value="on" /><label for="save">次回からは自動的にログインする</label> 80 </dd> 81 </dl> 82 <div><input type="submit" value="ログインする" /></div> 83 </form> 84 </main> 85</body> 86</html> 87

【index.php】

php

1<?php 2session_start(); 3require('dbconnect.php'); 4 5if(isset($_SESSION['id']) && $_SESSION['time'] + 3600 > time()) { 6 //ログインしている 7 $_SESSION['time'] = time(); 8 9 $members = $db->prepare('SELECT * FROM members WHERE id=?'); 10 $members->execute(array($_SESSION['id'])); 11 $member = $members->fetch(); 12} else { 13 //ログインしていない 14 header('Location: login.php'); exit(); 15} 16 17//投稿内容を記録する 18if(!empty($_POST)) { 19 if($_POST['message'] != '') { 20 $message = $db->prepare('INSERT INTO posts SET member_id=?, message=?, created=NOW()'); 21 $message->execute(array( 22 $member['id'], 23 $_POST['message'] 24 )); 25 26 header('Location: index.php'); exit(); 27 } 28} 29?> 30 31 32<!DOCTYPE html> 33<html lang="ja"> 34<head> 35<meta charset="UTF-8"> 36<meta name="viewpoint" content="width=device-width, initial-scale=1, shrink-to-fit=no"> 37 38<!-- Bootstrap CSS --> 39<link rel="stylesheet" href="css/style.css"> 40 41<title>よくわかるPHPの教科書</title> 42</head> 43<body> 44 <main> 45 <div id="content"> 46 <form action="" method="post"> 47 <dl> 48 <dt><?php echo htmlspecialchars($member['name'], ENT_QUOTES); ?>さん、メッセージをどうぞ</dt> 49 <dd> 50 <textarea name="message" cols="50" rows="5"></textarea> 51 </dd> 52 </dl> 53 <div> 54 <input type="submit" value="投稿する" /> 55 </div> 56 </form> 57 </div> 58 </main> 59</body> 60</html>

尚、上記phpファイルは全て同じフォルダ内にあります。

先人の皆様、お力をお貸し頂けましたら幸いです。

何卒よろしくお願いします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/09/09 13:44

他のデータベースへの接続を伴ったテストコードは動かしていますか? それともテストコードは用意せず、いきなり写経しているとか?
退会済みユーザー

退会済みユーザー

2019/09/09 13:48

「データをINSERTしようとしますが上手くいきません」具体的にどうなるのか。MAMPに含まれるApache httpdが出力するerror_logを探し出して、phpを実行したときのエラーメッセージが出力されていれば、それも質問文中に書き添えること。
nopakat

2019/09/09 13:54

m6u様 コメント、ご指摘頂きまして、ありがとうございます。 すみません、テストコードといったものは特に用意せず、いきなり写経しています。 また、状況としては、投稿後、再度投稿画面に戻り、白紙の状態に戻ります。 また、エラーログも拾いにいきましたが、投稿後、特にエラーは出ていませんでした。
退会済みユーザー

退会済みユーザー

2019/09/09 13:58

「dbconnect.php」にhtml的なものって、本当に本に書いてありましたか? 他のphpに組み込まれる関数を定義しているだけなので、なにか間違ってる気がします。
nopakat

2019/09/09 14:02

m6u様 すみません、こちらは特に記述はなかったです。 dbconnect.php内のhtml箇所を削除致しました。 ご指摘ありがとうございます。
m.ts10806

2019/09/09 19:03

タイトルが同じでは伝わるものも伝わりません。起きている問題にもう少し寄せたタイトルにしてください。 (でないと、解決したんじゃないの?という印象です)
nopakat

2019/09/09 22:53

m.ts10806様 ご指摘ありがとうございます。 修正致しました。
m.ts10806

2019/09/09 23:11

言い換えただけでは… 接続のときだけではなくDB操作の処理全てでtry-catch入れてexceptionを捕捉するようにしてください。問題の切り分けはそこからです
guest

回答2

0

ベストアンサー

phpからデータベースに接続するのに大事なことがまとめられている記事を読みながら、
ミニマルなテストコードを実行して原因を探ることをお勧めしたい。
PHPでデータベースに接続するときのまとめ - Qiita

dbconnect.phpの情報を当てはめただけの、接続テストコード
【test_connect.php】

php

1<?php 2 3try { 4 5 /* リクエストから得たスーパーグローバル変数をチェックするなどの処理 */ 6 7 // データベースに接続 8 $pdo = new PDO( 9 'mysql:dbname=mini_bbs;host=localhost;charset=utf8mb4', 10 'root', 11 'root', // 本当にパスワードはrootで間違いない? 12 [ 13 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 14 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, 15 ] 16 ); 17 18 /* データベースから値を取ってきたり, データを挿入したりする処理 */ 19 20} catch (PDOException $e) { 21 22 // エラーが発生した場合は「500 Internal Server Error」でテキストとして表示して終了する 23 // - もし手抜きしたくない場合は普通にHTMLの表示を継続する 24 // - ここではエラー内容を表示しているが, 実際の商用環境ではログファイルに記録して, Webブラウザには出さないほうが望ましい 25 header('Content-Type: text/plain; charset=UTF-8', true, 500); 26 exit($e->getMessage()); 27 28} 29 30// Webブラウザにこれから表示するものがUTF-8で書かれたHTMLであることを伝える 31// (これか <meta charset="utf-8"> の最低限どちらか1つがあればいい. 両方あっても良い.) 32header('Content-Type: text/html; charset=utf-8'); 33 34?> 35<!DOCTYPE html> 36<html> 37 <head> 38 <meta charset="utf-8"> 39 <title>Example</title> 40 </head> 41 <body> 42 <!-- ここではHTMLを書く以外のことは一切しない --> 43 </body> 44</html>

まずこれを試してください。
接続上のエラーが発生すればその旨エラー表示してくれるコードです。
データベースのrootユーザーのパスワードが間違っていれば接続できないこともあります。

投稿2019/09/10 01:08

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

nopakat

2019/09/15 13:46

m6u様 返信が遅くなり申し訳ございません。 一応、ログイン時にはDBへの接続は問題なく実施できており、上記のコードや、DB接続時にtry/catchを追記しましたが、変化はありませんでした。 ただ、DB(MySQL)のエラーログに下記のエラーを確認致しました。 2019-09-15T13:38:51.002318Z 0 [Note] InnoDB: page_cleaner: 1000ms intended loop took 12164ms. The settings might not be optimal. (flushed=0 and evicted=0, during the time.) こちらは何かしらの原因の追及に繋がりますでしょうか。
退会済みユーザー

退会済みユーザー

2019/09/16 01:25

MySQL InnoDBパフォーマンスチューニング | ITedite <https://www.taperium.com/wordpress/tech/9763.html> サーバーが遅くなったと思ったらMysqlが原因だったという件 | Tips of Rubbish <http://wordpress.ideacompo.com/?p=10306> エラーメッセージの特徴的な部分を見極めて、ネット検索にかければ、関連記事を見つけることが出来ます。
nopakat

2019/09/16 14:37

m6u様 ありがとうございます。 今、他の質問者様で同様の内容のものを見つけ、そちらで投稿に関するdbの内容で、NULLを許可するか否かという点で、reply_post_idという返信機能に関しての部分をyesにしたら改善され、投稿することができました。 ご助言、ご助力頂き、ありがとうございます。今後のプログラムに活用させて頂きます。 本当にありがとうございます。
guest

0

ログインはできているということですので、DBの接続先情報は間違っていなさそうです。
MySQLで、rootユーザーが、データベースやpostsテーブルへのINSERT権限を持っているか確認してください。

また、 $_POST['message'] が受け取れているかチェックするため、
どこかに var_dump($_POST); のようなデバッグコードを仕込んで確認してみてください。

投稿2019/09/10 01:56

tomoeine

総合スコア127

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

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

nopakat

2019/09/16 05:53 編集

tomoeine様 ご回答頂いたのに、返信が遅くなり申し訳ございません。 rootユーザーに関してはINSERTの権限は持っておりました。 ただ、動作させていると、PHPのエラーログには何もエラーはなかったのですが、DB(MySQL)のエラーログに下記のようなエラーが繰り返し表示されておりました。 2019-09-15T13:38:51.002318Z 0 [Note] InnoDB: page_cleaner: 1000ms intended loop took 12164ms. The settings might not be optimal. (flushed=0 and evicted=0, during the time.) こちらが何かしらの原因の特定に結びつきますでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問