• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:stringaddslashes 半角¥が消える)

stringaddslashes 半角¥が消える

このQ&Aのポイント
  • 変数をSQL文のinsertを用いてDBに格納する際、アポストロフィの入った変数ではinsertが正常に行われず、レコードが作成されない問題が発生しました。
  • mysql_real_escape_stringaddslashes 関数を使用することで、アポストロフィも正常に格納されるようになりましたが、半角バックスラッシュを含む文字列は消えてしまいます。
  • エスケープのためにバックスラッシュを置き換える方法を試しましたが、うまくいきませんでした。最悪の場合はaddslashesを使用する必要がありますが、セキュリティ上の懸念もあります。

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

  • ベストアンサー
  • shimix
  • ベストアンサー率54% (865/1590)
回答No.2

今現在、どういう手順でDBに格納されていますか?「mysql_real_escape_stringaddslashes」という関数はありませんが、mysql_real_escape_stringとaddslashesを両方通しているわけではありませんよね。mysql_real_escape_stringのみということでよろしいでしょうか。   ・http://jp2.php.net/manual/ja/function.mysql-real-escape-string.php たとえば、下記のようなテストソースで確認すると、問題なくinsertされます。 <?php mysql_connect('localhost', 'username', 'password'); mysql_select_db('database'); // リテラル $sql = sprintf("insert into testtable (id, a, b) values (%d, '%s', '%s')", 1, mysql_real_escape_string('\100'), mysql_real_escape_string('it\'s fine day')); mysql_query($sql) or die(mysql_error()); // 変数 $id = 2; $a = '\123,456'; $b = 'it\'s rainy day'; $sql = sprintf("insert into testtable (id, a, b) values (%d, '%s', '%s')", $id, mysql_real_escape_string($a), mysql_real_escape_string($b)); mysql_query($sql) or die(mysql_error()); // 結果確認 $sql = "select * from testtable"; $res = mysql_query($sql) or die(mysql_error()); while ($row = mysql_fetch_array($res)) { print "<pre>"; print_r($row); print "</pre>"; print "<hr>"; }

raryrary
質問者

お礼

ごめんなさい。 なぜかできました。 質問にあげたソースより前のほうに、 別の作業で(メール送信用) if (get_magic_quotes_gpc()==0){$var = stripslashes($var);} とかいてあったたところを if (get_magic_quotes_gpc()){$var = stripslashes($var);} に直したところ、Mysqlのほうも直りました。原因はわかりません・・・。

raryrary
質問者

補足

>mysql_real_escape_stringとaddslashesを両方通しているわけではありませんよね。mysql_real_escape_stringのみということでよろしいでしょうか。 ごめんなさいコピペミスです。 mysql_real_escape_stringのみです。 こんなソースです。 ※magic_quotes_gpc=off ※文字コードはUTF-8 ※サーバーはさくらインターネット ------------- if(get_magic_quotes_gpc()) { function mres($str){ return mysql_real_escape_string(stripslashes($str)); } }else{ function mres($str){ return mysql_real_escape_string($str); } } $Pt_data = mres($_POST['変数']); $Pt_data = mb_convert_kana($Pt_data, "K", "UTF-8"); $Pt_data = preg_replace('/&/','&',$Pt_data); $sql = "INSERT INTO `tb` ('$Pt_data') VALUES ('$Pt_data')"; $ret = mysql_query($sql); if($ret){ print "<p">入力できました</p>";} else { print "<p"></p>";} --------------- formの変数に 「\100\\100」といれると、「100\100」と表示されます。

その他の回答 (4)

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.5

#2です。 >if (get_magic_quotes_gpc()==0){$var = stripslashes($var);} > >とかいてあったたところを > >if (get_magic_quotes_gpc()){$var = stripslashes($var);} > >に直したところ、Mysqlのほうも直りました。原因はわかりません・・・。 get_magic_quotes_gpcのチェックが逆ですよね。最初のソースではmagoc_quotes_gpcがoff(つまり、== 0 が真)の環境なのに、stripslashesを通してしまっているので「\」は落ちて当然です(magic_quotes_gpcで付加されたと判断されてしまう)。この時点でおかしくなっているわけですから、SQL文を生成する前の段階の各変数の値をprintしていればmysqlへ格納するときのescape処理の問題じゃないことはわかったと思います。 とはいえ、格納前には(addslashesではなく)mysql_real_escape_stringを通すべきですから、結果的には良かったのかもしれません。

raryrary
質問者

補足

そうなんです、 >if (get_magic_quotes_gpc()==0){$var = stripslashes($var);} は完全に逆ですよね、もしつけるなら  if (get_magic_quotes_gpc()==0){$var = addslashes($var);}  をしたうえで、エスケープ? それは完全にミスだったのですが、 私が疑問なのは、メール送信用に記述したものと 完全に別のソースなのになぜか >if (get_magic_quotes_gpc()==0){$var = stripslashes($var);} を通過しているみたいなんです。 通過した後で、あらためて$_POST[変数]と読み込んでいるのにもかかわらず。です。

回答No.4

私だったらmysql_real_escape_string()はデータベースに突っ込む直前に掛けます。 つまり $Pt_data= mres($_POST['変数']); $Pt_data= mb_convert_kana($Pt_data, "K", "UTF-8"); $Pt_data= preg_replace('/&/','&',$Pt_data); ではなく、 $Pt_data = $_POST['変数']; $Pt_data= mb_convert_kana($Pt_data, "K", "UTF-8"); $Pt_data= preg_replace('/&/','&',$Pt_data); $Pt_data= mres($Pt_data); てな順番で。

raryrary
質問者

お礼

ありがとうございます。 本件とは直接関係なさそうですが、このやり方も参考にします!

  • bm_hiro
  • ベストアンサー率51% (200/388)
回答No.3

↓これを回答した(もはや質問者さんとの交換日記状態で誰も読まないと思う)関係で、ちょっと この質問にも回答させていただきたいと思います。 http://questionbox.jp.msn.com/qa7060370.html んで、#2の補足 見ました。 ↓ここ if(get_magic_quotes_gpc()) { function mres($str){ return mysql_real_escape_string(stripslashes($str)); } ん?stripslashes?? ここで円マーク 削っちゃってません? あー、俺が これ書いてる間に #2にお礼もついてますね。 > に直したところ、Mysqlのほうも直りました。原因はわかりません・・・。 stripslashes() を通ってないから直ったんですよー。っと思います。

raryrary
質問者

補足

交換日記、SQLインジェクションなどの勉強になりそうなので また時間をとって読んでみます。 みなさまへのお礼はまた改めて。今日は野球を見せてください。

  • pQ2MZc53
  • ベストアンサー率12% (1/8)
回答No.1

> どうもaddslashesのほうはセキュリティ上、前者に劣るとも聞きましたので、 どこかで聞きかじった情報じゃなくて、公式ドキュメントを見れば済む話なのに…が率直な感想です。 mysql_real_escape_string http://php.net/manual/ja/function.mysql-real-escape-string.php 引用 mysql_real_escape_string() は、MySQL のライブラリ関数 mysql_real_escape_string をコールしています。 これは以下の文字について先頭にバックスラッシュを付加します。 \x00, \n, \r, \, ', " そして \x1a. addslashes http://php.net/manual/ja/function.addslashes.php 引用 データベースへの問い合わせなどに際してクォートされるべき文字の前に バックスラッシュを挿入した文字列を返します。 クォートされるべき文字とは、シングルクォート('), ダブルクォート("),バックスラッシュ (\) ,NUL (NULL バイト) です。