2011-10-07 30 views
0

我有两个关于我的脚本和搜索的问题。我有这样的脚本:通过mysql数据库搜索有问题

$searchTerms = explode(' ', $varSearch); 
$searchTermBits = array(); 
foreach($searchTerms as $term){ 
    $term = trim($term); 
    if(!empty($term)){ 
     $searchTermBits[] = "column1 LIKE '%".$term."%'"; 
    } 
} 

$sql = mysql_query("SELECT * FROM table WHERE ".implode(' OR ', $searchTermBits).""); 

我有一个数据名字“岩助威攀登这里”

如果我输入“攀岩”这个数据显示一列1。这是完美的,但如果我只是键入“岩石”,它不显示。这是为什么?

另外,如何为关键字添加另一个“column2”来搜索?

谢谢!

回答

1

搜索字符串中的“rocks”不起作用,因为字符串“rocks”不存在于数据中。看着它,这对你有意义,因为你知道“岩石”的复数是“岩石”,但数据库不知道这一点。你可以尝试

一种选择是去除搜索词S,但你遇到的其他问题与 - 例如,“浆果”复数的“浆果”,如果你删除S,你会正在寻找“berrie”,这不会让你更进一步。

您可以通过添加更多的线,如

$searchTermBits[] = "column1 LIKE '%".$term."%'"; 

,并与你想搜索的内容替换".$term."添加更多的搜索词。例如,

$searchTermBits[] = "column1 LIKE '%climb%'"; 

另一件需要注意的事项...写下来,您的代码容易受到SQL注入的影响。以此为例...如果网站访问者在搜索词中键入'; DROP TABLE tablename;您刚刚删除了数据。

你应该做的是修改searchTermBits[]线看起来像:

$searchTermBits[] = "column1 LIKE '%" . mysql_real_escape_string($term) . "%'"; 

这将防止任何污秽损害您的数据。

+1

The'';使用mysql_query时,drop table'' bit是**不是**,因为该函数将允许1且只有1个查询运行。然而,你**可能会遇到麻烦,或者(1 = 1)UNION选择密码,用户名,用户的电子邮件 - 敏感数据流到屏幕的那种查询。 – Johan

+0

我曾考虑SQL注入。我没有在这里显示,因为简单。不过谢谢你提到它。此外,我不喜欢只使用“爬”,因为这将是一个动态的页面,我会使用多个单词,并在我的数据库中有多个单词。但是我试图弄明白它在搜索岩石时会显示出岩石,我怎么能够做到这样的脚本? – hellomello

+0

“爬”线就是一个例子。只要你喜欢,你可以有许多$ searchTermBits [] =“...”行 - 你正在创建一系列条件。所以你可以添加$ term1,$ term2,$ term3等。 –

0
  1. 你COLUMN1数据rock cheer climbing here您的搜索条件%Rocks%它不适合所有为rocks是不是在你的COLUMN1数据

  2. 为您做COLUMN1您可以添加COLUMN2然后把它放在一起通过使用AND运算(column1 LIKE "%rock%" OR column1 LIKE "%climb%") AND (column2 LIKE "%rope%" OR column2 LIKE "%powder%")

TIPS: 如果您的表/架构中使用xx_xx_ci核对(那么这是平均不区分大小写,MySQL不关心区分大小写),但如果其他则需要确保搜索词必须区分大小写(mysql区分大小写)。

0

假设你给出的数据是准确的,它不应该匹配,因为你使用的是“Rocks”,而字符串中的单词是“rock”。默认情况下,mysql不会执行区分大小写的匹配,所以可能不是这种情况。

此外,为了避免sql注入,你绝对应该使用mysql_real_escape_string来逃避你的内容。

添加第二列也很容易。只需为每个搜索项添加两个条目到您的数组中,一个用于column1和一个用于column2。