在PHP中执行简单搜索时,查询结果不同

时间:2012-12-12 15:58:35

标签: php mysql drupal

我在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条目(还有更多,这些只是示例):

  • Dichiarazione 1
  • Dichiarazione 2
  • Guida 1
  • Guida 2

如果我以“guida”作为键启动脚本,它会正确返回PHP和MySQL的两个条目。 如果我使用“Guida”它也可以。 但是,如果我使用“dichiarazione”,它与PHP无关,而与MySQL无关。 奇怪的是,“Dichiarazione”适用于PHP和MySQL。

查询有什么问题?我尝试使用LOWER(fname) LIKE '%$key%',但它似乎没有按预期工作。

我确信我遗失了一些愚蠢的东西,但我似乎无法找到那是......

1 个答案:

答案 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