[PHP-users 8042] Re: \マークの置き換え(自己解決です。)

Mashiki php-users@php.gr.jp
Tue, 11 Jun 2002 14:19:24 +0900


 Mashikiです。

>$sql = ereg_replace("\\\\","", $sql);
>上記のようにして\マークを4つ並べることでできました。
>ですが、どうしてこうなるのか理解できません。
>
>どうして\マークを4つ並べなければいけないのでしょうか?

正規表現で、\は特殊な意味を持つため、文字としての「\」を
指定するために「\」でエスケープする必要があります。

そのため、ereg_replaceの第一パラメータに「\」を2つ指定しなければ
なりませんが、「\」マークはダブルクォート中で特殊な意味を持つため
「\」でそれぞれの「\」をエスケープしなければなりません。

都合、「\」が4つです。


> $sql = ereg_replace("\\\\","", $sql);

この場合でしたら、正規表現は不要なので

$sql = str_replace("\\","", $sql);

も同じです。また、藤井さんのおっしゃるように

$sql = stripslashes($sql);

は、より、やりたいことをストレートに表現する書き方だとおもいます。

また、

>insert into bookmark(title,url,comment,nickname,password) values
>('test','test','test','test','test')
>などのsql文だと
>insert into bookmark(title,url,comment,nickname,password) values
>(\'test\',\'test\',\'test\',\'test\',\'test\')
>となってしまうので置換したいと思いました。

このPHPの挙動が気に入らない場合、php.ini、.htaccess、httpd.confなどを
編集して、

magic_quotes_gpc 
参) http://jp2.php.net/manual/ja/configuration.php

の設定を変える。

なんてのも、FAQだったりしてます。


# 余計な心配ですが、フォームから
#  「dalete from bookmark」 や
#  「drop table member」 や
#  「select * from member;drop database xxxx」
# なんてのを間違って投げられないように、色々気を使ってくださいね。