- - PR -
PEARのMDB2でクエリを実行したけれども検索結果がNULL
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2008-01-23 12:11
こんにちは、EarlyHeroです。
PHPで開発中です。 PEARのMDB2(mySQL用ドライバ使用)で「queryOne」を使ってある値を 取得しようとしています。 検索条件にエスケープ文字が含まれていない場合は問題なく検索できるのですが、 エスケープ文字が含まれている場合は検索に失敗してしまいます。 そこで参照URLに記載されているMDB2の「escape」を使って検索条件に エスケープ処理をしたのですが、何故か検索結果がNULLになってしまいます。 何が原因なのかが全く分からず困っています。 実行するクエリは以下のようなクエリです。 SELECT BIKO FROM USER_DATA WHERE USER_CD = '\\\\2' 「escape("\2",true)」の戻り値が「'\\\\2'」なので上記のような クエリになっています。 ちなみに「escape("\2",false)」にすると「'\\2'」になります。 mySQLのGUIツール上では問題なく「BIKO」の値を検索できますが、 MDB2経由だと意図している検索結果になりません。(NULLになる) また、検索だけでなく、登録や更新の処理も失敗してしまいます。 原因や解決方法をご存知の方がいらっしゃったらご教授下さい。 以上、宜しくお願い致します。 [ メッセージ編集済み 編集者: EarlyHero 編集日時 2008-01-23 14:14 ] |
|
投稿日時: 2008-01-23 12:35
quoteではダメですか?
$jouken = '\2'; // こういうことですよね?(単引用符で括ること) $sql = 'SELECT BIKO FROM USER_DATA WHERE USER_CD = ' . $mdb2->quote($jouken, 'text'); $res =& $mdb2->exec($sql); #会議室が・・ってレスしたあとで気付いた(汗)。PEARですからphpですよね? (追記) ちなみにescapeの第二引数をtrueにしたということは「\」をワイルドカードとして認識させたい・・ということですよね?実際には「どういう条件」なんでしょう? http://pear.plus-server.net/package.database.mdb2.intro-quote.html [ メッセージ編集済み 編集者: shimix 編集日時 2008-01-23 13:34 ] |
|
投稿日時: 2008-01-23 13:59
shimixさん、ご返答ありがとうございます。
quoteを使うと「\2」が「'\\2'」になりますが、 $mdb2->queryOne($sql); で実行するとやっぱりNULLが戻ってくるんです。 $sqlを画面に出力してコピーしたクエリをmySQLのGUIツールで実行 しましたが、問題なく値が取得できるのでクエリ自体に問題はないと 思っています。 ちなみに「会議室が…」とのことですが、PHPだとどこが適切でしょうか? >(追記) >ちなみにescapeの第二引数をtrueにしたということは「\」をワイルドカード >として認識させたい・・ということですよね?実際には「どういう条件」 >なんでしょう? >http://pear.plus-server.net/package.database.mdb2.intro-quote.html (回答) データ内に「%」「_」が含まれていることで、LIKE検索でエラーや誤検索 になったり、「\」が含まれていることで検索・登録・更新に失敗したり しなければよいです。 そのために「escape」を使っています。「escape」を使ってからは エラーではなくNULLが戻ってくるようになりました。 「\」をワイルドカードとして認識させたいというわけではないです。 以上、宜しくお願い致します。 [ メッセージ編集済み 編集者: EarlyHero 編集日時 2008-01-23 14:11 ] |
|
投稿日時: 2008-01-23 20:03
こんばんわ、EarlyHeroです。
問題が解決しましたので報告致します。 原因は文字コードの違いでした。 現在検索しようとしているデータはmySQLのGUIツールから登録したもので、 そのデータは「UTF-8」で登録されています。 しかし、PHPから検索するときは「Shift-JIS」なので、「\」を違う文字として 変換しているようなので、検索条件が一致せずにNULLが返ってきていました。 ちなみに、Shift-JISで「\」は「/」(大きい「\」マルチバイト文字)に 変換されていました。 以上、宜しくお願い致します。 |
1