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()是一个 Drupal 方法,允许轻松执行 SQL 查询并返回一个数组,db_fetch_array()允许解析结果。

现在,DB 包含以下 fname 条目(还有更多,这些只是示例):

  • 双歧杆菌 1
  • 双歧杆菌 2
  • 桂达 1
  • 桂达 2

如果我以“guida”作为键启动脚本,它会正确返回 PHP 和 MySQL 的两个条目。如果我使用“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);

它可能看起来很疯狂,但这是正确数量的%标志。两个用于每个文字%,一个 ( %s) 用于字符串占位符

于 2012-12-12T16:07:41.820 回答