PHPでの掲示板作成について質問です。
現在、私はドットインストールでPHPを勉強しています。PHPで作る「簡易掲示版」というレッスン( dotinstall.com/lessons/bbs_php )を参考に掲示版を作成したのですが、改行を含む文章が上手く表示されません。
どうしても原因が分からないため、こちらで質問させていただきました。もしよろしければ、どなたか詳しい方にアドバイスを頂けると助かります。よろしくお願いします。ソースは下記に記載します。
ドットインストールのレッスン。 PHPで作る「簡易掲示版」です。
私の作成している掲示板のソースです。よろしくお願いします。。
<?php // 外部ファイルからデータを読み込み $dataFile = "bbs.dat"; $posts = file($dataFile, FILE_IGNORE_NEW_LINES); // もし投稿があったら、読み込んだデータに入力されたデータを追加して書き込み if ($_SERVER['REQUEST_METHOD'] == "POST" && !empty($_POST['message'])) { if (empty($_POST['user'])) { $newData = $_POST['title']."|".$_POST['message']."|名無しさん"; } else { $newData = $_POST['title']."|".$_POST['message']."|".$_POST['user']; } $newData .= date("|Y/m/d"); array_unshift($posts, $newData); $fp = fopen($dataFile, "w"); fwrite($fp, implode("\n", $posts)); header("Location: http://{$_SERVER['HTTP_HOST']}{$_SERVER['PHP_SELF']}"); exit; } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>口コミレビュー</title> <link rel="stylesheet" href="reset.css" media="all"> <link rel="stylesheet" href="review.css" media="all"> </head> <body> <h1>口コミレビュー</h1> <p><a href="#postform">投稿する</a></p> <div id="reviewwrap"> <h2>口コミ投稿一覧 (<?php echo count($posts); ?>件)</h2> <div class="reviewbox"> <?php if (count($posts)) : ?> <?php foreach ($posts as $post) : ?> <?php list($title, $message, $user, $posted) = explode("|", $post); ?> <ul class="review"> <li class="title"><?php echo htmlspecialchars($title); ?></li> <li class="massage"><?php echo htmlspecialchars($message); ?></li> <li class="user"><?php echo htmlspecialchars($user); ?>さんからの口コミ</li> <li class="day"><?php echo htmlspecialchars($posted); ?>に投稿しました</li> </ul> <?php endforeach; ?> <?php else : ?> <p>まだ投稿はありません。</p> <?php endif; ?> </div> </div><!--/reviewwrap--> <div id="postform"> <form action="" method="post"> <dl> <dt>タイトル</dt> <dd><input type="text" name="title" size="50"></dd> <dt>口コミ本文</dt> <dd><textarea type="text" name="message" cols="80" rows="10"></textarea></dd> <dt>ニックネーム</dt> <dd><input type="text" name="user"></dd> </dl> <input type="submit" value="投稿"> </form> </div> </body> </html>
あの、一行掲示板って書いてありますけども・・・・
改行許可したら一行にならないよね
ご返信ありがとうございます。改行許可がおそらく上手くできていない気がしています。 ><:
書き込みする時にtextareaの改行コード(\n)を<br>に変換して(\r)を消したらいいと思うよ。それか\rと\n両方削除しとくか。
ご返信ありがとうございます。「textarea 改行 \n \r 」などで検索してみました。例にならい<?php echo nl2br(htmlspecialchars($message)); ?> と記述してみたのですが、やはり上手くいかずで....。
外部ファイルbbs.datにも改行コードは表示されず、試しにbbs.datに手入力で<br>と記述してもそのまま表示されてしました...。...><..
nl2br()という魔法
ご返信ありがとうございます。ソースを下記に変更してみたのですが、上手くいかずで......
<ul class="review"><li class="title"><?php echo htmlspecialchars($title); ?></li><li class="massage"><?php echo nl2br(htmlspecialchars($message)); ?></li><li class="user"><?php echo htmlspecialchars($user); ?>さんからの口コミ</li><li class="day"><?php echo htmlspecialchars($posted); ?>に投稿しました</li></ul>
ちなみにテストで作成した掲示板です。改行された文章を、本文に入力して投稿すると崩れてしまいます。。
こんな形で改行コード取ったらいいと思う。
例:if ($_SERVER[’REQUEST_METHOD’] == "POST" && !empty($_POST[’message’])) {$message = preg_replace("/\r|\n/","",$_POST[’message’]); if (empty($_POST[’user’])) { $newData = $_POST[’title’]."|".$message."|名無しさん"; } else { $newData = $_POST[’title’]."|".$message."|".$_POST[’user’]; }〜略〜
ご返信ありがとうございます。改行コード取れました。ぶじ崩れることなく投稿できました!欲を言えば、改行ありで表示させたいのですが、それは難しいでしょうか?
この例だとpreg_replaceで改行を取ってしまってるので、改行有りで保存できない。1:取ってしまうのではなく<br>に置き換えること、2:表示する方でhtmlspecialcharsを使っちゃうとタグがタグとして認識されないから使わずに済ますこと、この2点が必要かと思う。ただしこの掲示板ソースだと意図しない文字列への対応などをすっ飛ばした本当にイロハのスクリプト例文だからもっとじっくり悩んだ方がいいと思う。
丁寧なご返信ありがとうございます!そうですね、もっと悩んでよいものを作った方がよいですね。大変ご参考になりました。お時間をとっていただき、本当にありがとうございました。m_ _m がんばってみます。
教えてもらったコードが、どう動いてるのを理解してから次の質問しましょうよ。
ありがとうございます。そうですね。基礎をすっとばしていました。。><//
みんなの回答 7 件
ドットインストールのレッスン。 PHPで作る「簡易掲示版」です。
PHPで作る「簡易掲示版」 (全10回) - プログラミングならドットインストール
http://dotinstall.com/lessons/bbs_php私の作成している掲示板のソースです。よろしくお願いします。。
<?php
// 外部ファイルからデータを読み込み
$dataFile = "bbs.dat";
$posts = file($dataFile, FILE_IGNORE_NEW_LINES);
// もし投稿があったら、読み込んだデータに入力されたデータを追加して書き込み
if ($_SERVER['REQUEST_METHOD'] == "POST" && !empty($_POST['message'])) {
if (empty($_POST['user'])) {
$newData = $_POST['title']."|".$_POST['message']."|名無しさん";
} else {
$newData = $_POST['title']."|".$_POST['message']."|".$_POST['user'];
}
$newData .= date("|Y/m/d");
array_unshift($posts, $newData);
$fp = fopen($dataFile, "w");
fwrite($fp, implode("\n", $posts));
header("Location: http://{$_SERVER['HTTP_HOST']}{$_SERVER['PHP_SELF']}");
exit;
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>口コミレビュー</title>
<link rel="stylesheet" href="reset.css" media="all">
<link rel="stylesheet" href="review.css" media="all">
</head>
<body>
<h1>口コミレビュー</h1>
<p><a href="#postform">投稿する</a></p>
<div id="reviewwrap">
<h2>口コミ投稿一覧 (<?php echo count($posts); ?>件)</h2>
<div class="reviewbox">
<?php if (count($posts)) : ?>
<?php foreach ($posts as $post) : ?>
<?php list($title, $message, $user, $posted) = explode("|", $post); ?>
<ul class="review">
<li class="title"><?php echo htmlspecialchars($title); ?></li>
<li class="massage"><?php echo htmlspecialchars($message); ?></li>
<li class="user"><?php echo htmlspecialchars($user); ?>さんからの口コミ</li>
<li class="day"><?php echo htmlspecialchars($posted); ?>に投稿しました</li>
</ul>
<?php endforeach; ?>
<?php else : ?>
<p>まだ投稿はありません。</p>
<?php endif; ?>
</div>
</div><!--/reviewwrap-->
<div id="postform">
<form action="" method="post">
<dl>
<dt>タイトル</dt>
<dd><input type="text" name="title" size="50"></dd>
<dt>口コミ本文</dt>
<dd><textarea type="text" name="message" cols="80" rows="10"></textarea></dd>
<dt>ニックネーム</dt>
<dd><input type="text" name="user"></dd>
</dl>
<input type="submit" value="投稿">
</form>
</div>
</body>
</html>
あの、一行掲示板って書いてありますけども・・・・
改行許可したら一行にならないよね
書き込みする時にtextareaの改行コード(\n)を<br>に変換して(\r)を消したらいいと思うよ。
それか\rと\n両方削除しとくか。
nl2br()という魔法
ちなみにテストで作成した掲示板です。
改行された文章を、本文に入力して投稿すると崩れてしまいます。。
口コミレビュー
http://atnytest.wkeya.com/review/review.php教えてもらったコードが、どう動いてるのを理解してから次の質問しましょうよ。
PHP入門(基本編) (全32回) - プログラミングならドットインストール
http://dotinstall.com/lessons/basic_php_beginner関連するトピックス