【php】addslashesとmysql_real_escape_stringって何が違うの
問題
phpの関数のaddslashesとmysql_real_escape_stringって何が違うの?
答え
SQLに渡すデータのエスケープに気を付けている方はaddslashes関数とmysql_real_escape_string関数の違いが気になったことがあると思います。
単純にエスケープしてくれる文字がMySQL用にちょっと違う(改行を\nにしてくれるなど)のと、接続しているクライアント側の文字コードを考慮して適切にエスケープしてくれる機能があります。
addslashes関数では何が問題なのかというと、日本語のShift_JISや中国語のGBKなど文字の最後のバイトに16進アスキーコード 5c =\(バックスラッシュ) が含まれる可能性のある文字コードを使用すると、エスケープした時のバックスラッシュと前の1バイトがくっついて、別の文字になることがあるのが問題。
\x95' (アスキーコード0x95とシングルクォート) を 文字コードを考えずに単純にaddslashesでエスケープすると、 \x95\x5c' になって \x95\x5c はShift_JISの「表」という文字を表しているので、 表' となって、シングルクォーテーションを混入させられる → 事件発生
日本語なら、全部UTF-8のシステムや、EUCでは、addslashesでエスケープしても事件はおきなさそうではあります(5C問題はない文字コード)。
以上のように違いはあるにしても、
で、いまどきはどうするんだい?っていうと、プリペアドステートメント使うのが一般的。
$db = new PDO('接続情報'); $s = $db->prepare('select * from xxx where id = ?'); $s->execute(array('文字列文字列')); $row = $s->fetch();
わざわざ自分でエスケープしない。
コメント