如何忽略CodeIgniter URL Segment中的特殊字符以进行查询

时间:2018-02-24 03:17:55

标签: php mysql codeigniter

我已经尝试了很多方法,但我有一个客户在这个问题上相当特别,我不知道如何让这种情况完全符合他的要求。

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

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

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

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

所以我的问题是,如果我们在数据库中有“这是我的文章名称”,他首选的链接将是“/ 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 articles WHERE   REPLACE(REPLACE(articles.article_title,“ - ”,“”),“:”,“”),   “!”,“”)像“本月计算机构建百分比:2015年4月%”)

     

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

     

行号:331

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

3 个答案:

答案 0 :(得分:2)

导致出现此错误的原因是您使用了错误的方法来执行查询。要运行查询,请使用函数$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来方便查询。

答案 1 :(得分:0)

如果您的文章名称存储在db中,则为“This:is my article name”,如果您将路径用作/ 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";

答案 2 :(得分:0)

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

这是因为$this->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->db->query()返回的对象。