【问题标题】:How can I ignore special characters in CodeIgniter URL Segment for query如何忽略 CodeIgniter URL Segment 中的特殊字符进行查询
【发布时间】:2018-02-24 03:17:54
【问题描述】:

我已经尝试了多种方法,但我有一个客户对这个主题非常特别,我不确定如何完全按照他的意愿进行。

我们有一个名为 Articles 的控制器。

要查找文章,我们使用路径 /articles/year/month/date/article-title-as-is-in-database-but-highphenated

控制器只获取数据的最后一部分,用空格替换连字符,并在文章表中查找与字符串匹配的 article_title。

现在他有一些带有冒号和某些其他特殊字符的文章。

所以我的问题是,如果我们在数据库中有“This:is my article name”,他的首选链接将是“/this-is-my-article-name/”.. 好吧,查询不返回任何结果因为我们没有用任何东西替换冒号.. 我们如何获取结果文章?!

我尝试了类似的东西:

$this->db->select('(SELECT * FROM articles WHERE REPLACE(REPLACE(REPLACE(articles.article_title, "-", ""), ":", ""),"!", "") LIKE "%'.$string.'%")', FALSE);
$query = $this->db->get();
return $query->row_array();

然而这并没有奏效——它只是导致了这个:

错误号:1241

操作数应包含 1 列

SELECT (SELECT * FROM 文章 WHERE 替换(替换(替换(articles.article_title,“-”,“”),“:”,“”), "!", "") LIKE "%Computer Build of the Month : April 2015%")

文件名:C:\mstsage\system\database\DB_driver.php

行号:331

感谢任何帮助我解决这个问题的天才!

【问题讨论】:

  • 为什么不使用 url 友好段向您的数据库添加一个单独的字段?
  • 有点离题,但我建议在 URL 中添加帖子 ID,以防两篇文章可能同名

标签: php mysql codeigniter


【解决方案1】:

这个错误是因为你使用了错误的方法来执行你的查询。为了运行查询,您可以使用函数$this->db->query,有关更多信息,请参阅docs

为了修复错误,您将代码更改为:

$sql = '(SELECT * FROM articles WHERE REPLACE(REPLACE(REPLACE(articles.article_title, "-", ""), ":", ""),"!", "") LIKE "%'.$string.'%")';
$query = $this->db->query($sql);
return $query->row_array();

额外:Codeigniter 有一个query builder class 方便查询。

【讨论】:

  • 谢谢。我最终以完全不同的方式解决了另一个问题,但我很高兴看到我所做的错误是什么。与此不同,最终我选择添加另一个名为 article_uri 的列,在其中我获取标题字符串,用破折号交换空格,删除所有其他特殊字符,然后仅使用该列从 URI 段中查找。像魅力一样工作。
【解决方案2】:

如果您的文章名称以“This: is my article name”的形式存储在 db 中,并且您使用的路径为 /articles/year/month/date/this--is-my-article-name。因此,您的控制器将高位文章名称转换为“这是我的文章名称”。现在您可以比较从控制器获得的“这是我的文章名称”和数据库中的“这是我的文章名称”。

不幸的是mysql不提供任何正则表达式替换功能,你可以像下面这样创建一个自定义的

https://itsolutionstuff.com/post/how-to-remove-special-characters-by-mysql-custom-functionexample.html

DELIMITER $$

DROP FUNCTION IF EXISTS `removeSpacialChar` $$
CREATE DEFINER=`degree`@`%` FUNCTION `removeSpacialChar`(`in_str` varchar(4096)) RETURNS varchar(4096) CHARSET utf8
BEGIN

      DECLARE out_str VARCHAR(4096) DEFAULT ''; 

      DECLARE c VARCHAR(4096) DEFAULT ''; 

      DECLARE pointer INT DEFAULT 1; 



      IF ISNULL(in_str) THEN

            RETURN NULL; 

      ELSE

            WHILE pointer <= LENGTH(in_str) DO 



                  SET c = MID(in_str, pointer, 1); 



                  IF (ASCII(c) >= 48 AND ASCII(c) <= 57) OR (ASCII(c) >= 65 AND ASCII(c) <= 90) OR (ASCII(c) >= 97 AND ASCII(c) <= 122) THEN

                      SET out_str = CONCAT(out_str, c); 

                  ELSE

                      SET out_str = CONCAT(out_str, ' ');   

                  END IF; 



                  SET pointer = pointer + 1; 

            END WHILE; 

      END IF; 



      RETURN out_str;

END $$

DELIMITER ;





SELECT * FROM articles WHERE removeSpacialChar(articles.article_title)="this is my article name";

【讨论】:

    【解决方案3】:

    仔细查看MySQL服务器报告的错误信息。它包含 SQL 关键字 SELECT,后跟整个查询。

    发生这种情况是因为$this-&gt;db 对象是与数据库的连接,也是查询构建器。它的select() 方法只需要将表达式作为参数放入它构建的查询的SELECT 子句中。使用其where() 方法指定WHERE 条件等。

    如果您想编写自己的 SQL 查询(而不是使用查询生成器),那么您可以使用 query() 方法。它只是将查询发送到服务器,而不更改它:

    $query = $this->db->query('SELECT * FROM articles WHERE REPLACE(REPLACE(REPLACE(articles.article_title, "-", ""), ":", ""),"!", "") LIKE "%'.$string.'%")', FALSE);
    

    阅读文档页面"Generating Query Results",了解如何使用$this-&gt;db-&gt;query()返回的对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-04
      • 2012-05-10
      • 1970-01-01
      • 2013-12-11
      相关资源
      最近更新 更多