gpt4 book ai didi

php - MySQL - 通过带有特殊字符的文本字符串搜索数据库

转载 作者:可可西里 更新时间:2023-11-01 08:27:46 26 4
gpt4 key购买 nike

我有一个新闻系统,我们需要您从一个链接访问新闻的详细信息,该链接将采用新闻标题,而不是新闻 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 以保存干净并对该标题进行标题搜索。

注意:不使用单词 ID 搜索数据库的想法是拥有更清晰的 seo 链接并改进网站。

希望你能理解我,能帮我解决这个困境,让数据库查询数据更有效。

最佳答案

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

问题一

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

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

但是 title 包含 => 'Nuevo demo de la canción de ñandú'

所以你应该将你的 SQL 查询更改为这个:

SELECT * FROM news WHERE title_filter = $title_filter

问题2

是的,这可以通过两种不同的方式实现,两种方式都在 Stackoverflow 中进行了解释(我给你链接):

  • 使用正则表达式和字符串替换。
  • 使用一个字符列表来替换
  • 使用翻译器 PHP 函数 iconv

您可以在 this stackoverflow 中阅读这三个解决方案邮政。它得到了完美的解释。

问题3

绝对,如果您不创建该字段,我们将影响您的应用程序的性能:

  1. 每次用户(或抓取工具)访问您网站的任何 URL 时,您都必须过滤标题
  2. 因为您只过滤了 URL,并且要应用过滤器您必须在数据库站点上进行,这意味着不必要地过度使用数据库服务器。如您所知,那是众所周知的 Neck 瓶。
  3. 这是一个巨大的安全漏洞,因为在没有过滤器的情况下直接使用数据用户会使您暴露于SQL injections .

您可能对拥有新字段的数据库空间消耗有疑问。但是不这样做的问题更相关,正如您在上面看到的,新标题的数量也不会导致任何空间内存问题。

Extra - 关于过滤

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

$title = "这是一个测试"

你的方法将过滤成这样:

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

所以,为了避免这类问题,最好使用像这样的正则表达式:

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

$title_filtered = preg_replace($filters, $filtered, $string);

Extra - 关于数据库性能

其他对您有帮助的建议是使用 MySQL 索引

因为如果您没有,每次用户访问 url 时,您都会对新闻表进行全面扫描,以搜索正确的行。而且这是不可扩展的,并且当您的流量和新闻数量增加时会给您的服务器带来额外的工作量。

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

使用这个应该足够了:

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

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

关于php - MySQL - 通过带有特殊字符的文本字符串搜索数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33493520/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com