簡體   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