2012-08-31 143 views
0

我需要修改默認的Prestashop數據庫查詢。我已經試過如下:在PHP替換用空格%

public function ajaxProcessCheckProductName() 
{ 
    if ($this->tabAccess['view'] === '1') 
    { 
     $search = Tools::getValue('q'); /* in this variable, i wish subsitute the space with % */ 
     $searchmod = str_replace(" ", "%", $search); 
     $id_lang = Tools::getValue('id_lang'); 
     $limit = Tools::getValue('limit'); 
     $result = Db::getInstance()->executeS(' 
      SELECT DISTINCT pl.`name`, p.`id_product`, pl.`id_shop` 
      FROM `'._DB_PREFIX_.'product` p 
      LEFT JOIN `'._DB_PREFIX_.'product_lang` pl 
       ON (pl.`id_product` = p.`id_product` AND pl.`id_lang` = '.(int)$id_lang.') 
      WHERE pl.`name` LIKE "%'.pSQL($searchmod).'%" 
      GROUP BY pl.`id_product` 
      LIMIT '.(int)$limit); 
     die(Tools::jsonEncode($result)); 
    } 
} 

我希望在一個變量替換的空間,像kawasaki racing filter用%,所以我可以做完全通配符分貝查詢...

示例:用戶搜索kawasaki racing filter,我希望將其替換爲kawasaki%racing%filter所以,查詢將是%kawasaki%racing%filter% ...

這種方法看起來是否正確?它目前不工作:(

有人能幫助我嗎?在此先感謝!

+0

在SQL中非常小心地使用通配符。它們會嚴重降低查詢速度。如果你有一個大的數據庫,這將是無法緩慢的。除非絕對必要,否則不要使用它們。 – Spudley

回答

0

確保您的工具::的getValue不會在你的情況下返回一個HTML字符串,如: 。嘗試var_dumpin你的工具:getValue,看看有什麼實際的輸出

+0

嗨@underpaid_pedro!問題是我無法打印變量..但我只是試圖修改查詢,如:'$ searchmod = str_replace(「 」,'%',$ search);'但它不工作:( – ienabellamy

1

它不適合你的最可能的原因是,如果你搜索數據庫%kawasaki%racing%filter%,它會搜索包含所有這些單詞的條目,順序。

我的直覺是,你希望它來查找包含這些THR項即字符串中任意位置的單詞,但是您這樣做的方式意味着它們必須以與輸入查詢中相同的順序出現。

你會過得更好分裂字符串轉換成單獨的單詞,並獨立地尋找每一個。

... WHERE field LIKE '%kawasaki%' 
     AND field LIKE '%racing%' 
     AND field LIKE '%filter%' 

這將搜索包含所有三個詞的記錄,但在任何順序。如果您想查找其中任何一個詞,而不是全部三個,請將AND替換爲OR

另外:

  • 不要忘了,如果有必要逃離輸入字符串。 (即防止SQL注入攻擊,並防止查詢中斷,如果輸入包含引號字符等)

  • 如果可能,我建議避免在您的查詢中使用通配符。特別是在字符串的開頭。這是因爲它們可以使查詢速度非常慢(數據庫必須讀取每條記錄,併爲每條記錄解析相關字段的全部內容:這是可以在單個表上執行的最慢的查詢,並且如果您'同時做JOIN s,情況會更糟糕)。

在某些情況下,通配符搜索是有用的,但MySQL的(和其他數據塊;你沒有指定數據庫系統,您正在使用)確實有其他選擇,如果你需要做大量的文本搜索的。

最簡單的選擇就是您的關鍵字存儲在一個單獨的表。你可以把它們當作標籤。然後你可以直接查詢確切的單詞。

如果你需要更多的,你可以看看MySQL的'Full Text Search' feature,這可以看作是直接替換減緩通配符搜索。

但即使是這樣,有時候可能會很慢,所以如果你真的想快點,請查看Sphinx。這是一個更多的工作,但做得對,它會讓你的搜索閃電般快速。

+0

感謝Spudley!清楚的解釋,非常感謝。 – ienabellamy