我已经尝试了很多方法,但我有一个客户在这个问题上相当特别,我不知道如何让这种情况完全符合他的要求。
我们有一个名为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
感谢天才帮助我解决这个问题!
答案 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不提供任何正则表达式替换功能,您可以创建一个类似下面的自定义
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()
返回的对象。