🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
PHP

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

MAMP

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

Q&A

1回答

2313閲覧

PHPで簡単な掲示板を作成しているんですが、メッセージがデータベースに保存されなくて悩んでいます。

masashitonomura

総合スコア1

PHP

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

MAMP

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

0グッド

2クリップ

投稿2021/01/26 03:17

編集2021/01/26 16:22

MAMPでPHPとSQLを使い簡単な掲示板を作って学習中なんですが、データベースにメッセージが保存できなくて悩んでいます。

下のコードが送信用ページです。

PHP

1<?php 2session_start(); 3require('dbconnect.php'); 4 5if (isset($_SESSION['id']) && $_SESSION['time'] + 3600 > time()) { 6 $_SESSION['time'] = time(); 7 8 $members = $db->prepare('SELECT * FROM members WHERE id=?'); 9 $members->execute(array($_SESSION['id'])); 10 $member = $members->fetch(); 11} else { 12 header('Location: login.php'); 13 exit(); 14} 15if (!empty($_POST)) { 16 if ($_POST['message'] !== '') { 17 $message = $db->prepare('INSERT INTO posts SET member_id=?, message=?, reply_message_id=0, created=NOW()'); 18 $message->execute(array( 19 $member['id'], 20 $_POST['message'] 21 )); 22 } 23} 24 25 26?> 27<!DOCTYPE html> 28<html lang="ja"> 29<head> 30 <meta charset="UTF-8"> 31 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 32 <meta http-equiv="X-UA-Compatible" content="ie=edge"> 33 <title>ひとこと掲示板</title> 34 35 <link rel="stylesheet" href="style.css" /> 36</head> 37 38<body> 39<div id="wrap"> 40 <div id="head"> 41 <h1>ひとこと掲示板</h1> 42 </div> 43 <div id="content"> 44 <div style="text-align: right"><a href="logout.php">ログアウト</a></div> 45 <form action="" method="post"> 46 <dl> 47 <dt><?php print(htmlspecialchars($member['name'], ENT_QUOTES)); ?>さん、メッセージをどうぞ</dt> 48 <dd> 49 <textarea name="message" cols="50" rows="5"></textarea> 50 <input type="hidden" name="reply_post_id" value="" /> 51 </dd> 52 </dl> 53 <div> 54 <p> 55 <input type="submit" value="投稿する" /> 56 </p> 57 </div> 58 </form> 59 60 <div class="msg"> 61 <img src="member_picture" width="48" height="48" alt="" /> 62 <p><span class="name">()</span>[<a href="index.php?res=">Re</a>]</p> 63 <p class="day"><a href="view.php?id="></a> 64<a href="view.php?id="> 65返信元のメッセージ</a> 66[<a href="delete.php?id=" 67style="color: #F33;">削除</a>] 68 </p> 69 </div> 70 71<ul class="paging"> 72<li><a href="index.php?page=">前のページへ</a></li> 73<li><a href="index.php?page=">次のページへ</a></li> 74</ul> 75 </div> 76</div> 77</body> 78</html>

mysql接続ファイルはこちらです。

PHP

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

そしてこちらが、mysqlの構造画面になります。
イメージ説明

何かアドバイスをいただけませんでしょうか?

よろしくお願いいたします。

追記

membersという別テーブルにログイン情報を保存するテーブルを作っています。

membersのテーブル画像

デバックした画像です。

イメージ説明
イメージ説明

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

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

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

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

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

m.ts10806

2021/01/26 03:21

なにもエラー起きてませんか? 接続時じゃなく、実行時にtry-catchうつしても。 あと、insert-setはMySQLの方言なのでそれで覚えてしまうと苦労するかと。
masashitonomura

2021/01/26 03:31

ご返信ありがとうございます。 送信してもエラーは出て無いですね。 >実行時にtry-catchうつしても。 というのはtry-catch外すということですか?
m.ts10806

2021/01/26 03:40

外すのではなくうつす。 今接続時にしかtry-catchしてませんが、接続は一度確立してしまえばまサーバーの切断でもない限りエラーとなることはないので、むしろ実行時に必要です。 もしこれでなにも出力されないなら分岐の条件満たしてないんでしょう
masashitonomura

2021/01/26 03:54

if (!empty($_POST)) { if ($_POST['message'] !== '') { try { $message = $db->prepare('INSERT INTO posts SET member_id=?, message=?, reply_message_id=0, created=NOW()'); } catch(PDOException $e) { print('DB接続エラー:' . $e->getMessage()); } $message->execute(array( $member['id'], $_POST['message'] )); } } このようにうつして、送信してみましたが、エラーは出ませんでした。 送信はされているということですかね?
m.ts10806

2021/01/26 05:25

デバッグしてください。 コードがどこを通っているか、 想定の場所で想定の値が変数におさめられているか。
masashitonomura

2021/01/26 07:00

if (!empty($_POST)) { if ($_POST['message'] !== '') { try { $message = $db->prepare('INSERT INTO posts SET member_id=?, message=?, reply_message_id=0, created=NOW()'); } catch(PDOException $e) { print('DB接続エラー:' . $e->getMessage()); } $message->execute(array( $member['id'], $_POST['message'] )); var_dump($_POST['message']); exit(); } } 「こんにちは」とメッセージをいれて、var_dump()をいれて、表示をみると、 string(15) "こんにちは" と表示されました。 何が考えられますか? よろしくお願いします。
masashitonomura

2021/01/26 07:24

そして、if (!empty($_POST)) { の下にも  var_dump($_POST['message']); exit(); を入れても string(15) "こんにちは" と表示されました。 なにがかんがえられますか?
m.ts10806

2021/01/26 07:31

現状を質問本文に追記してください。 頑張って書いてくれているのに申し訳ないですが、質問本文に書いてないことは基本伝わらないと思って良いです。 あくまでこちらは「質問への追記修正依頼」のコメント欄です。 あと、最初にも書いてますが、insert-setはMySQLの方言なのでそれで覚えてしまうと苦労するかと。
masashitonomura

2021/01/26 07:31

if (!empty($_POST)) { if ($_POST['message'] !== '') { try { $message = $db->prepare('INSERT INTO posts SET member_id=?, message=?, reply_message_id=0, created=NOW()'); } catch(PDOException $e) { print('DB接続エラー:' . $e->getMessage()); } $message->execute(array( $member['id'], $_POST['message'] )); var_dump(array( $member['id'])); exit(); } } このように記載したところ、 array(1) { [0]=> string(2) "20" } このように表示されました。 どうかんがえられますか?
masashitonomura

2021/01/26 08:44

申し訳ございません。 membersというテーブルにログイン情報を保存していて、そのIDが20となります。 よろしくお願いいたします。
m.ts10806

2021/01/26 09:53

最初にも書いてますが、insert-setはMySQLの方言なのでそれで覚えてしまうと苦労するかと。 書籍変更した方がいいレベル。
guest

回答1

0

手動のデバッグならこれくらいはやってほしい。

分岐に行数を出力。
配列を持っているであろう変数やtrue/falseを返す機能もvar_dump()

php

1<?php 2ini_set('error_reporting', E_ALL); 3session_start(); 4require('dbconnect.php'); 5echo __LINE__." dump SESSION".PHP_EOL; 6var_dump($_SESSION); 7if (isset($_SESSION['id']) && $_SESSION['time'] + 3600 > time()) { 8echo __LINE__.PHP_EOL; 9 $_SESSION['time'] = time(); 10 11 $members = $db->prepare('SELECT * FROM members WHERE id=?'); 12 $members->execute(array($_SESSION['id'])); 13 $member = $members->fetch(); 14echo __LINE__." dump member".PHP_EOL; 15var_dump($member); 16} else { 17echo __LINE__.PHP_EOL; 18 exit(); 19// header('Location: login.php'); 20} 21echo __LINE__." dump POST".PHP_EOL; 22var_dump($_POST); 23if (!empty($_POST)) { 24echo __LINE__.PHP_EOL; 25 if ($_POST['message'] !== '') { 26echo __LINE__.PHP_EOL; 27 try { 28 $message = $db->prepare('INSERT INTO posts (member_id, message, reply_message_id,created) values (?,?,0,NOW())'); 29 30echo __LINE__." dump execute".PHP_EOL; 31 var_dump($message->execute(array( 32 $member['id'], 33 $_POST['message'] 34 ))); 35 } catch(PDOException $e) { 36echo __LINE__." dump PDOException ".PHP_EOL; 37var_dump($e); 38 } 39 } 40} 41echo __LINE__.PHP_EOL; 42

投稿2021/01/26 09:53

編集2021/01/26 09:54
m.ts10806

総合スコア80875

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

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

masashitonomura

2021/01/26 16:15

INSERT VALUESに変更していただきありがとうございます。 書いていただいたとうりに変更してみました。 <?php ini_set('error_reporting', E_ALL); session_start(); require('dbconnect.php'); echo __LINE__." dump SESSION".PHP_EOL; var_dump($_SESSION); if (isset($_SESSION['id']) && $_SESSION['time'] + 3600 > time()) { echo __LINE__.PHP_EOL; $_SESSION['time'] = time(); $members = $db->prepare('SELECT * FROM members WHERE id=?'); $members->execute(array($_SESSION['id'])); $member = $members->fetch(); echo __LINE__." dump member".PHP_EOL; var_dump($member); } else { echo __LINE__.PHP_EOL; // header('Location: login.php'); exit(); } echo __LINE__." dump POST".PHP_EOL; var_dump($_POST); if (!empty($_POST)) { echo __LINE__.PHP_EOL; if ($_POST['message'] !== '') { echo __LINE__.PHP_EOL; try { $message = $db->prepare('INSERT INTO posts (member_id, message, reply_message_id, created) VALUES (?,?,0,NOW())'); echo __LINE__." dump execute".PHP_EOL; var_dump($message->execute(array( $member['id'], $_POST['message'] ))); } catch(PDOException $e) { echo __LINE__." dump PDOException ".PHP_EOL; var_dump($e); } } } echo __LINE__.PHP_EOL; 丁寧に書いて頂いてありがとうございます。 するとこんな表示になりました。 5 dump SESSION array(2) { ["id"]=> string(2) "21" ["time"]=> int(1611676691) } 8 14 dump member array(14) { ["id"]=> string(2) "21" [0]=> string(2) "21" ["name"]=> string(9) "マサオ" [1]=> string(9) "マサオ" ["email"]=> string(28) "no5858wish+shoping@gmail.com" [2]=> string(28) "no5858wish+shoping@gmail.com" ["password"]=> string(40) "dc791764e2d86f44c0b06032e869e656f81e68aa" [3]=> string(40) "dc791764e2d86f44c0b06032e869e656f81e68aa" ["picture"]=> string(14) "20210126154250" [4]=> string(14) "20210126154250" ["created"]=> string(19) "2021-01-27 00:42:52" [5]=> string(19) "2021-01-27 00:42:52" ["modified"]=> string(19) "2021-01-27 00:42:52" [6]=> string(19) "2021-01-27 00:42:52" } 21 dump POST array(2) { ["message"]=> string(15) "こんにちは" ["reply_post_id"]=> string(0) "" } 24 26 29 dump execute bool(false) 40 dump executeがfalseということは、ここで内容が切れてるということでしょうか?
masashitonomura

2021/01/26 16:16

ちなみにログイン内容を変更しています。 ID 21 マサオ
m.ts10806

2021/01/26 17:45

コードもしなくても、結果だけでいいんですが・・・。 まぁ、少なくとも、INSERTは失敗してますね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問