• 締切済み

symfonyのCriteriaで実行すると、入力値にバックスラッシュが入る

表題の件で質問させてください。 現在、symfony version 1.0.8 にて開発を行っています。 MySQLに接続して、検索SQLを実行しているのですが、どうもカタカナが混じっていると検索にヒットしません。 そこでSQLを print_r(TableNamePeer::doSelectRS($criteria)); で表示させてみたところ、magic_quotes_gpcがOn の時のように、バックスラッシュが含まれていました。 ・htaccess で、magic_quotes_gpcはOffにセットしています。 ・$pear_data_dir/symfony/config/php.yml のmagic_quotes_gpcも offになっています。 バックスラッシュは下記のような感じで付け加えられてしまっています。 ソフト→\ソフ\ト どこをいじれば治るのか、調べ切れなかったのでご存知の方がいらっしゃったら、ご教授下さい。 宜しくお願い致します。

みんなの回答

  • inu2
  • ベストアンサー率33% (1229/3720)
回答No.1

shift_jisをやめれば直ります。 shift_jisの ソ などの 文字コードと \ の文字コードがかぶっているために起こる現象です。 http://ja.wikipedia.org/wiki/Shift_JIS#2.E3.83.90.E3.82.A4.E3.83.88.E7.9B.AE.E3.81.8C5C.E7.AD.89.E3.81.AB.E6.88.90.E3.82.8A.E3.81.86.E3.82.8B.E3.81.93.E3.81.A8.E3.81.AB.E3.82.88.E3.82.8B.E5.95.8F.E9.A1.8C magic_quotes_gpc = off にするのは。php遣いの中では当然の処理です。

u_713
質問者

お礼

ご回答ありがとうございます。 文字コードは、UTF-8で設定しているつもりなのですが、どこかの処理でshift_jisになってしまっているという事でしょうか? フォームで受け取った値を、$criteria にaddしているんですが、直前で$_POSTなどで表示させてみると、バックスラッシュはついていません。 もう少し調べてみます。

u_713
質問者

補足

ソースを追って調べてみたところ、mysql_real_escape_string でバックスラッシュがついていました。 ただ、上記は shift_jis の問題との事なのですが、文字コードはUTF-8に設定されています。 mysql_real_escape_string する前に、下記で試しました。 ------------------------- echo $str."<br>"; echo get_magic_quotes_gpc()."<br>"; echo mb_detect_encoding($str)."<br>"; echo implode(", ", mb_detect_order())."<br>"; echo mysql_real_escape_string($str, $con)."<br>"; ------------------------- 結果 ------------------------- ソフト 0 UTF-8 UTF-8, ASCII, JIS, EUC-JP, SJIS \ソフ\ト ------------------------- また、データベースの問題化と思い show variables like 'character%'; で調べてみたのですが、結果は下記の通りになりUTF-8に設定されています。 | character_set_client utf8 | character_set_connection utf8 | character_set_database utf8 | character_set_filesystem binary | character_set_results utf8 | character_set_server utf8 | character_set_system utf8 他に確認するところはありますでしょうか? 宜しくお願いします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • magic_quotes_gpcの設定がおかしいのでしょうか

    magic_quotes_gpcをoffにしたいと思いますが.htaccessで設定するとInternal Serviceエラーになってしまいます。 おそらく.htaccessの設定コマンドの記述が間違っているのだろうと見当はつくのですが、自分で考えても修正部分が見つけられません(汗) 原因を教えていただけないでしょうか。 <.htaccessの記述内容> php_flag magic_quotes_gpc off <PHPバージョン> PHP Version 4.3.2

    • 締切済み
    • PHP
  • バックスラッシュの対策について

    formでデータを送信するとバックスラッシュが入ってしまうので、stripslashes()で処理しています。 POSTでデータを送信しているのですが、 $prmarray_post = $_POST; $data1 = stripslashes($prmarray_post["data1"]); というような処理だと大丈夫なのですが、受け取るデータがいくつもあるので function cnv_formstr($array) { foreach($array as $k => $v){ if (get_magic_quotes_gpc()) { $v = stripslashes($v); } $v = htmlspecialchars($v, ENT_QUOTES); $$k = $v; } return $array; } $prmarray_post = cnv_formstr($_POST); $data1 = $prmarray_post["data1"]; という感じでやりたいのですが、これだとうまくいきません。 どのようにすればよいのでしょうか。 よろしくお願いしますm(__)m

    • ベストアンサー
    • PHP
  • PHP+MySQLでエスケープされたデータを格納したい。

    php.iniの設定でmagic_quotes_gpc = Offにして、 mysql_real_escape_stringで出力エスケープしたデータを MySQLに格納するとバックスラッシュが格納されない。 エスケープされたデータを格納したいです。 php.iniの設定 --------------------------------------------------------- ; Magic quotes for incoming GET/POST/Cookie data. ; magic_quotes_gpc = On magic_quotes_gpc = Off ; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc. magic_quotes_runtime = Off ; Use Sybase-style magic quotes (escape ' with '' instead of '). magic_quotes_sybase = Off --------------------------------------------------------- $_POST['us_fname']には「'user'」という文字列が格納されています。 --------------------------------------------------------- $clean['us_fname'] = $_POST['us_fname']; $mysql['us_fname'] = mysql_real_escape_string($clean['us_fname']); $sql = "insert into table ( us_fname ) values ( '".$mysql['us_fname']."', ) "; --------------------------------------------------------- echo $mysql['us_fname']; で確認すると「\"user\" 」となっているんですが、 MySQLの中を確認すると「'user'」のままでシングルクォートがエスケープされていません。

    • ベストアンサー
    • PHP
  • .htaccessでmagic_quotes_gpcの値を変更できない

    .htaccessファイルに下記の内容を記述して、magic_quotes_gpcの値を変更したいのですが、変更内容が反映されません。 php_flag magic_quotes_gpc off (php.iniで指定すると変更内容が反映されることは確認済みです) magic_quotes_gpcの属性は、「PHP_INI_PERDIR」なので.htaccessファイルから変更できると思うのですが・・・。 環境は以下のとおりです。 OS:WindowsXP サーバー:XAMPP 1.6.4(PHP5、apache2.2) 原因について何かご存知の方がいらっしゃいましたら教えてください。 よろしくお願いいたします。

  • magic quotes gpcに関する.htaccessの設定について

    こんばんは。最近、phpでスクリプトを作成しているのですが どうしても、magic_quotes_gpcをoffにしなければならない状況になってしまい、変更しようと四苦八苦しています。レンタルサーバーのため、php.iniではなく、.htaccessでしか変更が出来ないことはわかり、 <IfModule mod_php4.c> #インクルードパスの設定 php_value include_path ".:/usr/local/lib/php:/html/_incs_" #不用意なエラーレポート出力をさせないようにする #必要に応じて「ini_set("display_errors", 1)」を使うのがベター php_flag display_errors Off php_flag magic_quotes_gpc Off #「mbstring」関係の設定 php_value mbstring.language "Japanese" php_value mbstring.internal_encoding "EUC-JP" php_flag mbstring.encoding_translation Off </IfModule> のように、書き込み、サーバーにアップロードしたのですが、phpinfo()で確認したところ、magic_quotes_gpc欄がonになったままであり、.htaccessが機能しておりません。 私の書き方に問題があるのでしょうか?何か問題点等があれば指摘をお願いします。また、私の考えが根本的に間違っていた場合、簡単な知識から教えてくれると助かります。 余談かもしれませんが、.htaccessはサーバーで、利用可能となっています。

    • 締切済み
    • PHP
  • magic_quotes_gpcが有効になっている時に

    特定のPHPファイルを実行している間だけ magic_quotes_gpc=Off にできないでしょうか?

    • ベストアンサー
    • PHP
  • addslashesを使用したDBの登録内容

    <input type='text'・・の入力フィールドを含むPHPファイルを作成しました。このフィールドで入力された値を受け取りDB(postgreSQL)にinsertします。 この値を登録する前に、addslashes関数を通しています。 入力値:\500とした場合 DB(psqlコマンドでselectした)値:\\500 となるかと予想していたのですが、 (実際にバックスラッシュを挿入した文字列がDBに登録されるのかとおもっていました) DB(psqlコマンドでselectした)値:\500 と登録されます。 この登録内容が正常動作なのでしょうか。 addslashesを通さずにinsert文を発行すると、確かにDBエラーとなるので、addslashesは有効にはなっているかと思います。 長文で申し訳ありません。宜しくお願いいたします。 PHP 4.3.4 postgreSQL 7.3.6 php.ini のmagic_quotes_gpc = Off の環境です。

    • ベストアンサー
    • PHP
  • カタカナ小文字「ァ」の、検索時の文字化けで困っています。

    はじめまして。 現在、検索結果が表示されるページを制作しているのですが、その際、 カタカナ小文字の「ァ」が入っているキーワードで検索したときに、 検索キーワードの表示のところで、下記のように文字化けが起こってしまって、困っています。 (「ヴァージニティ」→「ヴ 璽献縫謄 」) Google検索しても、解決法を見つけることができませんでした。 magic_quotes_gpcの設定は、開発環境ではOff、本番環境ではOn(レンタルサーバのデフォルトの設定)にしているのですが、 if (isset($_GET['keyword'])) { $keyword = (get_magic_quotes_gpc()) ? $_GET['keyword'] : mysql_escape_string($_GET['keyword']); $keyword = mb_convert_kana($keyword, "aKV"); } のように、magic_quotes_gpcの設定が「ON」であるときと「OFF」であるときの両方の設定を記述しています。 PHP、データベース共に文字コードはEUCで統一しています。 レンタルサーバなので.htaccessを使用して、下記のように設定しています。 php_flag output_buffering off php_value default_charset EUC-JP php_value mbstring.language Japanes php_flag mbstring.encoding_translation on php_value mbstring.http_input EUC-JP php_value mbstring.http_output EUC-JP php_value mbstring.internal_encoding EUC-JP php_value mbstring.substitute_character none php_value mbstring.detect_order EUC-JP,SJIS,JIS,UTF-8,ASCII 文字化けが生じる、表示部分のphpの記述ですが、 if($keyword != ""){ $keyword = mb_convert_encoding($keyword, "EUC-JP"); echo htmlspecialchars(stripslashes($keyword)); } のように記述しています。 ちなみに、「ッ」のような他のカタカナ小文字が入っているキーワードでは、正常に検索結果が表示されます。 どうぞよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • stripslashesが効かない!?

    こんにちは。PHP初心者です。 わたしが利用しているサーバではget_magic_quotes_gpcがONになっているので、以下のような関数を作成し、付加された「\」を削除するようにしました。 function no_magic($no_magic) { if (get_magic_quotes_gpc()) { stripslashes($no_magic); } return $no_magic; } $test = 'C:\\test\\directory\\test.txt'; $sample = '\"quote\" and \"引用\"'; echo no_magic($test); // C:\test\directory\test.txtと表示される echo no_magic($test); // "quote" and "引用"と表示される 上記のようなテストでは、意図したとおりに付加されたバックスラッシュが相殺されるのですが、実際にPOSTやGETで文字列を取得して処理をしようとすると(あるいはSESSIONに一旦保存した文字列を取得)「stripslashes」がまったく効いていないようなのです。 ※下記は、あくまで例です(POSTとGETを同時に受け取ろうとしている訳ではありません)。 $test_get = $_GET['test']; $sample_post = $_POST['sample']; echo no_magic($test_get); // C:\\test\\directory\\test.txtと表示される echo no_magic($sample_post); // \"quote\" and \"引用\"と表示される いったい何が起こっているのでしょうか。 また、どのように対処したらこの問題を回避できるのでしょうか。 どなたか、詳しい方がいらっしゃったら、ご教示いただけないでしょうか。 (現状では、仕方がないのでstr_replace()で「\"」を「"」に「\\」を「\」に置換しています) よろしくお願い致します。

    • ベストアンサー
    • PHP
  • 検索機能ソースの脆弱性に関して

    以前こちらでPHPの検索機能のソースに関して質問させて頂いた者です。そのときに、作成したソースに「SQLインジェクション」の可能性があるとのご指摘を受けたのですが、下記のソースを見ていただいて、どこに脆弱性があるのか、わかる方がおられましたら是非教えていただきたく存じます。 拙い知識ながらも、本等で調べて、$_POST['key']で受け取ったデータを、get_magic_quotes_gpcの設定がOFFの場合は、addslashes関数でエスケープ処理をする設定にしたのですが、フォームの入力値に「str' or '1'='1」のようなSQLインジェクション確認用の文字を入れたり、ソースの検証を自分で行った限りでは、エラーが発見できなかったのですが、どこがまずいのでしょうか? ご教示いただけますよう、宜しくお願いいたします。 検索フォーム <form method="post" action="view.php"> <input type="text" name="key"> <input type="submit" name="search" value="検索"> </form> ログ表示PHP(view.php) $key = "%"; if (isset($_POST['key'])) { $key = (get_magic_quotes_gpc()) ? $_POST['key'] : addslashes($_POST['key']); } $sql = "SELECT * FROM shop WHERE todohuken='XX' "; if(strlen($key) > 0){ $key = str_replace(" ", " ", $key); $array = explode(" ", $key); $and = "AND "; for($i=0; $i<count($array); $i++){ $and .= "address LIKE '%$array[$i]%'"; if($i < count($array)-1){ $and .= " AND ";   }  } } mysql_select_db($database_connDB, $connDB); $Recordset1 = mysql_query($sql.$and.";", $connDB) or die(mysql_error());

    • ベストアンサー
    • PHP