2010-01-12 37 views
1

所以我有这个网站有一个搜索功能,它在我的mysql数据库中搜索一个表。目前数据库有1108行。它包含音乐信息,如艺术家和专辑。由于每个角色都可能是艺术家姓名或专辑名称,因此我在将每个变量添加到数据库之前都已对其进行了urlen编码。请看下图:通过php搜索mysql数据库的一些问题

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

所以,现在让假装我添加了一个新条目的数据库,它包含了需要进行url编码字符。数据库显示它很好。

现在我想去搜索。

工作的外国字符。你可以在这里看到:http://albumarrrt.net/details.php?artist=Ai%20Otsuka点击每个作品的专辑链接。

但是现在出现了一些问题。

1 - 如果搜索'&',则搜索将%26读为无。它在地址栏中显示%26,但它没有任何内容。 这里是它是如何被读取:

$search = $_GET['search']; 

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

这是$搜索做的唯一的事情之前,它开始变得由数据库中读取。

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%') 

显然,这是放了很多应变的服务器上,我知道使用像这样的语句大型数据库搜索是一个坏主意,那么搜索全文或其他方法的替代方法是什么?

对不起,这些问题的数量非常多,但它们都是各自携手并进的。


编辑: 好,我定我的数据库,但仍然有几个问题。 有人建议将我的文本从utf8转换为普通的utf,我该怎么做?

和我仍然遇到了&标志的问题。 例如: 如果您在谷歌上搜索&,但在我的网站上,搜索查询的POST结果在搜索&时不会显示任何内容。

+1

您的应用程序已经成熟SQL注入,当你把$ _ POST PARAMS和他们粘成一个数据库查询。 – 2010-01-12 00:50:34

回答

3
  • 第一:不要urlencode数据库中的数据。 Urlencode数据获取后,你输出为HTML。

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

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

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

+0

+1 for FULLTEXT/Lucene提及 – 2010-01-12 01:17:25

+0

我在FULLTEXT搜索中遇到了一些麻烦 SELECT * FROM TABLE WHERE MATCH(artist,album)AGAINST('underworl'); 我注意到文本必须完全匹配。上面的例子中,“underworl”不会返回有艺术家“黑社会”的结果。这是怎么想的?因为如果是这样的话,那会阻碍事物的发展。如果不是,我该如何解决? – smont 2010-01-12 03:08:47

+0

是的,它匹配整个单词。其他技术支持阻止“黑社会”匹配“黑社会”,但与任意子串匹配通常不是解决方案的一部分。你可能必须坚持使用'LIKE'谓词或者使用*倒排索引*。 – 2010-01-12 03:16:49

1

我不明白你为什么需要urlencode,我只是简单地使用mysql_real_escape_string。

“&”是在URL中分离所以,除非你用urlencode它首先

用urlencode的另一个问题是大量多余的字符不会被传递给您的脚本。如果你不允许有足够的字符,mySQL可能会默默截断艺术家或标题。

DC

1

你确定你没有的东西从你的URL(和信息)来将它们放在数据库之前想解码?如果我存储各种字符串,我想将它们解码为纯UTF或其他东西,并以这种方式存储它们。然后我会重新编码它们以显示它们。这可能会解决您的搜索问题本身。

其次,为了加速字符串搜索访问,您可以创建一个字符串表,将所有字符串标记为字符串,并将其链接回包含它们的字符串。然后,不要做“像%1 $%”这样的事情,你可以说$ 1 = stringTable.String并加入这个ID。绝不将此视为最佳解决方案,因为我自己并未完成这些演奏曲目,这只是一个建议。