我正在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


该环境是在带有FileDepot模块的Drupal下运行的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%',但它似乎未按预期工作。

我敢肯定我缺少某种愚蠢的东西,但我似乎无法找到那是什么...

最佳答案

%是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

10-08 08:01
查看更多