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