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

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

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

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

Q&A

1回答

1890閲覧

「よくわかるPHPの教科書【PHP対応版】」のTwitter風ひとこと掲示板で投稿時にでるエラーについて

yoshi2007

総合スコア0

PHP

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

0グッド

0クリップ

投稿2020/12/08 05:23

前提・実現したいこと

よくわかるPHPの教科書【PHP対応版】のtwitter風ひとこと掲示板を作っているのですが、
49行目の<textarea cols="50" rows="5"><?php echo h($message); ?></textarea>
で投稿フォームのなかにエラーが出てしまいます。

発生している問題・エラーメッセージ

Notice: Undefined variable: message in C:\Apache24\htdocs\testsns\post\index.php on line 49

該当のソースコード

php

1 2<?php 3session_start(); 4require('dbconnect.php'); 5if (isset($_SESSION['id']) && $_SESSION['time'] + 360000 > 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 header('Location: login.php'); exit(); 14} 15if (!empty($_POST)) { 16 if ($_POST['message'] != '') { 17 $message = $db->prepare('INSERT INTO posts SET member_id=?, message=?, reply_post_id=?, created=NOW()'); 18 $message->execute(array( 19 $member['id'], 20 $_POST['message'], 21 $_POST['reply_post_id'] 22 )); 23 24 header('Location: index.php'); exit(); 25 } 26} 27$posts = $db->query('SELECT m.name, m.picture, p.* FROM members m, posts p WHERE m.id=p.member_id ORDER BY p.created DESC '); 28 29if (isset($_REQUEST['res'])) { 30 $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'); 31 $response->execute(array($_REQUEST['res'])); 32 33 $table = $response->fetch(); 34 $message = '@' . $table['name'] . ' ' . '>' . $table['message']; 35} 36 37 38function h($value) { 39 return htmlspecialchars($value, ENT_QUOTES, 'UTF-8'); 40} 41 42 43?> 44<head> 45</head> 46<body> 47<form action="" method="post"> 48<dl> 49<dt><?php echo h($member['name']); ?>さん、メッセージをどうぞ</dt><br> 50<dd><textarea cols="50" rows="5"><?php echo h($message); ?></textarea>  //エラーが発生しているのはここです 51<input type="hidden" name="reply_post_id" value="<?php echo h($_REQUEST['res']); ?>" /></dd> 52</dl> 53<input type="submit" class="button1" value="投稿する" /> 54</form> 55<?php 56foreach($posts as $post): 57?> 58<img src="member_picture/<?php echo h($post['picture']); ?>" width="48" height="48" alt="<?php echo h($post['name']); ?>" />@<?php echo h($post['name']); ?><?php echo h($post['message']); ?>[<a href="index.php?res=<?php echo h($post['id']); ?>">Re</a>] 59<a href="view.php?id=<?php echo h($post['id']); ?>"><?php echo h($post['created']); ?></a> 60<?php 61if ($post['reply_post_id']): 62?> 63<a href="view.php?id=<?php echo 64h($post['reply_post_id']); ?>"> 65返信元のメッセージ</a> 66<?php 67endif; 68?> 69<?php 70if (!empty($_SESSION['id'] && $_SESSION['id'] == ($post['member_id']) )): 71?> 72[<a href="delete.php?id=<?php echo h($post['id']); ?>" style="color: #F33;">削除</a>] 73<?php endif; ?> 74<?php endforeach; ?> 75</body> 76</html> 77

試したこと

teratailに出ていた別の質問を参考に<?php echo h($message); ?>
<?php echo h(array($message)); ?>にしてみたがエラーがでる

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

これ、書籍の原文のままですか?だとすると、この作者は最低限の知識もできていないことになります。

undefined variable ってのは未定義の変数という意味です。それが$messageであるということは、最初に$messageの定義がされていないということです。

それを踏まえてソースをたどってみると、最初に$messageを定義した場所がどこにもないです(その上に、最後の行にも同じ変数を使いまわしています。これはひどいというレベル)。

とりあえず、突っ込みたいことは山程あるのですが、最低限こうやっておいてください。

PHP:PHP

1session_start(); 2$message = ""; //これを追記 3

投稿2020/12/08 05:34

編集2020/12/08 05:35
FKM

総合スコア3647

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

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

hentaiman

2020/12/08 05:59

Amazonレビュー見てみたら確かに酷かった。
yoshi2007

2020/12/08 07:31

FKMさん、解決方法ありがとうございます。 しかしこれを入れることによってエラーメッセージは消えましたが、投稿したものが表示されません もしこのソースを見てなにか原因がわかるのであれば、おしえてください。
FKM

2020/12/08 07:38

$_POST['message']にあたるnameはどこに記述されていますか?おそらくtextareaタグ内にname="message"と書かれているはず(いや、この本ならそれすら忘れてるかも…)。
yoshi2007

2020/12/09 13:41

すいません、たしかに$_post['message']にあたるnameはtextareaのタグ内にname="message"として表示されています。それのどこがおかしいのでしょうか?
FKM

2020/12/09 15:48

該当ソースコードをよく確認してください。
yoshi2007

2020/12/10 14:51 編集

textareaタグないにname="message"が入っていませんでした。ごめんなさい。でも、これを付け加えてみてもやはり投稿が表示されません。formからデータを受け取る方法にミスはなさそうに思えます。ほかに考えられる原因はあるでしょうか、、
FKM

2020/12/11 00:05

var_dump($_POST)としてmessageから送り込まれた記事がちゃんとサーバに伝達されているか確認してください。それができているなら、SQL文かheaderからの転送先に問題がありそうです。
yoshi2007

2020/12/11 17:18

var_dumpするとarray(0) { }がきたので、ちゃんと伝達されていないようです。 form、textarea付近の問題かもしれません。もう一度見てみます。
yoshi2007

2020/12/18 15:44

一週間経ちましたが解決策がみつかりません。$_postがサーバーに送信されない原因として何が考えられますか?
FKM

2020/12/21 08:54

<form action="" method="post">にせずに、actionプロパティそのものを消してしまうか、あるいはactionにパスを記述するとどうなりますか?
kai0310

2020/12/21 09:16

新しい投稿を作成して質問されては?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問