海外旅行から帰ってきたら、まず何を食べる?

$sql = INSERT INTO users (logid, passwd) VALUES (
"'" . mysql_real_escape_string($_POST['id']) "','" . mysql_real_escape_string($_POST['pas']) . "';"
とすると全POSTデータの先頭に「\r\n」が付与されてしまいます。
INSERT INTO users (iogid, passwd) VALUES ('\r\n 入力されたID', '\r\n 入力されたパス')
こんな感じになってしまいます。
SQL実行時にデータベースに入ってしまっているのか、
phpMyAdminで確認すると、文章内に改行が入ってしまっているみたいで、表のレイアウトがガタガタになっています。
SQLインジェクション対策に必要だと参考書には表記されているのですが、あまりにデータベースが見にくいので、私の使い方が間違っている様な気がします。
(1)\r\nが先頭に付与されるのは正しいのでしょうか?
(2)データベースにSQLで\r\nをINSERTしると、データも\r\nが入ってしまうのでしょうか?
(3)PHP + MySQLでSQLインジェクション関数はmysql_real_escape_stringだけなのでしょうか?

なにぶん超初心者なので、ご教授の程よろしくお願いいたします。

A 回答 (2件)

(1) 何らかの原因で、 $_POST['id'] や $_POST['pas'] の先頭に改行が入っているのだと思います。

引数の文字列に改行が無ければ入らないと思います。
(2) \r\nは改行文字(Windowsタイプ)をエスケープしたものなので、改行が入ります。
(3) SQL用の文字列エスケープ関数は各DBMS向けにいろいろ有るようですが、MySQL向けは mysql_real_escape_string() になるかと。

なぜ $_POST['id'] や $_POST['pas'] に改行が入っているのかを突き止めて、それを修正されるのがよろしいかと。
例えば、入力フォームが textarea になっているなど、様々なことが考えられます。

とりあえず、DBに入れるデータの先頭から改行を取り除きたいのであれば、trim()を使えばできると思います。
例) ---------------------------------------------------------------
mysql_real_escape_string(trim($_POST['pas']))
-------------------------------------------------------------------
trim() では、文字列の先頭や末尾のホワイトスペース(スペース、タブ、改行など)を取り除かれるので、注意してください。

参考URL:http://jp.php.net/manual/ja/function.trim.php
    • good
    • 0
この回答へのお礼

ご教授ありがとうございます。
なるほど~ tirm関係の関数で削除してから
mysql_real_escape_stringすれば良かったんですね。
$_POST['id']や$_POST['pas']はTEXTBOXで作っており、
入力はテストで自分でした為、先頭に改行は入力していませんでした。

なぜ改行文字が入ってしまうかは、さておいて
trimで解決できそうです。
本当にありがとうございました。

お礼日時:2009/04/15 11:01

例えば以下のように変数に値を代入すると先頭に改行が入りますが、


同じ状況で改行が入っている可能性もあります。
$str = "
data";

試しにSQL文を作っている部分を1行で書いてみるとどうでしょうか?

$_POSTと$sqlをvar_dumpすると解決へ近づきそうです。
改行の有無を確認するため、<pre>タグ内に出すようにするか、htmlソースで確認する必要があります。

この回答への補足

ご教授ありがとうございます。
SQLにして出力してみると、
INSERT INTO users (logid, passwd) VALUES (
'\r\npostid' ,'\r\npostpassword')
になっていました。
なんとか\r\nを削除しないとダメみたいですねm(_ _)m

補足日時:2009/04/15 10:53
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!