• 締切済み

テキストエリアからのINSERT文で文中に\nを挿入するには?

PHPでformの<textarea></textarea>より、POST送信して、 INSERT文でDB(MySQL)に保存した時に、文中改行時に"\n"を挿入したい。 例)textarea内書込み。 あいうえお(ENTERキー:改行) かきくけこ(ENTERキー:改行) さしすせそ    ↓ 現在は、下記のようにINSERT文でDB(MySQL)に保存。 あいうえお かきくけこ さしすせそ    ↓こうしたい あいうえお\nかきくけこ\nさしすせそ 色々調べてみたのですが、 PHPだけで対応できるのかJavaScriptを利用するのか、 正規表現やonKeyDownやonkeypressを使わなければいけないのか、 もっと単純にできるのか等々対処法が全く思い浮かびません。 どなたかアドバイスやご教授をお願いします。 よろしくお願いします。

  • PHP
  • 回答数4
  • ありがとう数4

みんなの回答

  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.4

回答No.3の補足です。 mysql_escape_string()関数はPHP4.3以降非推奨で、現在は mysql_real_escape_string()関数を使うとの事です。 さらに、textarea内にユーザーが書き込んだ内容を、SQLのクエリーに 直接入れるのは、SQLインジェクション攻撃の恐れがあるため、 エスケープした方がよいと↓にサンプル付で解説されていました。 http://manual.xwd.jp/function.mysql-real-escape-string.html 私も、DBアクセスは最近始めたばかりなもので。。。 私はPEARのDBコマンドを使っています。 escapeSimple() quoteSmart() quoteIdentifier() とかをエスケープに使います。

minoru4891
質問者

お礼

返信が遅くなりました。 申し訳ありません。 どうやら、JavaScriptで制御するようです。 有難うございました。

  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.3

MySQL用に文字列ををエスケープするには、 mysql_escape_string()関数を使えます。 フォームの<txtarea>でユーザーが入力した文字列に改行が含まれていたら、何もしなくてもPOSTされてくる文字列の中に改行文字は入っています。 この改行文字をMySQLに投入する際\n(\r\n)にエスケープするには、 mysql_escape_string($_POST['text']);とすればよい。 <?php $val = mysql_escape_string( $_POST['text'] ); $sql = " INSERT INTO db_test.tbl_test ( text ) VALUES ('" . $val . "') "; print($sql); $msg = 'OK'; ?> です。

  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.2

$rst = mysql_query( $sql );の直前に print "<pre>"; print($_POST['text']); print($sql); print "</pre>"; を入れれば確認できます。 何もしなくても、 VALUES ("あいうえお かきくけこ さしすせそ") と改行文字は入っています。 私はこうしましたが、 $sql = " INSERT INTO db_test.tbl_test ( text ) VALUES (\"" . $_POST['text'] . "\") ";

minoru4891
質問者

お礼

yyr446様。 有難うございます。 理解いたしました。 と同時に自分がやりたいことがハッキリしました。 もし、おわかりになるようでしたら引き続きアドバイスをお願いします。 テキストエリア内でENTERキーを押したら“\n”と言う文字を挿入したいのですが、どのようにしたら良いのでしょうか? よろしくお願いします。

  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.1

そもそも、POST送信されて来る文字列の中に'\n'は、入ってませんでしたっけ?どこかでエスケープ処理してませんか? 5文字ごとに改行文字'\n'を入れるなら、 echo chunk_split("abcdefghijklmn",5,"\n"); 結果 "abcde\nfghij\nklmn" 日本語も考慮するなら、 mb_split()とかmb_substr()で適当な長さに分解して、配列に 格納した後でimpload("\n",array)で連結する。

minoru4891
質問者

お礼

これって使いにくいですね。 時間切れと文字数制限でおかしな補足になってしまいました。 以下コードの再掲載です。 <?php $sql = " INSERT INTO db_test.tbl_test ( text ) VALUES ( '" . $_POST['text'] . "' ) "; $rst = mysql_query( $sql ); $msg = 'OK'; ?> <form action="<?= $_SERVER[PHP_SELF] ?>" method="post"> <div> <ul> <li>テキスト</li> <li><textarea name="text" ></textarea></li> </ul> <input type="submit" name="action" value="登録" /> </div> </form> お気づきの点がございましたらアドバイスなどお願いします。

minoru4891
質問者

補足

yyr446様。 ご回答下さり有難うございます。 >そもそも、POST送信されて来る文字列の中に'\n'は、入ってませんでしたっけ? う~ん。やはり、そうなのですか・・・。 だから、いくら調べても理解できなかったのですね。 エスケープ処理をしていないつもりなのですが・・・。 以下にコードを掲載しますので、 何処かでエスケープ処理をしているかどうかのご指摘をお願いします。 <?php $sql = " INSERT INTO db_test.tbl_test ( text ) VALUES ( '" . $_POST['text'] . "' ) "; $rst = mysql_query( $sql ); $msg = 'OK'; ?> <form action="<?= $_SERVER[PHP_SELF] ?>" method="post"> <div> <ul> <li>テキスト</li> <li><textarea name="text" > 以上です。どこにもエスケープ処理はしていないので、POST送信の時も DB挿入時も「\n」がついたままのハズだと思うのですが、 テキストエリア内    ⇒     DB内  アイウエオ(ENTERキー改行)    アイウエオ  カキクケコ               カキクケコ 以上のようになってしまいます。 どこがおかしいのでしょうか? お気づきの点がございましたらご指摘お願いします。 ※ちなみに文字数は5文字に限定していません。 1例として掲載しているだけです。

関連するQ&A

  • Perlでの改行コードについて

    <textarea>に入力された値をPOSTで渡し、ポスグレに書き込み、それをHTML上で表示する処理をしているのですが。 textareaで改行を入力した場合に、 DB内に改行が登録されません。 例: *textareaのwrapはsoftに設定してあります。 あいうえおかきくけこ さしすせそ と入力すると。 DBには 「あいうえおかきくけこ さしすせそ」 と登録され 表示では「あいうえおかきくけこさしすせそ」と表示されます。 ソースでみると 「あいうえおかきくけこ さしすせそ」と表示されています。 改行コードの置換がされていないのだと思い INSERT前に s/\r\n/<BR>/g; s/\r/<BR>/g; s/\n/<BR>/g; を使い置換をすると DBには何も登録されません。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • テキストエリアをenterキーでフォーカス移動したい

    複数あるテキストエリア間を、enterキーでフォーカス移動をしたいです。 以下のようにしましたが、2つめのテキストエリアへフォーカス移動すると、改行が入力され、カーソルが2行目へ移動してしまいます。 enterキーを押しているのでこうなってしまうと思うのですが、 カーソルが1行目へ移動するようにするには、どうしたらいいでしょうか? フォーカス移動後に改行コードがあったら、""にreplaceする・・等、試してみたのですが、なかなか上手くいきません。 どなたかお分かりになる方がいらっしゃったら、教えてください。 <HTML> <HEAD> <SCRIPT language="JavaScript"> <!-- function FirstFocus() { document.forms.F1.elements[0].focus(); } function nextFocus(n) { if (event.keyCode == 13) { for (var i = 0, f = n.form.elements; i < f.length; i++) { if (f[i] == n) { (f[i + 1] || f[0]).focus(); } } } } //--> </SCRIPT> </HEAD> <BODY onload="FirstFocus()"> <FORM name="F1"> <TEXTAREA name="T1" rows="5" cols="30" onkeydown="nextFocus(this);"></TEXTAREA><BR> <TEXTAREA name="T2" rows="5" cols="30" onkeydown="nextFocus(this);"></TEXTAREA><BR> <TEXTAREA name="T3" rows="5" cols="30"></TEXTAREA><BR> </FORM> </BODY> </HTML>

  • 緊急です。insert文が実行されない

    フォームで入力された値をINSERT文でMYSQLへ保存しようとしているのですが、 以下のように記述して実行し、phpmyadminでテーブルを確認しても データが入力されておらず空のテーブルとなっています ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー <?php $SCR = $_POST['junni']; $Name = $_POST['namae']; $Day = $_POST['hiduke']; $conn = mysql_connect($url,$user,$pass); $sdb = mysql_select_db($db,$conn); $sql = "insert into `seiseki`(`name`,`day`,`score`)values('$Name','$Day','$SCR')"; $res = mysql_query($sql,$sdb,$conn); mysql_free_result($res); mysql_close($conn); ?> ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー 補足として、 実行後、 Warning: mysql_query() expects at most 2 parameters, 3 given in 「phpの場所とファイル名」 on line 26 Warning: mysql_free_result() expects parameter 1 to be resource, null given in 「phpの場所とファイル名」 on line 28 という表示がされます また、$conn =のあとに print ($Day"); print ($Name"); などを入れると値は表示されているため、受け渡しは問題ないかと思います また、$url,$user,$pass,$dbは、$SCR = $_POST['junni'];以前に $url = "localhost";というような形で代入しており、入力ミスなどは何度も確認しましたがありません 知識がほとんどありませんので、説明足らずかもしれませんが、 文法、入力間違いや解決策がありましたらよろしくお願いいたします

    • ベストアンサー
    • MySQL
  • Insert文がうまく実行されません

    データベースへの書込みを試みています。 先日質問させていただき、この状態で問題なく動いているのですが 入力フィールドを増やすと送信後、send_data.phpのソースが表示されてしまいます。 どなたかよろしくお願いします。 【index.html】 <head><script LANGUAGE="JavaScript"> <!--// function check(){ var strMSG; strMSG = document.search.msg.value; document.open(); document.writeln('<html>\n<head>'); document.writeln('<title></title>'); document.writeln('</head>'); document.writeln('<body>'); document.writeln('<form method="POST" action="send_data.php">'); document.writeln(strMSG); document.writeln('<input type="hidden" name="MSG" value="' + strMSG + '">'); document.writeln('<br>\n<br>\n<input type="submit" value="送信"> '); document.writeln('<input type="button" value="修正" onclick="history.back()">\n</form>'); document.writeln('</body>\n</html>'); document.close(); } //--> </script> </head> <body> <form name="search" method="POST"> ご意見<br> <textarea name="msg"></textarea><br> <input type="button" value=" 確認 " onClick="check()"> <input type=reset value=" 取消 "><br> </form></body> 【send_data.php】 <?php $con = mysql_connect("localhost","root",""); $selectdb = mysql_select_db("bri_db",$con); $sql = "insert into t_research(msg) values('$_POST[MSG]')"; mysql_query($sql,$con); mysql_close($con); ?> <html> <head></head> <body> 完了<br> <a href="index.html">続けて入力 </body> </html>

    • ベストアンサー
    • PHP
  • MySQLで改行を含む文の登録のしかた(改行コード

    MySQLで改行を含む文を登録したいんですが、改行を改行コードに書き換えて登録したいです。 改行コードはどのように書けばいいですか? 登録したい文: あいうえお かきくけこ さしすせそ

    • ベストアンサー
    • MySQL
  • 改行されても空白がずれてしまいます

    カテゴリがMYSQLかもしれません。その場合はご指摘お願いします。 phpとmysqlと使って掲示板のような機能を作っています。 TEXTAREAフォームに改行して文字列を入力し、DBにINSERTで追加します。 表示させるときにSELECTして、nl2br( )を使っています。 表示の際、改行は実行されるのですが  空白(スペース)がTEXTAREAフォーム入力したときと違うように表示されます。 たとえばTEXTAREAフォームでは 本日  10:00~14:00      17:00~23:00 と入力したのにecho で表示させると 本日  10:00~14:00 17:00~23:00 というように改行した行の空白がずれてしまいます。 DBにINSERTするとき、DBから取り出すとき、取り出して表示させたとき、 どの段階でずれるという問題が起きているのでしょうか。 また、どういった対処をすればよろしいでしょうか。 どうかご教授お願いします。 以下がソースコードの一部です。 //入力して追加する部分 <FORM method="POST" action="test1.php"> <TEXTAREA NAME="test1" COLS="60" ROWS="7"></TEXTAREA> <INPUT type="submit" name="submit" value="追加"> で入力し送信して,POSTメソッドで受け取り $add_text = $_POST["test1"]; mysql_query("insert into `test`(`text`) VALUES('$add_text')"); 「test」というテーブルに追加しています。 //表示する部分 $result = mysql_query("select * from test"); $rows = mysql_num_rows($result); if($rows == 0){ } else{ while($row=mysql_fetch_array($result)){ echo nl2br($row['text']); }

    • ベストアンサー
    • PHP
  • DBから出力の際preg_replace等が効かぬ

    データベースを使ったウェブサイト。 POSTを使ったformタグより、textareaにてテキストをsql文にて、 MySqlにinsertし、(このときにmysql_real_escape_string) 読み出すときにhtmlspecialcharsしてprint。 これが一般的な流れなのですが、 上記のまま行うと、改行(\r\n)がウェブ上に見えてしまいます。 ですので、 1:print preg_replace("/\r\n/","<br />", htmlspecialchars($ans['Pt_txt1'], ENT_QUOTES, 'UTF-8')); 2:print nl2br(htmlspecialchars($ans['Pt_txt1'], ENT_QUOTES, 'UTF-8')); などをやって消そうとしているのですが消えません。 ためしに、 $aaa ="適当な文字"; 1:print preg_replace("/\r\n/","<br />", htmlspecialchars($aaa, ENT_QUOTES, 'UTF-8')); 2:print nl2br(htmlspecialchars($aaa, ENT_QUOTES, 'UTF-8')); のように、MySqlを介さずに直接出力した場合、 ちゃんと改行コードは<br />に変更してくれましたので ソースの記述ミスではないと思うのです。 原因はなににあるでしょうか。 なお、現状phpmyadminで覗くと、 「フィールドA」(mysql_real_escape_stringを通してinsert) ----- あいうえお\r\nかきくけこ ----- 「フィールドB」(mysql_real_escape_stringを通さずにinsert) ----- さしすせそ たちつてと ----- となっているフィールドがありますが、 それらがhtmlで出力されたもののソースを見ると、 ----- A:あいうえお\r\nかきくけこ B:さしすせそ<br />たちつてと となぜかBのほうが希望通りの動きをします。 cを通さずにDBに入れてしまったほうが希望通りに動きます。 さっぱり困りました。

    • ベストアンサー
    • MySQL
  • mysqlのinsert文について、ご指導をお願いいたします。

    はじめまして。 プログラミング初心者です。 現在、PHP&MySQLで会員制掲示板を制作しようと奮闘しております。 会員登録フォームを作成し、下記SQL文にて会員登録を行おうとしているのですが、「エラーは出ていないのに、DBにデータが登録されない。」状況で、なにがおかしいのかわからず非常に困っております。尚、DBには正常に接続されています。 環境はVISTAにXAMPPを入れております。 私、PHP初心者のため、本のサンプルソースを加工して使用しようとしています。 下記にソースを記載いたしますので、 どうかご指導のほどお願いいたします。 (※情報が不足しておりましたら申し訳ありません。必要な情報をお教えいただけましたら幸いです。) // 接続 $link = mysql_connect( $db_host, $db_user, $db_password ); mysql_select_db( $db_name ); $result = mysql_query( 'set character set utf8' ); $sql = "select email1 from users where email = '" . mysql_real_escape_string( $_POST['email'] ) . "'"; $result = mysql_query( $sql ); // if ( $error != '' ) exit; // 会員データの挿入 $sql = "insert into member ( login_id, passwd, register_date, nickname, sex, birthday, email, pref, division, state ) values ( '" . mysql_real_escape_string( $_POST['email'] ) . "', '" . md5( $_POST['passwd'] ) . "', '" . date( 'Y-m-d H:i:s' ) . "', '" . mysql_real_escape_string( $_POST['nickname'] ) . "', '" . mysql_real_escape_string( $_POST['sex'] ) . "', '" . mysql_real_escape_string( $_POST['year'] . '-' . $_POST['month'] . '-' . $_POST['day'] . ' 00:00:00' ) . "', '" . mysql_real_escape_string( $_POST['email'] ) . "', '" . mysql_real_escape_string( $_POST['pref'] ) . "', '" . mysql_real_escape_string( $_POST['division'] ) . "', '1' )"; $result = mysql_query( $sql ); //echo $sql; // $title = '会員登録[3/4]'; ?>

    • ベストアンサー
    • PHP
  • 改行コードが半角スペースになってしまいます

    もしかしたらカテゴリはphpかも知れません。 よろしくお願いします。 phpとMySQLでWEBアプリを作っています。html上のtextareaフォームに入力した文字列を、phpを使ってMySQLにINSERTします。この文字列には改行(CRLF)も含まれます。 それをSELECTで参照し表示させると、改行が半角スペースに変換されてしまいます。 phpMyAdminで見てみるとちゃんと改行が入っています。 つまり、格納の段階ではちゃんと改行コードが入っているんですが、取り出すときに変換されてしまうようです。 この場合、どのように対処すればいいのでしょうか?

    • ベストアンサー
    • MySQL
  • textareaタグに入力された改行コードの扱い

    PHPとMySQLを利用して簡単なWEBアプリを作っています。 <textarea>内に入力された文字列をMySQLにINSERTする際、使用しているブラウザによって改行コードの文字数が異なるため、MySQLにINSERTされる文字数が異なってしまいます。具体的にいうと、 --MySQL仕様-- <textarea>内のデータを、MySQLのとあるtableにINSERTする。 そのtableの<textarea>のデータを登録するcolumnにvarchar(1000)を指定している。 --PHP仕様-- <textarea>内のデータをPOSTより受け取り、其の生データを上記設定したcolumnにINSERTする。 (文字数チェックの際、\r\nを\nに変換し、改行コードを1文字として解釈させ、カウントしている。) そのデータを訪問者が閲覧できるようにpreg_replaceで改行コードを<br />に変換し表示している。 INSERTされたデータは再編集できるよう、編集ページを設けている。 ◆問題 ブラウザごとで<textarea>内の改行コードが異なるため、文字数カウントの際、\n、\r、\r\nによって文字数にズレが生じてしまい、その結果varchar(1000)で設定したcolumnでは使用したブラウザによってINSERT可能な文字数が異なってしまう。 ◆質問 ブラウザによって出力される改行コードが異なるため、MySQLのtableにINSERTされる文字数が異なってしまいます。改行コードを1文字と解釈し、ブラウザによる差異をなくす良い方法はありませんか? --自身で考えた方法-- ・varchar(1000)を例えばvarchar(1200)などとし、PHP側のみで文字数の制限を掛ける。 ・一部のサイトでは\r\nを\nに変換し、INSERTするって方法が記載ありました。この方法を選択すると、再編集のページでブラウザを判別し、\nを\r\nに変換する手間があるので仕様変更に手間がかかりそう。 以上となります。独学の自分には「自身で考えた方法」しか思い浮かばず、MySQLに登録する際、ブラウザによる改行コードの文字数の差異の良い方法が浮かびませんでした。何か良い方法をご教授いただけませんでしょうか?宜しくお願いします。

    • ベストアンサー
    • MySQL

専門家に質問してみよう