0

MySQL データベースで次のクエリを実行しています (SELECT AND WHERE を見てください。残りは重要ではありません)。

SELECT distinct fname //more fields...
FROM filedepot_files AS ff 
INNER JOIN filedepot_categories AS fc 
ON ff.cid = fc.cid 
INNER JOIN filedepot_access AS fa 
ON fc.cid = fa.catid 
WHERE fa.permid=$id AND fname LIKE '%$key%' 
ORDER BY DATE

この環境は、Drupal と FileDepot モジュールで実行される PHP スクリプトですが、それが問題になるとは思えません。

これはPHPスクリプトです(重要な部分です):

$id = 1;
$key = $_GET['key'];
$query = .... (see above)
$result = db_query($query);
while($row = db_fetch_array($result)){
    //do stuff
    echo $row['fname'];
}

db_query()は、SQL クエリを簡単に実行できる Drupal メソッドであり、配列を返し、db_fetch_array()結果を解析できます。

現在、DB には fname の次のエントリが含まれています (他にもありますが、これらは単なる例です)。

  • ジキアラツィオン 1
  • ジキアラツィオーネ 2
  • ガイド1
  • ガイダ 2

「guida」をキーとしてスクリプトを起動すると、PHP と MySQL の両方で 2 つのエントリが正しく返されます。「Guida」を使用すると、同様に機能します。ただし、「dichiarazione」を使用すると、PHP では使用できませんが、MySQL では使用できません。奇妙なことに、"Dichiarazione" は PHP と MySQL の両方で動作します。

クエリの何が問題になっていますか? 使用してみましLOWER(fname) LIKE '%$key%'たが、意図したとおりに動作しないようです。

私が見逃している愚かなものがあると確信していますが、それが何であるかを見つけることができないようです...

4

1 に答える 1

2

%Drupal クエリの特殊文字です (プレースホルダーに使用されます)。ダブルエスケープしてみてください:

WHERE fa.permid=$id AND fname LIKE '%%$key%%' 

さらに心配なのは、SQL インジェクションに対して無防備です。いくつかの消毒が必要です:

...
WHERE fa.permid= %d AND fname LIKE '%%%s%%' 
...

$query = db_query($sql, $id, $key);

クレイジーに見えるかもしれませんが、これは適切な数の%兆候です。リテラルごとに 2 つ、文字列プレースホルダー用に%1 つ ( )%s

于 2012-12-12T16:07:41.820 に答える