Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在查询时忽略CodeIgniter URL段中的特殊字符_Php_Mysql_Codeigniter - Fatal编程技术网

Php 如何在查询时忽略CodeIgniter URL段中的特殊字符

Php 如何在查询时忽略CodeIgniter URL段中的特殊字符,php,mysql,codeigniter,Php,Mysql,Codeigniter,我已经尝试了很多方法,但是我有一个客户对这个问题非常挑剔,我不知道如何让这一切完全按照他的意愿发生 我们有一个名为Articles的控制器 要查找文章,我们使用数据库中的路径/articles/year/month/date/article title,但使用highphenated 控制器仅获取数据的最后一部分,用空格替换连字符,并在articles表中查找与字符串匹配的article_title 现在他有一些带有冒号和其他特殊字符的文章 所以我的问题是,如果我们有这个:数据库中有我的文章名,

我已经尝试了很多方法,但是我有一个客户对这个问题非常挑剔,我不知道如何让这一切完全按照他的意愿发生

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

要查找文章,我们使用数据库中的路径/articles/year/month/date/article title,但使用highphenated

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

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

所以我的问题是,如果我们有这个:数据库中有我的文章名,他首选的链接是/这是我的文章名/。。查询没有返回任何结果,因为我们已将冒号替换为nothing。。我们如何获取生成的文章

我尝试了类似于:

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

从文章中选择*,其中 replacearticles.article_title,-,:, !, 2015年4月当月计算机构建百分比

文件名:C:\mstsage\system\database\DB\u driver.php

行号:331


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

如果您的文章名存储在数据库中,如下所示:是我的文章名,如果您使用路径/articles/year/month/date/这是我的文章名。因此,您的控制器将Highphenate项目名称转换为这是我的项目名称。现在,你的观点是你比较这是我的文章名从控制器和这:是我的文章名在数据库

不幸的是,mysql不提供任何正则表达式替换函数,您可以创建如下自定义函数


导致此错误的原因是您使用了错误的方法执行查询。要运行查询,请使用函数$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有一个简化查询的工具

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

之所以会发生这种情况,是因为$This->db对象既是数据库的连接,也是查询生成器。它的方法只需要将表达式作为参数放入它构建的查询的SELECT子句中。使用其方法指定WHERE条件等

如果希望编写自己的SQL查询而不使用查询生成器,则可以使用该方法。它只将查询发送到服务器,而不进行更改:

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

阅读文档页面,了解如何使用$this->db->query返回的对象。

为什么不在数据库中添加一个带有url友好段的单独字段?有点离题,但我建议在url中添加帖子ID,以防两篇文章共享同一名称。谢谢。我最终以一种完全不同的方式解决了另一个问题,但我很高兴看到我所做的错误是什么。与此相反,我最终选择添加另一个名为article_uri的列,在该列中,我获取了标题字符串,用破折号交换了空格,删除了所有其他特殊字符,并在稍后使用该列从uri段进行查找。工作得很有魅力。
$query = $this->db->query('SELECT * FROM articles WHERE REPLACE(REPLACE(REPLACE(articles.article_title, "-", ""), ":", ""),"!", "") LIKE "%'.$string.'%")', FALSE);