通过php搜索mysql数据库的一些问题

时间:2010-01-12 00:43:41

标签: php mysql search

所以我这个网站有一个搜索功能,可以搜索我的mysql数据库中的表。目前数据库有1108行。它包含艺术家和专辑等音乐信息。由于每个字符都可以是艺术家名称或专辑名称,因此我在添加到数据库之前对每个变量进行了urlencoded。见下文:

$artist = urlencode($_POST['artist']);
$album = urlencode($_POST['album']);

所以现在让我假装我在数据库中添加了一个新条目,它包含了需要进行urlencoded的字符。数据库显示正常。

现在我想去搜索。

外国字符有效。您可以在此处看到:http://albumarrrt.net/details.php?artist=Ai%20Otsuka点击每个相册的相册链接。

但现在出现了一些问题。

1 - 如果你搜索'&'搜索将%26视为无效。它在地址栏中显示%26,但它没有显示。 以下是阅读方式:

$search = $_GET['search'];

if($search == '') {
    echo "Please enter a search term :(";
}

这是在搜索开始被数据库读取之前用$ search完成的唯一操作。

2 - 如果你搜索单引号或双引号,它会做一些奇怪的事情:

  

搜索“并找不到匹配项   为“%5C%5C%26quot%3B”搜索'   找不到匹配项   “%5C%5C%26%23039%3B”

我不明白为什么会这样做,因为数据库只包含引用的代码而没有别的。

这是我在搜索中发现错误的两件事。也许我一直在看它太长时间无法理解它,但它让我感到困惑的是它为什么它不读'&'任何事情。


到我的上一个问题。 我当前的搜索方法将每个单词分开,并在其周围添加%',然后使用LIKE语句查找匹配项。例如:

搜索:一堆东西(字) mysql查询就像:

SELECT * FROM TABLE WHERE (album LIKE '%A%' AND album LIKE '%bunch%' AND album LIKE '%of%' AND album LIKE '%Stuff%' AND album LIKE '%%28word%29%') OR (artist LIKE '%A%' AND artist LIKE '%bunch%' AND artist LIKE '%of%' AND artist LIKE '%Stuff%' AND artist LIKE '%%28word%29%')

显然这给服务器带来了很大的压力,我知道使用LIKE语句进行大型数据库搜索是一个坏主意,那么搜索FULL TEXT或其他方法的另一种方法是什么?

对于绝大多数的问题感到抱歉,但他们彼此都是相辅相成的。


编辑: 好的,我已经修复了我的数据库,但仍然有一些问题。 有人建议将我的文本从utf8转换为plain utf,我该怎么做?

我仍然遇到问题&标志。 例如: 如果你搜索&在谷歌它的工作原理,但在我的网站上,搜索查询的POST结果在搜索&时没有显示任何内容。

3 个答案:

答案 0 :(得分:3)

  • 首先:不要在数据库中对数据进行urlencode。获取后的Urlencode数据,因为输出为HTML。

  • 第二:在SQL查询中使用用户提供的值时,请使用查询参数。然后,您不必担心表单数据中的引号会导致语法错误或SQL注入风险。

  • 第三:不要使用LIKE '%pattern%'黑客;而是使用真正的全文搜索解决方案(FULLTEXTLucene/SolrSphinx Search)。它的性能比使用临时文本搜索(取决于您的数据量)好几百或几千倍。

    请参阅我为MySQL大学所做的演示:Practical Full Text Search in MySQL

答案 1 :(得分:1)

我不明白为什么你需要urlencode,我只想使用mysql_real_escape_string。

'&安培;'是url中的分隔符,因此除非先对其进行urlencode,否则不会将其传递给您的脚本

urlencode的另一个问题是大量的额外字符。如果你没有允许足够的字符,mySQL可能会默默地截断艺术家或标题。

DC

答案 2 :(得分:1)

在将它们放入数据库之前,您确定不希望解码来自您网址(和POSTS)的内容吗?如果我存储各种字符串,我想将它们解码为普通的UTF或其他东西并以这种方式存储它们。然后我会重新编码它们以显示它们。这可能会解决您的搜索问题。

其次,为了加快字符串搜索访问速度,您可以创建一个字符串表,其中所有字符串都被标记化,并链接回包含它们的字符串。然后你可以说$ 1 = stringTable.String并且加入该ID,而不是像“%$ 1%”那样。绝不认为这是最佳解决方案,因为我自己没有完成那些演奏曲调,这只是一个建议。