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

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

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

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

DB2

DB2(IBM Database2)は、IBMのリレーショナルデータベース管理システム製品です。 UNIXとWindows、IBM社のメインフレームOS用が用意されており、 幅広いプラットフォームに対応しています。

Q&A

解決済

2回答

3226閲覧

『よくわかるPHPの教科書:一言掲示板』返信機能をつけると投稿が機能しなくなる

tsumazarin

総合スコア0

PHP

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

DB2

DB2(IBM Database2)は、IBMのリレーショナルデータベース管理システム製品です。 UNIXとWindows、IBM社のメインフレームOS用が用意されており、 幅広いプラットフォームに対応しています。

0グッド

0クリップ

投稿2020/07/24 06:26

投稿機能を回復させたい

〜詳しい内容〜
データベースとPHPを使って、『よくわかるPHPの教科書』の一言掲示板を作っています。

はじめ投稿はしっかり機能していたのですが、返信機能をつけた途端に投稿できなくなってしまいました。(返信することだけはできます。)

返信機能と投稿機能があやしいと疑って隅々まで見てみましたが、一向に改善されません。
どこが間違えているのか教えていただけたら幸いです。

該当のソースコード

PHP

1ソースコード 2<?php 3 session_start(); 4 5 require('../dbconnect.php'); 6 7 if(isset($_SESSION['id']) && $_SESSION['time']+3600>time()){ 8 $_SESSION['time']=time(); 9 10 $members=$db->prepare('SELECT * FROM a_word.members WHERE id=?'); 11 $members->execute(array($_SESSION['id'])); 12 $member=$members->fetch(); 13 }else{ 14 //ログインしていない 15 header('Location: ../login/login.php'); 16 exit(); 17 } 18 19 //投稿を記録する 20 if(!empty($_POST)){ 21 if($_POST['message'] !==""){ 22 $message=$db->prepare('INSERT INTO a_word.posts SET message=?, member_id=?, reply_post_id=?, created=NOW()'); 23 $message->execute(array($_POST['message'], $member['id'], $_POST['reply_post_id'])); 24 25 header('Location: index.php'); 26 exit(); 27 } 28 } 29 30 //投稿を取得する 31 $posts=$db->query('SELECT m.name, m.picture, p.* FROM a_word.members m, a_word.posts p WHERE m.id=p.member_id ORDER BY p.created DESC'); 32 33 //返信の場合 34 if(isset($_GET['res'])){ 35 $response=$db->prepare('SELECT m.name, m.picture, p.* FROM a_word.members m, a_word.posts p WHERE m.id=p.member_id AND p.id=? ORDER BY p.created DESC'); 36 $response->execute(array($_GET['res'])); 37 38 $table=$response->fetch(); 39 $message="【@{$table['name']}、\t{$table['message']}】\n\n"; 40 } 41 42//htmlspecialcharsのショートカット 43 function h($value){ 44 return htmlspecialchars($value, ENT_QUOTES); 45 } 46?> 47 48<!DOCTYPE html> 49<html lang="ja"> 50 <head> 51 <meta charset="utf-8"> 52 <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> 53 <link rel="stylesheet" href="../css/style.css"> 54 <title>ア ワード</title> 55 </head> 56 <body> 57 <header> 58 <h2>投稿する</h2> 59 </header> 60 <main> 61 <form action="" method="post"> 62 <dl> 63 <dt><?php echo h($member['name']); ?>さん、メッセージをどうぞ</dt> 64 <dd> 65 <textarea name="message" rows="8" cols="80"><?php echo h($message); ?></textarea> 66 <input type="hidden" name="reply_post_id" value="<?php echo h($_GET['res']); ?>"> 67 </dd> 68 </dl> 69 <input type="submit" value="投稿する"> 70 </form> 71 <?php foreach($posts as $post): ?> 72 <hr> 73 <div class="msg"> 74 <img src="../member_picture/<?php echo h($post['picture']); ?>" width="48" height="48" alt="<?php echo h($post['name']); ?>"> 75 <p> 76 <?php echo h($post['message']); ?> 77 <span><?php echo h($post['name']); ?></span> 78<a href="index.php?res=<?php echo h($post['id']); ?>">Re</a>79 </p> 80 <p><a href="../private/view.php?id=<?php echo h($post['id']) ?>"><?php echo h($post['created']); ?></a></p> 81 <?php if($post['reply_post_id']>0): ?> 82 <a href="../private/view.php?id=<?php echo h($post['reply_post_id']); ?>">返信元のメッセージ</a> 83 <?php endif; ?> 84 </div> 85 <?php endforeach; ?> 86 </main> 87 </body> 88</html>

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

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

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

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

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

kai0310

2020/07/24 06:33

エラーは出ていませんか? 出ている場合は質問本文を修正し記載してください。
tsumazarin

2020/07/24 06:53

エラーは出ていないです。 Webの画面も特に変わっているところはないですし、データベース接続も成功しています。
kai0310

2020/07/24 07:07

一応確認ですがエラー表示される様に設定はされていますか?
tsumazarin

2020/07/24 07:53

php.iniのdisplay_errorsはOnになっています。
m.ts10806

2020/07/24 07:58

本件とはあまり関係ないですが、insert setの構文はMySQLでしか出てこないので覚えても使えません。
guest

回答2

0

自己解決

投稿をMySQLに記録するときに、返信と普通の投稿を場合分けするべきでした。

//投稿を記録する if(!empty($_POST)){ if($_POST['message'] !==""){ $message=$db->prepare('INSERT INTO a_word.posts SET message=?, member_id=?, reply_post_id=?, created=NOW()'); if(!isset($_GET['res'])){ $message->execute(array($_POST['message'], $member['id'],0)); }else{ $message->execute(array($_POST['message'], $member['id'], $_POST['reply_post_id'])); } header('Location: index.php'); exit(); } }

普通の投稿→"if(!isset($_GET['res']))"にして"reply_post_id=0"
返信→"else"にして"reply_post_id=$_POST['reply_post_id']"

これで一応は解決しました。
みなさん対応していただきありがとうございました。

投稿2020/07/25 02:31

tsumazarin

総合スコア0

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

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

0

//投稿を記録する $message=$db->prepare('INSERT INTO a_word.posts SET message=?, member_id=?, reply_post_id=?, created=NOW()'); /返信の場合 $message="【@{$table['name']}、\t{$table['message']}】\n\n";

どちらも同じ変数名になっているために、起こっているのではないですかね?
なので、どちらかを違う名前にしてみてください。
例えば、返信の方を$res_messageにするとか

投稿2020/07/24 23:28

編集2020/07/24 23:35
mari.rinn

総合スコア296

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

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

tsumazarin

2020/07/25 02:23

回答してくださりありがとうございます。 色々やってみるうちに自己解決しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問