投稿者 メッセージ
<  PHPプログラミング  ~  ら行、や行などで改行すると¥rがついてくる?
take
投稿1時間: 水 4月 12, 2006 12:10 pm  引用



登録日: 2006年2月 01日
投稿記事: 21

こんにちわ。いつもお世話になっております。

HTMLの入力フォームからPHPを使ってMySQLに入力しているのですが、少しおかしなことになってしまいます。

テキストエリアからmysql_real_escape_string()関数を一度くぐらせてMySQLに入力しています。で、そのデータを今度はhtmlspecialchars()関数をくぐらせてそのあとnl2br()関数をくぐらせて呼び出すのですが、









というふうに行の終わりをら行、や行、わ行、ん、で改行すると

ら\r
り\r
や\r
よ\r
わ\r
ん\r


というふうに("\"は半角の¥です)表示されてしまいます。
なぜなのでしょうか?
これを改善する方法はありませんでしょうか?
すいませんがよろしくお願いいたします。
トップに移動
ユーザー情報を表示 メッセージを送信
ちぴ
投稿1時間: 水 4月 12, 2006 7:21 pm  引用



登録日: 2006年4月 05日
投稿記事: 14

や行、ら行・・・というのは不明ですが、mysql_real_escape_string()は、それを適用する文字列中に改行コード(\r\n,\r,\n)がある場合、先頭にバックスラッシュを付加します。
そのため、ブラウザで見ると、改行コードがそのまま表示されます。

↓参照
http://jp.php.net/manual/ja/function.mysql-real-escape-string.php

で、私の場合ですが、<textarea></textarea>からの入力値がある場合、つまり改行コードが含まれる可能性がある場合は、以下のようにします。

$_POST[ 'note' ]に改行コードが含まれるとします。

//エンティティはMySQLに入れる前にしましょう。
$note = trim(htmlspecialchars($_POST[ 'note' ]));

//Windows用改行コード置換
$note = ereg_replace("\r\n", "\n", $note);

//Mac用改行コード置換
$note = ereg_replace("\r", "\n", $note);

//改行コードを改行タグに変換
$note = ereg_replace("\n", "<br />", $note);

//サイニタイジング
$note = mysql_real_escape_string($note);

この処理をした上で、MySQLにinsertします。
これなら、出力時にnl2br()を使わずにすみます。
トップに移動
ユーザー情報を表示 メッセージを送信
take
投稿1時間: 金 5月 05, 2006 5:55 pm  引用



登録日: 2006年2月 01日
投稿記事: 21

できました!
どうもありがとうございます。

ちなみになんですが、この入力されたデータを今度は訂正したい場合に
MySQLから検索して
<textarea>の方に落としたいのですが、

echo "<textarea>".$_row[ 'note' ]."</textarea>\n";

とすると今度は<br />がそのまま残ってしまいます。
これを入力されたときの状態のように表示させるにはどのようにすればよいでしょうか?
トップに移動
ユーザー情報を表示 メッセージを送信
take
投稿1時間: 日 5月 07, 2006 11:10 pm  引用



登録日: 2006年2月 01日
投稿記事: 21

すいません。

$note = ereg_replace("<br />", "\n", $_row['note']);
とやって
echo "<textarea>".$note."</textarea>\n";
とやったらできてました。
この場合WinもMacも関係ないんですね。

ちなみになんですけどhtmlspecialchars()関数は「<」などを実態参照の「&lt;」などに変換する関数だと思うのですが、これの反対で実態参照を「<」などに戻すような関数というのは存在しないのでしょうか?
すいませんがよろしくお願いします。
トップに移動
ユーザー情報を表示 メッセージを送信
take
投稿1時間: 月 5月 08, 2006 12:47 am  引用



登録日: 2006年2月 01日
投稿記事: 21

すいません、勘違いしてました。
ちびさんのおっしゃるとおり、


//エンティティはMySQLに入れる前にしましょう。
$note = trim(htmlspecialchars($_POST[ 'note' ]));

//Windows用改行コード置換
$note = ereg_replace("\r\n", "\n", $note);

//Mac用改行コード置換
$note = ereg_replace("\r", "\n", $note);

//改行コードを改行タグに変換
$note = ereg_replace("\n", "<br />", $note);

//サイニタイジング
$note = mysql_real_escape_string($note);

この処理をした上で、MySQLにinsertします。
これなら、出力時にnl2br()を使わずにすみます。


のようにしてみたのですが、MySQLには実態参照されずに入力されているみたいです。で、出力時に実態参照を行うと<br />の部分もされてしまいおかしなことになってしまうのですが、実態参照のままの入力はできないものなのでしょうか?
トップに移動
ユーザー情報を表示 メッセージを送信
ちぴ
投稿1時間: 月 5月 08, 2006 4:47 pm  引用



登録日: 2006年4月 05日
投稿記事: 14

返事が遅くなりましてすみません。

Quote:
のようにしてみたのですが、MySQLには実態参照されずに入力されているみたいです。で、出力時に実態参照を行うと<br />の部分もされてしまいおかしなことになってしまうのですが、実態参照のままの入力はできないものなのでしょうか?


私が勘違いしていたら申し訳ないのですが、先に記した改行コードを改行タグに置換するスクリプトを適用した上で、さらに置換した改行タグをエンティティしてMySQLにinsertするということでしょうか?

そうであれば、改行コードを改行タグに置換する箇所を
$note = ereg_replace("\n", "&lt;br /&gt;", $note);

とすれば、意図した通りとなりますが、ブラウザへ出力時に、「&lt;」「&gt;」をereg_replace()等で「<」「>」に置換するのであれば、それはナンセンスではないかと思われます。
ちなみに、HTMLエンティティを記号に置換する標準関数は、PHPにはありません。

MySQLへinsert前にhtmlspecialchars()を適用しているので、出力時にhtmlspecialchars()を適用する必要はないと思いますし、MySQLのテーブル内にHTMLタグ(改行タグ)があっても、エンティティされた後に意図して置換したものなので、セキュリティ上問題ないかと思います。
トップに移動
ユーザー情報を表示 メッセージを送信
特定期間内の記事を表示:   
All times are GMT +9:00

次のトピックを表示
前のトピックを表示
Page 1 of 1
フォーラム一覧  ~  PHPプログラミング

トピックの新規投稿   返信


 
移動先:  

新規投稿: 不可
返信: 不可t
自分の記事の編集: 不可
自分の記事の削除: 不可
投票への参加: 不可




Powered by phpBB
customized by phpspot.