前提・実現したいこと
PHPで掲示板サービスにてユーザー登録画面を作成中ですが、
投稿フォームからテキストの入力を行ってもデータベースに反映されない状況です。
投稿内容をテキストで入力後、投稿ボタンをクリックすると投稿内容が画面から消去
されます。この原因をご教示頂けませんでしょうか? 該当ソースコードの「index.php」に原因があるように考えています。念のため、「dbconnect.php」のファイルも添付致しました。
データベース
lang
1ファイル名:index.php 2<?php 3session_start(); 4require('dbconnect.php'); 5 6if (isset($_SESSION['id']) && $_SESSION['time'] + 3600 > time()) { 7 // ログインしている 8 $_SESSION['time'] = time(); 9 10 $members = $db->prepare('SELECT * FROM members WHERE id=?'); 11 $members->execute(array($_SESSION['id'])); 12 $member = $members->fetch(); 13} else { 14 // ログインしていない 15 header('Location: login.php'); exit(); 16} 17 18// 投稿を記録する 19if (!empty($_POST)) { 20 if ($_POST['message'] != '') { 21 $message = $db->prepare('INSERT INTO posts SET member_id=?, message=?, reply_post_id=?, created=NOW()'); 22 $message->execute(array( 23 $member['id'], 24 $_POST['message'], 25 $_POST['reply_post_id'] 26 )); 27 28 header('Location: index.php'); exit(); 29 } 30} 31 32 33 34 35 36// 投稿を取得する 37$page = $_REQUEST['page']; 38if ($page == '') { 39 $page = 1; 40} 41$page = max($page, 1); 42 43// 最終ページを取得する 44$counts = $db->query('SELECT COUNT(*) AS cnt FROM posts'); 45$cnt = $counts->fetch(); 46$maxPage = ceil($cnt['cnt'] / 5); 47$page = min($page, $maxPage); 48 49$start = ($page - 1) * 5; 50$start = max(0, $start); 51 52$posts = $db->prepare('SELECT m.name, m.picture, p.* FROM members m, posts p WHERE m.id=p.member_id ORDER BY p.created DESC LIMIT ?, 5'); 53$posts->bindParam(1, $start, PDO::PARAM_INT); 54$posts->execute(); 55 56// 返信の場合 57if (isset($_REQUEST['res'])) { 58 $response = $db->prepare('SELECT m.name, m.picture, p.* FROM members m, posts p WHERE m.id=p.member_id AND p.id=? ORDER BY p.created DESC'); 59 $response->execute(array($_REQUEST['res'])); 60 61 $table = $response->fetch(); 62 $message = '@' . $table['name'] . ' ' . $table['message']; 63} 64 65// htmlspecialcharsのショートカット 66function h($value) { 67 return htmlspecialchars($value, ENT_QUOTES, 'UTF-8'); 68} 69 70// 本文内のURLにリンクを設定します 71function makeLink($value) { 72 return mb_ereg_replace("(https?)(://[[:alnum:]+$\;?.%,!#~*/:@&=_-]+)", '<a href="\1\2">\1\2</a>' , $value); 73} 74?> 75<!DOCTYPE html> 76<html lang="ja"> 77<head> 78 <meta charset="UTF-8"> 79 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 80 <meta http-equiv="X-UA-Compatible" content="ie=edge"> 81 <title>ひとこと掲示板</title> 82 83 <link rel="stylesheet" href="../style.css" /> 84</head> 85 86<body> 87<div id="wrap"> 88 <div id="head"> 89 <h1>ひとこと掲示板</h1> 90 </div> 91 <div id="content"> 92 <div style="text-align: right"><a href="logout.php">ログアウト</a></div> 93 <form action="" method="post"> 94 <dl> 95 <dt><?php echo h($member['name']); ?>さん、メッセージをどうぞ</dt> 96 <dd> 97 <textarea name="message" cols="50" rows="5"><?php echo h($message); ?></textarea> 98 <input type="hidden" name="reply_post_id" value="<?php echo h($_REQUEST['res']); ?>" /> 99 </dd> 100 </dl> 101 <div> 102 <p> 103 <input type="submit" value="投稿する" /> 104 </p> 105 </div> 106 </form> 107 108<?php 109foreach ($posts as $post): 110?> 111 <div class="msg"> 112 <img src="member_picture/<?php echo h($post['picture']); ?>" width="48" height="48" alt="<?php echo h($post['name']); ?>" /> 113 <p><?php echo makeLink(h($post['message'])); ?><span class="name">(<?php echo h($post['name']); ?>)</span>[<a href="index.php?res=<?php echo h($post['id']); ?>">Re</a>]</p> 114 <p class="day"><a href="view.php?id=<?php echo h($post['id']); ?>"><?php echo h($post['created']); ?></a> 115 <?php 116if ($post['reply_post_id'] > 0): 117?> 118<a href="view.php?id=<?php echo 119h($post['reply_post_id']); ?>"> 120返信元のメッセージ</a> 121<?php 122endif; 123?> 124<?php 125if ($_SESSION['id'] == $post['member_id']): 126?> 127[<a href="delete.php?id=<?php echo h($post['id']); ?>" 128style="color: #F33;">削除</a>] 129<?php 130endif; 131?> 132 </p> 133 </div> 134<?php 135endforeach; 136?> 137 138<ul class="paging"> 139<?php 140if ($page > 1) { 141?> 142<li><a href="index.php?page=<?php print($page - 1); ?>">前のページへ</a></li> 143<?php 144} else { 145?> 146<li>前のページへ</li> 147<?php 148} 149?> 150<?php 151if ($page < $maxPage) { 152?> 153<li><a href="index.php?page=<?php print($page + 1); ?>">次のページへ</a></li> 154<?php 155} else { 156?> 157<li>次のページへ</li> 158<?php 159} 160?> 161</ul> 162 </div> 163</div> 164</body> 165</html> 166
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?>
試したこと
echo LINE . PHP_EOL;をif文の内と外に配置したところ、以下の工程のデータ挿入の前の処理で止まってることがわかりました。
PHP
1// 投稿を記録する 2 3 echo __LINE__ . PHP_EOL; 4if (isset($_POST)) { 5 if (isset($_POST['message']) && isset($_POST['reply_post_id'])) { 6 echo __LINE__ . PHP_EOL; 7 $message = $db->prepare('INSERT INTO posts SET member_id=?, message=?, reply_post_id=?, created=NOW()'); 8 $message->execute(array( 9 $member['id'], 10 $_POST['message'], 11 $_POST['reply_post_id'] 12 )); 13header('Location: index.php'); exit(); 14} 15echo __LINE__ . PHP_EOL; 16} 17echo __LINE__ . PHP_EOL;
投稿画面イメージ
画像の右上の番号、24(INSERT文の前の行の行番号)のみ表示されていないです。
動作環境
PHP :7.3.1
DB :MySQL
動作環境:Mac(MAMP)
回答1件
あなたの回答
tips
プレビュー