我有一个新闻系统,我们需要您从链接中获取新闻的详细信息,该链接将采用新闻标题,而不是新闻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ú
我的问题:
$title_filter = nuevo-demo-de-la-cancion-de-nandu;
注意:不使用单词ID搜索数据库的想法是拥有更清晰的seo链接并改进网站。
我希望你了解我,可以帮助我解决这个难题,使数据库查询数据更有效。
答案 0 :(得分:2)
我根据你给我的数据回答你:
搜索不会给您任何结果,因为字段标题未被过滤。这意味着,您正在比较:
$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
是的,这有两种不同的方式,两者都在Stackoverflow中解释(我给你链接):
您可以在this stackoverflow帖子中阅读这三个解决方案。这是完美的解释。
明确是,如果您不创建这些字段,我们会影响您的应用程序的性能:
可能是你对数据库空间的消耗有所怀疑。但是,如上所述,不这样做的问题更为相关,新标题的数量也不会造成任何空间记忆问题。
您遇到的一个问题是将空格替换为 - 。如果您有这样的事情:
$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。