我在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条目(还有更多,这些只是示例):
如果我以“guida”作为键启动脚本,它会正确返回PHP和MySQL的两个条目。 如果我使用“Guida”它也可以。 但是,如果我使用“dichiarazione”,它与PHP无关,而与MySQL无关。 奇怪的是,“Dichiarazione”适用于PHP和MySQL。
查询有什么问题?我尝试使用LOWER(fname) LIKE '%$key%'
,但它似乎没有按预期工作。
我确信我遗失了一些愚蠢的东西,但我似乎无法找到那是......
答案 0 :(得分: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
)