繁体   English   中英

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

[英]How can I ignore special characters in CodeIgniter URL Segment for query

我已经尝试了多种方法,但是我的客户在这个问题上非常专一,我不确定如何按照他的意愿准确地做到这一点。

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

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

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

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

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

我尝试了一些类似于:

$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列

选择(选择*从文章在哪里替换(REPLACE(REPLACE(articles.article_title,“-”,“”)“,”:“,”“),”!“,”“),例如”%Computer每月的月份:四月2015年%“)

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

行号:331

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

产生此错误的原因是您使用错误的方法执行查询。 为了运行查询,您可以使用函数$this->db->query ,有关更多信息,请参阅文档

为了解决该错误,您需要将代码更改为:

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

附加:Codeigniter具有查询构建器类,以方便查询。

如果您的文章名称以“这是我的文章名称”存储在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";

仔细查看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()返回的对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM