[英]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不提供任何正則表達式替換功能,您可以創建一個自定義表達式,如下所示
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.