在discuz上實現模糊查詢出現的問題及解決方法
一般的SQL模糊查詢語句爲
但在discuz的模糊查詢中,會有一定的區別
【1】
(SQL語句格式錯誤,該語句需要4個變量)
出現的原因是discuz把模糊查詢中的 ‘%’ 也會當成變量,因此出現錯誤
【2】修改查詢語句,修改變量的表達方式,把%放在array的變量裏面而不是查詢語句中
查詢的語句翻譯爲如下:SELECT * FROM _table WHERE name LIKE ''%你好%''
從顯示的SQL語句中會發現,like後面的條件是在雙引號內,而語句裏一般爲單引號,這是因爲生成的語句會自動把條件加單引號,所以條件最終變爲雙引號,解決的方法是:
把select語句裏的 '%s' 的單引號去除
SELECT * FROM `_table` WHERE name LIKE '% $s %';
其中,name爲字段,$s爲查詢內容中包含的變量但在discuz的模糊查詢中,會有一定的區別
【1】
DB::fetch_first("SELECT * FROM %t WHERE name LIKE '% %s %'", array($this->_table,$str));
但是查詢語句執行後,利用瀏覽器的調試功能查看會看到錯誤警告:Discuz! Database Error
(0) SQL string format error! This SQL need "4" vars to replace into.(SQL語句格式錯誤,該語句需要4個變量)
出現的原因是discuz把模糊查詢中的 ‘%’ 也會當成變量,因此出現錯誤
【2】修改查詢語句,修改變量的表達方式,把%放在array的變量裏面而不是查詢語句中
DB::fetch_first("SELECT * FROM %t WHERE name LIKE '%s'", array($this->_table,'%'.$str.'%'));
但是,當輸入查詢的內容(如:你好)還是會出現一個問題: (1064) You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '%\xE4\xBD\xA0\xE5\xA5\xBD%''' at line 1
SELECT * FROM _table WHERE name LIKE ''%你好%''
查詢的語句翻譯爲如下:SELECT * FROM _table WHERE name LIKE ''%你好%''
從顯示的SQL語句中會發現,like後面的條件是在雙引號內,而語句裏一般爲單引號,這是因爲生成的語句會自動把條件加單引號,所以條件最終變爲雙引號,解決的方法是:
把select語句裏的 '%s' 的單引號去除
DB::fetch_first("SELECT * FROM %t WHERE name LIKE %s", array($this->_table,'%'.$str.'%'));