こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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に登録する際、ブラウザによる改行コードの文字数の差異の良い方法が浮かびませんでした。何か良い方法をご教授いただけませんでしょうか?宜しくお願いします。

投稿日時 - 2012-08-05 20:30:15

QNo.7628718

困ってます

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

>ブラウザによって出力される改行コードが異なるため、MySQLのtableにINSERTされる文字数が異なってしまいます。
>改行コードを1文字と解釈し、ブラウザによる差異をなくす良い方法はありませんか?
改行コードを1文字と解釈しなければいけない必然性はありますか?
改行コードを6文字(<br />)と解釈してもいいのでは?

ということで

>--MySQL仕様--
><textarea>内のデータを、MySQLのとあるtableにINSERTする。
>そのtableの<textarea>のデータを登録するcolumnにvarchar(1000)を指定している。
を、
<textarea>内のデータを、
\r\n は、<br />に置き換えてから
\nは、<br />に置き換えてから
MySQLのとあるtableにINSERTする。

>--PHP仕様--
><textarea>内のデータをPOSTより受け取り、其の生データを上記設定したcolumnにINSERTする。
ここで、上記の「置き換え」をしてもよいはず。

>(文字数チェックの際、\r\nを\nに変換し、改行コードを1文字として解釈させ、カウントしている。)
どうしても改行を1文字と数えたければ、<br />の数を数えて、総文字数から5×<br />の数を引けばよい。

>そのデータを訪問者が閲覧できるようにpreg_replaceで改行コードを<br />に変換し表示している。
変換不要なはず。

>INSERTされたデータは再編集できるよう、編集ページを設けている。

といった方法ではどうでしょうか?

投稿日時 - 2012-08-05 21:52:16

お礼

回答ありがとうございます。参考になります。

>改行コードを1文字と解釈しなければいけない必然性はありますか?
>改行コードを6文字(<br />)と解釈してもいいのでは?
そう指摘されてしまえば確かにおっしゃるとおりです。改行コード(\r\n/\r/\n)、これらについて<br />のように6文字として扱えばcolumnのデータも途中で破棄されずに済みます。
しかしながら、ブログツールのように一度DBに登録した内容を再編集のために再度<textarea>内に表示させるにはpreg_repaceなどで置換が必要であるため、改行コードを<br />としてINSERTしてしまうのは2度手間のように感じていました。また、過去のことで情報の出所は忘れてしまいましたが、ユーザーの入力データをDBに登録する時には生データの方が扱いやすい場合もあるということで、極力変換せず、不正コードは除去した後、生のままINSERTした方がよいという考えがありました。

また、なぜ「改行文字を1文字として扱いたいのか」という考えにたどり着いたのかといいますと、私が参考にしているWEBシステムで、入力した文字数をカウント表示し、視覚的に今何文字入力しているのか確認できるようJavascriptで実装していたためです。一応Javascriptを勉強するためにオライリーの本を購入し、「onkeyup」でカウント、そして表示。その際、改行文字がブラウザによって異なるため、参考サイト同様に改行文字については1文字と解釈させて表示しました。

この文字数カウントの仕様については、ユーザーサイド、サーバーサイドで同じ動作をさせることが可能になったのですが、いざDBに登録したところ、ブラウザによっては改行コードが2文字で登録され本来登録されるべき文字列が破棄されてしまう事態となってしまった次第です。

実際、企業運営のWEBアプリで文字数をカウントするJavascriptが実装されている例が多く、また、改行文字を1文字で扱っているところもあったため、DBにINSERTする際、文字列が破棄されないようにするためには、どのような方法があるのか知りたかったのです。

回答の件に戻りますが、確かに<br />として扱えば問題は解決します。しかし、訪問者がいざ入力する時、「改行文字は6文字として解釈している」という仕様に違和感は感じないものでしょうか?ウチのサイトではそういう仕様!というふうに言いきってしまえば解決はするのですが・・・。

投稿日時 - 2012-08-05 23:04:42

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問