在discuz上實現模糊查詢出現的問題及解決方法

在discuz上實現模糊查詢出現的問題及解決方法

        一般的SQL模糊查詢語句爲
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.'%')); 






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章