PHPとMYSQLについての質問です。テキストエリアの内容をデーターベースへ登録しようとしているのですが¥一文字だとSQL文を発行した時にエラーになってしまいます。

¥¥のように2文字だとエラーは出ませんが登録された内容をHTMLにて読み込むと¥が1文字しか表示されません。
ちなみにテキストエリアに下記のデータを入力してHTML上で読み込んでみました。

¥test →estと表示
¥あいう →「あいう」と表示

初心者の為なぜこのような事になるのか分かりません。よろしくお願いします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2006/11/17 11:20:21
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:b-wind No.1

回答回数3344ベストアンサー獲得回数440

ポイント200pt

¥(バックスラッシュ)はSQL上で特別な意味を持ちます。

そのためそのままSQL文として使用してしますと意図しない動作になるはずです。

回避には mysql_real_escape_string 等の関数を使うと良いようです。

http://phpspot.net/php/man/php/function.mysql-real-escape-string...


なお、適切なエスケープ処理を行わなかった場合SQLインジェクションという脆弱性になりえます。

SQLインジェクションについては以下を参照してください。

http://www.atmarkit.co.jp/fsecurity/rensai/webhole02/webhole01.h...

http://www.php.net/manual/ja/security.database.sql-injection.php

id:purupuru820

ご指摘のようにエスケープ処理にて解決しました。ありがとうございました。

2006/11/17 11:19:07

その他の回答2件)

id:b-wind No.1

回答回数3344ベストアンサー獲得回数440ここでベストアンサー

ポイント200pt

¥(バックスラッシュ)はSQL上で特別な意味を持ちます。

そのためそのままSQL文として使用してしますと意図しない動作になるはずです。

回避には mysql_real_escape_string 等の関数を使うと良いようです。

http://phpspot.net/php/man/php/function.mysql-real-escape-string...


なお、適切なエスケープ処理を行わなかった場合SQLインジェクションという脆弱性になりえます。

SQLインジェクションについては以下を参照してください。

http://www.atmarkit.co.jp/fsecurity/rensai/webhole02/webhole01.h...

http://www.php.net/manual/ja/security.database.sql-injection.php

id:purupuru820

ご指摘のようにエスケープ処理にて解決しました。ありがとうございました。

2006/11/17 11:19:07
id:tobeoscontinue No.2

回答回数220ベストアンサー獲得回数59

ポイント100pt

文字の中には特別な意味を持つ文字が存在します。

'や"。\などもそうです。

しかしそうでは無くただ単に文字としたい場合に逆にそれを示す必要があります。それを示す文字が\です。

\aのように書くとaに何もするな(aそのもの)ということになります。


また逆にエスケープ文字といって\nはnそのものということではなく改行(0x0a)を意味します。

同じく\tはタブを意味します。ですから\testはタブ文字とestということになります。

\あいうの\あはあそのものと言うことになり、その後にいうが続くかたちになりあいうとなります。

\\は\をそのままという意味なので\だけになります。


このように文字列の中に特殊な意味を持つ文字が含まれていた場合、問題が起こる場合があるのでそれらの文字を無効(\を付加する)にするhttp://manual.xwd.jp/function.addslashes.html]addslashes()というのがあります。逆に戻すのがstripslashes()です。

PHPということはhtmlを出力するのでしょうからそれならhtmlspecialchars()で無害化したほうがいいように思います

id:purupuru820

大変参考になりました。ありがとうございました。

2006/11/17 11:19:31
id:katsube No.3

回答回数133ベストアンサー獲得回数7

ポイント10pt

SQLについてはb-windさんが書かれていらっしゃいますので以下の点について。

¥test →estと表示

¥あいう →「あいう」と表示

上記は¥が全角で書かれていますが、本来は半角でしたでしょうか?この場合、「\t」「est」といった具合に解釈された可能性があります。

「\t」を文字列中などで使用すると、PHPやその他のプログラム言語でたいていの場合「(水平)タブ」を意味しています。同様に「\n」と書くと改行を意味することになるため

  \next

と書くと

  (改行)

  ext

と表示されます。

回避方法は「\\test」などのように、\をエスケープしてやればOKです。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません