MySQL - 使用特殊字符

时间:2015-11-03 07:24:14

标签: php mysql database

我有一个新闻系统,我们需要您从链接中获取新闻的详细信息,该链接将采用新闻标题,而不是新闻ID数据库。

注意:某些已发布的新闻包含带有特殊字符的字词和字母,例如:

新闻标题: $title = Nuevo demo de la canción de ñandú;

此标题用PHP删除以删除连字符和空格如下。

爆炸标题: $title_explode = explode(' ','-', $title);

看起来像这样: $title_filter = nuevo-demo-de-la-canción-de-ñandú;

我在数据库中创建了一个字段 title ,在此字段中$title将被保存,我在数据库中有另一个字段 title_filter ,其中会放置标题$title_filter,它是利用的标题,也会保存在数据库中,但我们有一个ñ和重音字母,因为我们可以查询数据库顺利地把我带到这个记录比较。

查询: $sql = SELECT * FROM news WHERE title = $title_filter;

带有新闻的域名:www.dominio.com/nuevo-demo-de-la-canción-de-ñandú

我的问题:

  1. 此搜索有效吗?
  2. 您可以优化和删除重音符号$ title,使其成为:$title_filter = nuevo-demo-de-la-cancion-de-nandu;
  3. 值得创建数据库 title_filter 的附加字段以保存清除,并对该标题进行标题搜索。
  4. 注意:不使用单词ID搜索数据库的想法是拥有更清晰的seo链接并改进网站。

    我希望你了解我,可以帮助我解决这个难题,使数据库查询数据更有效。

1 个答案:

答案 0 :(得分:2)

我根据你给我的数据回答你:

问题1

搜索不会给您任何结果,因为字段标题未被过滤。这意味着,您正在比较:

$title_filtered = 'Nuevo-demo-de-la-canción-de-ñandú';
SELECT * FROM news  WHERE title = $title_filter

标题包含=> 'Nuevo demo delacancióndeñandú'

因此,您应该将SQL查询更改为:

SELECT * FROM news WHERE title_filter = $title_filter

问题2

是的,这有两种不同的方式,两者都在Stackoverflow中解释(我给你链接):

  • 使用REGEX和字符串替换。
  • 使用要替换的字符列表
  • 使用翻译PHP函数iconv

您可以在this stackoverflow帖子中阅读这三个解决方案。这是完美的解释。

问题3

明确,如果您不创建这些字段,我们会影响您的应用程序的性能:

  1. 每当用户(或抓取工具)访问您网站的任何网址时,您必须过滤标题
  2. 由于您只过滤了URL,并且要应用过滤器,您必须在数据库站点上执行,这意味着过度使用数据库服务器。如你所知,这是一个众所周知的颈瓶。
  3. 这是很大的安全漏洞,因为直接使用数据用户而没有过滤器会让您感受到SQL injections
  4. 可能是你对数据库空间的消耗有所怀疑。但是,如上所述,不这样做的问题更为相关,新标题的数量也不会造成任何空间记忆问题。

    额外 - 关于过滤

    您遇到的一个问题是将空格替换为 - 。如果您有这样的事情:

    $title = "This is a test "

    您的方法将过滤到:

    $title_filtered = "This-----is-a-test----"

    因此,为了避免这些问题,最好使用这样的REGEX:

    $string = '    hello     world     ';
    $filters = array('@^[\t\s]+@', '@[\t\s]+$@', '@[\t\s]+@');
    $filtered = array('', '', '-');
    
    $title_filtered = preg_replace($filters, $filtered, $string);
    

    额外 - 关于数据库性能

    其他可以帮助您的建议是使用 MySQL索引

    因为如果您没有,每次用户访问网址时,您都会对新闻表进行全面扫描,搜索正确的行。这是不可扩展的,当您的流量和新闻数量增加时,它将为您的服务器提供额外的工作。

    要解决MySQL索引是最好的方法,请查看oficial page。简化而不是对新闻表进行全面扫描,您只需搜索tree data structure

    应该使用这个:

    ALTER TABLE `news` ADD INDEX `index_title_filter` (`title_filter`)
    

    如果您想了解更多信息,请阅读this stackoverflow post