- PR -

PEARのMDB2でクエリを実行したけれども検索結果がNULL

1
投稿者投稿内容
EarlyHero
常連さん
会議室デビュー日: 2007/03/16
投稿数: 37
お住まい・勤務地: 福岡県
投稿日時: 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 ]
shimix
ぬし
会議室デビュー日: 2004/08/05
投稿数: 512
お住まい・勤務地: 大分市
投稿日時: 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 ]
EarlyHero
常連さん
会議室デビュー日: 2007/03/16
投稿数: 37
お住まい・勤務地: 福岡県
投稿日時: 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 ]
EarlyHero
常連さん
会議室デビュー日: 2007/03/16
投稿数: 37
お住まい・勤務地: 福岡県
投稿日時: 2008-01-23 20:03
こんばんわ、EarlyHeroです。

問題が解決しましたので報告致します。
原因は文字コードの違いでした。

現在検索しようとしているデータはmySQLのGUIツールから登録したもので、
そのデータは「UTF-8」で登録されています。
しかし、PHPから検索するときは「Shift-JIS」なので、「\」を違う文字として
変換しているようなので、検索条件が一致せずにNULLが返ってきていました。

ちなみに、Shift-JISで「\」は「/」(大きい「\」マルチバイト文字)に
変換されていました。

以上、宜しくお願い致します。
1

スキルアップ/キャリアアップ(JOB@IT)