PHP初心者のための改行問題対処法

このQ&Aのポイント
  • PHPで掲示板を作成している際、テキストエリアの改行が反映されない問題についての解決方法を教えてください。
  • テキストエリアで複数行の文字を入力しても、1行で表示されてしまう問題が発生しています。改行が反映されるようにする方法を教えてください。
  • 質問者はPHP初心者で、掲示板を作成中です。テキストエリアで複数行の入力を行っても、1行で表示されてしまう問題に悩んでいます。改行が反映される方法を教えてください。
回答を見る
  • ベストアンサー

テキストエリアの改行について

PHP初心者です。 今、PHPで掲示板を作成しています。 下記のように テキストエリアで複数行文字を打っても、 1行で表示されてしまいます。 -----入力----- <textarea> Test Test </textarea> -----出力----- Test Test -------------- どうしたら、改行が反映されるのでしょうか? プログラム貼り付けておきますね! -------------------------------- <form method="post" action="<? echo $PHP_SELF; ?>"> 名前<br><input name="name" type="text" size="10"><br> コメント<br><textarea name="mes" rows="10" cols="50"></textarea><br> <input type="submit" value="送信"><input name="del" type="submit" value="RESET"><br> <?php extract($_POST); /* 設定 */ $ip = getenv("REMOTE_ADDR"); //IPアドレスを取得 $logfile = "bbs.log"; //ログファイル名 $viewmax = 10; //表示行数 $logmax = 10; //保存最大行数 $n_fp = fopen("num.log","r+"); $num = fgets($n_fp, 32); //現在のNo.を取得 /* リセット処理 */ if($del){ $bbs = fopen("bbs.log","w"); //BBSログを消去 fclose($bbs); fclose($n_fp); //ファイルを閉じる $nc_fp = fopen("num.log","w"); //num初期化 $num = 1; fputs($nc_fp, $num); //書き込み fclose($nc_fp); //ファイルを閉じる } /* 書き込み処理 */ if($name && $mes){ /* HTMLタグをエントリに変換 */ $mes = htmlspecialchars ($mes); $name = htmlspecialchars ($name); /* Shift-JISの場合バッククォートを除去 */ if(get_magic_quotes_gpc()){ $mes = stripslashes($mes); $name = stripslashes($name); } /* \nを<br>に変換する */ if($mes == "\n"){ $mes = str_replace("\n", "<br>", $mes); } /* 日付けのフォーマット */ $now = gmdate("d(D) H:i ",time()+60*60*9); /* ログのフォーマット */ $dat = "$name<br>└ $mes <font size=\"1\">[$now]</font><br>($ip)<br>\n"; /* ログに書き込む */ $lines = file($logfile); //いままでのログを配列に読み込む $fp = fopen($logfile, "w"); //ログをオープン(空になる) fputs($fp,"[$num] $dat"); //データを書き込む(先頭に) for($i = 0; $i < $logmax-1; $i++) //いままでの分を追記 fputs($fp, "$lines[$i]"); //(配列0-98→現ログ1-99行目) fclose ($fp); $num++; fseek($n_fp, 0); // ポインタを先頭に戻す fputs($n_fp, $num); // 書き込み fclose($n_fp); // ファイルを閉じる } /* 表示処理 */ $lines = file($logfile); for($i = 0; $i < $viewmax; $i++) echo $lines[$i]; ?> </form>

  • PHP
  • 回答数1
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • Suzi
  • ベストアンサー率38% (130/334)
回答No.1

>>/* \nを<br>に変換する */ >>if($mes == "\n"){ >>$mes = str_replace("\n", "<br>", $mes); >>}  ここはどうでしょうか。  if($mes == "\n"){は、「もし$mesが、改行(\n)と同じなら」のような気がします。  if(ereg("\n", $mes){・・・とか。  例えば、 /* \nを<br>に変換する */ if($mes == "\n"){ $mes = str_replace("\n", "<br>", $mes); } の下の行に print $mes; exit; と追記してアクセスし、ブラウザーのソースを見ると、$mesの内容が分ります。

uverlotus
質問者

お礼

>>ここはどうでしょうか。 >>if($mes == "\n"){は、「もし$mesが、改行(\n)と同じなら」のような気がします。 >>if(ereg("\n", $mes){・・・とか。 ここの部分を直してみたところ、無事に改行されました!!! 本当にありがとうございますm(_ _)m 感謝感謝です♪

関連するQ&A

  • PHPから書き換え

    尻取りゲーム用に書いたPHPスクリプトの一部ですが CGIに書き換える方法がよくわかりません。 教えていただけませんでしょうか。 ============================================ if(isset($_POST['shiritori'])){ $rest = mb_substr($shiritori, -1, 1, "SJIS"); $hajime = mb_substr($shiritori, 0, 1, "SJIS"); if(($name != "") && ($shiritori != "")){ if($hajime == $key){ setcookie("name", $name, $expire); $key = file($keyfile); $fp = fopen($keyfile, "w"); fputs($fp,$rest); fclose ($fp); $word = "".$shiritori."<hr>"; $lines = file($logfile); $fp = fopen($logfile, "w"); fputs($fp,$word); for($i = 0; $i < $logmax-1; $i++) fputs($fp, $lines[$i]); fclose ($fp); } } else{ print"記入漏れはありませんか<br>"; print"次は<b>" .$key. "</b>から始まる語です。<br>"; } ============================================ どうぞよろしくお願いします。

    • 締切済み
    • CGI
  • 書き込みデータフォルダの切り替え

    jump.php ./001/log ./002/log ----------------------------- 下記PHPのログファイルの書き込みをフォームから(001・002・・) $name=$_POST[name]; で得た値のフォルダへ振り分けてデータの書き込みしたいのですが うまくできません。 ----------------------------- 改変前 $logfile = $logdir."/$y-$m-$d.txt"; 改変後 $logfile = $name."/".$logdir."/$y-$m-$d.txt"; ----------------------------- ご指導よろしくお願いいたします ----------------------------- $logdir ="log"; // if($_POST[r]){ $y=$_POST[y]; $m=$_POST[m]; $d=$_POST[d]; $H=$_POST[H]; $i=$_POST[i]; $word=$_POST[word]; $name=$_POST[name]; $pass=$_POST[pass]; if($pass != $adpass){die("パスワードが違います"); } if( eregi("[^0-9]",$d) || eregi("[^0-9]",$m) || eregi("[^0-9]",$y)){ die("半角数字のみ有効です。"); } if(!checkdate($m,$d,$y)){die("その日は存在しません。"); } $logfile = $name."/".$logdir."/$y-$m-$d.txt"; if(file_exists($logfile)){ $lines = file($logfile); $fp = @fopen($logfile,"w"); for($j=0;$j<count($lines);$j++){ fputs($fp,$lines[$j]); } @fputs($fp,$H.":".$i.$word.$name."\n"); @fclose($fp); }else{ $fp = @fopen($logfile,"w"); @fputs($fp,$H.":".$i.$word.$name."\n"); @fclose($fp); } header("Location: $_SERVER[PHP_SELF]"); exit; } -----------------------------

    • 締切済み
    • PHP
  • PHPによる行データのアップダウン

    PHPによる行データのアップダウン フォームからデータ行をGETした内容をアップダウンさせたいのですが、どうにも入れ替えができません。 プログラムコードのアドバイスをください。 *ログファイルの中(data.dat) ゴリラ チューリップ ばなな ストロベリー ペンギン <?php $data = "data.dat"; function row_up() { $lines = @file($data); $lines[$ont] = $lines[$_GET[row]]; //自分 $lines[$_GET[row]] = $lines[$_GET[row]-1]; //前の人 $fp = fopen($data,"w"); rewind($fp); for($i=0;$i<count($lines);$i++) { if($lines[$i] == $lines[$_GET[row]]){ fputs($fp,$lines[$_GET[row]]); } elseif($lines[$i] == $lines[$ont]){ fputs($fp,$lines[$ont]); } fputs($fp,$lines[$i]); } fclose($fp); } function row_down() { $lines = @file($data); $lines[$ont] = $lines[$_GET[row]]; //自分 $lines[$_GET[row]] = $lines[$_GET[row]+1]; //次の人 $fp = fopen($data,"w"); rewind($fp); for($i=0;$i<count($lines);$i++) { if($lines[$i] == $lines[$ont]){ fputs($fp,$lines[$ont]); } elseif($lines[$i] == $lines[$_GET[row]]){ fputs($fp,$lines[$_GET[row]]); } fputs($fp,$lines[$i]); } fclose($fp); } switch($_GET[mode]) { case up: row_up(); break; case down: row_down(); break; default: break; } ?>

    • ベストアンサー
    • PHP
  • fputsで改行できない

    $construction='aaa'; $explanation='bbb'; define(DATA, './data'); $fp = fopen(DATA . '/' . $name, 'w') or die('ファイルを開けません'); flock($fp, LOCK_EX); fputs($fp, $construction . "\\r\\n" . $explanation) or die ('ファイルに書き込めません'); fclose($fp); 作成されたファイルを開いてみると aaa\r\nbbbと表示され、改行されません。 "\\r\\n"ではなく"\\n"のみにしても同様です。 二十引用符にしているのに、改行されません。 fputsに複数の変数を同時に入れ、それぞれの間に改行をいれるにはどうすればよいでしょうか? 文字コードはShift-JISです。 ご教示頂けると幸いです。 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • PHP 掲示板記述

    現在、PHPで掲示板をメモ帳で作成しています。 今回は、よくよく分からないものを記載! PHPタグ================================= <?php // 保存するログファイル名 $LOGFILE = "log.txt"; … (1) // POST で mode = write の属性が送られていたら書き込み処理 if ($_POST["mode"] == "write") { … (2)   $name = $_POST["name"]; … (3)   $message = $_POST["message"];   $date = date("Y/m/d H:i:s"); … (4)   if (file_exists($LOGFILE)) { … (5)     $lines = file($LOGFILE); … (6)   }   $fp = fopen($LOGFILE,"w"); … (7)   fputs($fp,"$name,$message,$date\n"); … (8)   for ($i=0;$i<count($lines);$i++) { … (9)     fputs($fp,$lines[$i]); … (10)   }   fclose($fp); } ?> PHP 解説よくよく分からない=========== (1) では変数で説明した変数に保存するファイル名を指定しています。ファイル名は保存、読み込みのところで複数回つかうので使いまわしできるように変数に入れています。 (2) では前ページで説明した、 <input type="hidden" name="mode" value="write"> でフォームから送られる情報を $_POST["mode"] で受け取って、その値が "write" かどうかチェックしています。 「投稿する」ボタンを押してサーバに情報が送信される際に mode=write も送られていますので、それを if文で判定しています。通常のアクセスでは mode=write が送られないため、書き込み処理を行わないという感じです。 (3) では(2)同様、フォームから送られた name の情報を受け取って $name という変数に入れています。 (4) では現在の日付を取得しています。PHPには date 関数という代物があって簡単に現在の日付を取得できます。 (5) ではファイルが存在するかチェックしています。 file_exists関数でファイルが存在するか調べています。 (6) では file 関数によって配列にデータをすべて入れています。なぜここでデータを変数に入れるかというと、新しく投稿されたデータを1行目に書き込んで、残りに古い情報を書き込むためです。 なまえ,メッセージ,2005/02/06 なまえ,メッセージ,2005/02/06 なまえ,メッセージ,2005/02/06 青が新しく投稿された情報で赤が元々保存されていたふるい情報 (7) ではこれから書き込むのでfopen関数でファイルを書き込みモードで開いています。 (8) では開いたファイルにfputs関数で書き込んでいます。名前、メッセージ、日付をカンマ区切りで1行にしてファイルに書き込んでいます。 (9),(10) では古いファイルの情報(投稿前に書き込まれていた情報)を書き込んでいます。これを行わないと、新しく投稿された情報は書き込まれますが、古い情報が消えてしまうのでこの処理をしています。 PHPの解説でよくわからないので、お答えしてください。                                     ♪♪宜しくお願いします。♪♪

    • ベストアンサー
    • PHP
  • 親記事を削除するとレスも削除

    いつも参考にさせてもらっています。 タイトルどおりなのですが、 親記事を削除すると親Noを含むレスをすべて削除できるように $lines = file('res.log'); for ($i = 0; $i < count($lines) + 1; $i++) { $items = explode("\t", $lines[$i]); if ($items[1] == $_GET['oya_del']) { $dno = $i; $dnum2++; if ($dnum) array_splice($lines $dno, $dnum2); $fp = fopen('res.txt', 'w'); foreach($lines as $line) fputs($fp, $line); fclose($fp); } } と、記述しています。 しかしレスが2つ以上あると、1つ残ってしまいます。 どのようにしたらよいのか教えていただけないでしょうか。 お願いいたします。

    • ベストアンサー
    • PHP
  • 掲示板のTEXTARERについて

    過去に同じような質問もありましたが、いろいろ検索してこちらの過去ログを拝見しても解決できなかったので質問させてください。 phpで掲示板をつくったのですが、textarerで改行すると表示が改行されてしまいます。 1回の書込みで1つの表示にするにはどうしたらようでしょうか。 下が問題のソースです。 <?php $body = $_REQUEST["body"]; $body = $body."\n"; if($_REQUEST["write"] != ""){ $fp = fopen("../php/test1.txt","a"); fputs($fp,$body); fclose($fp); } ?> <html> <head> <title>一行掲示板2</title> </head> <body> <b>一行掲示板</b><br><br> 書き込む内容を入力してください。<br><hr> <form name="form" action="<?php print $_SERVER['PHP_SELF']; ?>" method="POST"> <textarea name="body" rows="5" cols="50"></textarea> <input name="write" type="submit" value="書込"><hr> <?php $data = file("../php/test1.txt"); for($i=0; $i<sizeof($data); $i++){ print "記事NO.${i}:${data[$i]}<br>\n<hr>"; } ?> </form> </body> </html> わかる方おりましたらご教授お願いします。

    • ベストアンサー
    • PHP
  • fgetsの使い方について

    こんばんわ。phpでラジオボタンを使用して投票フォームを作っています。 投票した値をログファイルに書き込んで4項目をカウントできるように格納したいのですが、エラーも出ずにスルーして原因がわからず困っています。 イメージでは ログファイル↓ 24 もちろん 11 するかも 5  わからない 12 ない 問題のソースは以下の通りです。 $write = "$radiobutton"."\n"; $fp = fopen("../php/test1.txt","a+"); $line1=fgets($fp); $line2=fgets($fp); $line3=fgets($fp); $line4=fgets($fp); fputs($fp,$write); fclose($fp); print "fgets1回目=".$line1."<br>\n"; print "fgets2回目=".$line2."<br><br>\n"; print "fgets3回目=".$line3."<br><br><br>\n"; print "fgets4回目=".$line4."<br><br><br><br>\n"; わかる方いましたらご教授お願いします。

    • ベストアンサー
    • PHP
  • textファイルについて

    あるディレクトリーに test.txt aaa.txt があるのですが、 二つのテキストを開いて もし text.txtの3行目に http://www.goo.ne.jp/ があり aaa.txtの10行目にも http://www.goo.ne.jp/ があるとすれば aaa.txtの10行目を消したいのですが、 そんな事って可能ですか?? 色々考えたのですが、aaa.txtの10行目を消す時に 10行目を空にすると言う指定が出来なくて困ってます。 どうしてもaaa.txtの削除が出来ません。 参考までにスクリプトを載せておきます <?php $file_name = array("aaa.txt", "test.txt"); $list = fopen($file_name[0], "a+"); $delete_list = fopen($file_name[1], "r"); $listfile = file($file_name[0]); $listmax = count($listfile); $listfile = file($file_name[1]); $delete_listmax = count($listfile); if ($delete_listmax > 0){ for ($delete_line = 1; !feof($delete_list); $delete_line++){ $delete_lines = fgets($delete_list); $delete_lines = trim($delete_lines); if ($delete_lines){ if (is_file($file_name[0])){ for ($line = 1; !feof($list); $line++){ $lines = fgets($list); $lines = trim($lines); if ($lines){ if ($delete_lines == $lines){ //ここの部分がわからないです fputs($list, "あああ"); echo "O,K\n"; } } } } } } } fclose($delete_list); fclose($list); echo "\n終了\n"; ?> 詳しい方がいましたら宜しくお願いします

    • ベストアンサー
    • PHP
  • なぜか Return-Path がechoできない

    メールボックスにあるメールを受信してブラウザに表示したいのでが なぜか、Return-Path の部分のメールアドレスが表示されません。 下記ソースなのですが、どこがいけないのかご教授ください postfix 使ってます <? // ------------------------------------------------- $user = 'a@hoge.ne.jp'; $pwd = 'hoge'; $host = "hoge.ne.jp"; $port = 110; $fp = fsockopen($host, $port); // ログイン $line = fgets($fp, 512); fputs($fp, "USER $user\r\n"); // USER名 $line = fgets($fp, 512); fputs($fp, "PASS $pwd\r\n"); // パスワード $line = fgets($fp, 512); // ログイン失敗? if(!eregi("OK", $line)){ fclose($fp); echo 'ログイン失敗'; exit; } // メールボックス内のデータを取得 fputs($fp, "STAT\r\n"); $line = fgets($fp, 512); list($stat, $num, $size) = explode(' ', $line); // データがない? if(0+$num == 0){ fclose($fp); echo 'メールはありません'; exit; } // それぞれ受信して、配列に納める for($id=1;$id<=$num;$id++){ fputs($fp, "RETR $id\r\n"); $line = fgets($fp); $msg[$id] = ""; while(!eregi("^\.\r?\n",$line)){ $line = fgets($fp, 512); echo $line.'<br>'; } } fputs($fp, "QUIT\r\n"); fclose($fp); ?>

    • ベストアンサー
    • PHP