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

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

ただいまの
回答率

87.78%

textareaで改行した内容をそのまま表示したい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 629

score 14

問題点

入力画面(post.php)でtextareaに入力したテキストを改行すると、表示画面(home.php)で改行部分が\r\nとでてきてしまう。

)例
改行したい

改行したい

改行したい

改行したい\r\n\r\n改行したい\r\n\r\n改行したい

実現したいこと

\r\nを表示させずにtextareaの入力内容をそのまま表示させたい。

)例
改行したい

改行したい

改行したい

改行したい

改行したい

改行したい

コード

(post.php)
<?php
  session_start();
 //DB接続
  include_once('dbconnect.php');

  if (!isset($_SESSION['user'])) {
    header('location:login.php');
  }

  //投稿するボタンを押したときの処理
  if (isset($_POST['posting'])) {
    $post_name = $mysqli->real_escape_string($_POST['post_name']);
    $post_author = $mysqli->real_escape_string($_POST['post_author']);
    $post_introduction = $mysqli->real_escape_string($_POST['post_introduction']);
    $post_image = "bookimage/".$_FILES['post_image']['name'];
    //uses_idをpost_idに代入
    $query2 = "SELECT user_id FROM users WHERE user_id=".$_SESSION['user']."";
    $result = $mysqli->query($query2);
    while ($row = $result->fetch_assoc()) {
      $post_id = $row['user_id'];
    }
    //POSTされた情報をDBへ格納する
    $query = "INSERT INTO posts SET post_name=?, post_author=?, post_introduction=?, post_image=?, post_id=?";
    $stmt = $mysqli->prepare($query);
    $stmt->bind_param("ssssi", $post_name, $post_author, $post_introduction, $post_image, $post_id);
    $stmt->execute();
    move_uploaded_file($_FILES['post_image']['tmp_name'], $post_image);

  }

 ?>

<!doctype html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    〜省略(Bootstrap使ってます)〜
  </head>
  <body>

    <!-- Posting-wrapper -->
    <div class="posting-wrapper py-5">
      <div class="container">
        <div class="row">
          <div class="col-md-6 offset-md-3 text-center">
            <h2 class="mb-5 p_title">投稿ページ</h2>
            <form method="post" enctype="multipart/form-data">
              <label class="col-form-label">タイトル <span class="bg-danger text-white p-1" >必須</span></label>
              <input type="text" name="post_name" class="form-control" required/>
              <label class="col-form-label">作者 <span class="bg-danger text-white p-1" >必須</span></label>
              <input type="text" name="post_author" class="form-control" required/>
              <label class="col-form-label">画像 <span class="bg-danger text-white p-1" >必須</span></label>
              <input type="file" name="post_image" class="form-control"  required/>
              <label for="exampleTextarea">紹介文</label>
              <!-- 質問の部分 -->
              <textarea name="post_introduction" class="form-control" rows="8" cols="80"></textarea>
         <!-- 質問ここまで -->
              <div class="text-center">
                <input type="submit" name="posting" class="btn btn-lg btn-success mt-4" value="投稿する">
              </div>
            </form>
          </div>
        </div>
      </div>
    </div>
    <!-- End Posting-wrapper -->

  </body>
</html>
(home.php)
<?php
  session_start();
 //DB接続
  include_once('dbconnect.php');

  if (!isset($_SESSION['user'])) {
    header('location:login.php');
  }

 //usersテーブルとpostsテーブルをリレーションさせる
  $query = "SELECT * FROM posts LEFT JOIN users ON posts.post_id = users.user_id ORDER BY id DESC";
  $result = $mysqli->query($query);
  // 結果を受け取る変数を配列にする
  $posteds = [];
  while ($row = $result->fetch_assoc()) {
      // 配列に取り出した一行分の結果を足していく
      $posteds[] = $row;
  }

 ?>

<!doctype html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    〜省略(Bootstrap使ってます)〜
  </head>
  <body>

    <!-- top-wrapper -->
    <div class="top-wrapper text-center text-white">
      <a href="post.php" class="btn btn-lg btn-success mt-3"><span><i class="fas fa-book-open"></i></span> 投稿ページへ</a>
    </div>
    <!-- End top-wrapper -->

    <!-- post-wrapper -->
    <div class="post-wrapper pt-5">
      <div class="container">
        <div class="row">
          <!-- 投稿を繰り返し表示 -->
          <?php foreach ($posteds as $posted): ?>
          <div class="col-md-4 text-center mb-3">
            <img src="<?php echo $posted['post_image']; ?>" width="200px" height="300px">
          </div>
          <div class="col-md-8 mb-3 manga_data">
            <h3><?php echo $posted['post_name']; ?></h3>
            <p><?php echo $posted['post_author']; ?></p>
       <!-- 質問の部分 -->
            <p><?php echo nl2br(htmlspecialchars($posted['post_introduction'])); ?></p>
       <!-- 質問ここまで -->
          </div>
          <div class="col-md-4 text-center mb-3">
            <img src="<?php echo $posted['photo']; ?>" width="120px" height="120px" class="rounded-circle">
            <p>紹介者 : <?php echo $posted['username']; ?>さん</p>
          </div>
          <div class="col-12">
            <hr style="background-color:#EB6964" class="mb-4" >
          </div>
        <?php endforeach; ?>
        <!-- ここまで繰り返し -->
        </div>
      </div>
    </div>
    <!-- End post-wrapper -->

  </body>
</html>


ご助言頂けると助かります。よろしくお願いします。

補足

DBはusersテーブルとpostsテーブルがあります。
DBにはデータがきちんと格納されています。

usersテーブル
user_id(AI), username, email, password, photo
postsテーブル
id(AI), post_name, post_author, post_introduction, post_image, post_id

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2019/07/08 17:12

    あと「PHP」をタグに追加しておいてください。

    キャンセル

  • m.ts10806

    2019/07/08 17:12

    手元では再現しませんね。
    ファイル自体の、またコードの文字コード設定はどうなっていますか?

    キャンセル

  • toki38

    2019/07/08 17:17

    大変失礼いたしました。
    質問を編集しますので少々お待ちください。
    文字コードはutf-8です。

    キャンセル

回答 2

checkベストアンサー

+2

htmlspecialcharsの引数をきちんとつけたらどうなりますか?

echo nl2br(htmlspecialchars($posted['post_introduction'], ENT_QUOTES, 'UTF-8'));

あとは一回htmlspecialchars()を外してみる。\r\nがそのまま出力されているということはエスケープ入っているので。

echo nl2br($posted['post_introduction']);

データも確認してくださいね。
もし文字列として\r\nがそのまま入っていたら登録処理に問題がありそうです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/07/08 18:20

    上記2つ試しましたが変わらずでした。
    DBに\r\nがそのまま入ってしまってますね。。

    キャンセル

  • 2019/07/08 18:25

    では、DB登録時に問題がありますね。
    改行コードがそのまま入ることってありえません。
    通常は

    改行したい

    改行したい

    改行したい


    とそのまま入ります。
    気になるのはreal_escape_stringを入れておきながらprepare→bind していることです。
    二重エスケープになっているわけですね。
    prepare→bind でSQLエスケープは入るのでreal_escape_stringは不要と思います。

    キャンセル

  • 2019/07/08 19:36

    real_escape_stringを消して、
    echo nl2br(htmlspecialchars($posted['post_introduction']));
    で上手くいきました!
    real_escape_stringは盲点でした。大変助かりました。
    ご助言感謝致します。

    キャンセル

  • 2019/07/08 21:01

    解決されたようで何よりです。
    今回のように、INPUTかOUTPUTか
    どちらが原因かが切り分けられれば解決も早くなると思うので、データの流れと状態を確認する癖をつけてみてください

    キャンセル

+1

DBが絡んでいるとなるとデータの保持の仕方が違うのだと思いますが
普通にpostする限り改行は改行でしかありませえん

<?PHP
$posted['post_introduction']=filter_input(INPUT_POST,"post_introduction");
echo "<pre>\n";
echo htmlspecialchars($posted['post_introduction']);
echo "</pre>\n";
?>
<form method="post">
<textarea name="post_introduction" class="form-control" rows="8" cols="80">
改行したい

改行したい

改行したい
</textarea><br>
<input type="submit" value="send">
</form>

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/07/08 19:37

    解決することができました。
    ご回答いただきありがとうございました。

    キャンセル

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

  • ただいまの回答率 87.78%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る