人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHPとMYSQLについての質問です。テキストエリアの内容をデーターベースへ登録しようとしているのですが¥一文字だとSQL文を発行した時にエラーになってしまいます。
¥¥のように2文字だとエラーは出ませんが登録された内容をHTMLにて読み込むと¥が1文字しか表示されません。
ちなみにテキストエリアに下記のデータを入力してHTML上で読み込んでみました。

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

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

●質問者: purupuru820
●カテゴリ:インターネット ウェブ制作
✍キーワード:HTML MySQL PHP SQL test
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● b-wind
●200ポイント ベストアンサー

¥(バックスラッシュ)は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

◎質問者からの返答

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


2 ● tobeoscontinue
●100ポイント

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

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

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

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


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

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

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

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


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

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

◎質問者からの返答

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


3 ● katsube
●10ポイント

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

¥test →estと表示

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

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

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

\next

と書くと

(改行)

ext

と表示されます。

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ