2012-05-03 30 views
0

我有一個PHP/mySQL搜索腳本,由於某些原因,在開發人員進行最新更新後,在使用通配符(*)進行搜索時已停止工作。更糟的是,它不僅停止了工作,但它返回以下討厭(遊客)的MySQL錯誤,這是基於甜甜圈通配符搜索:從正則表達式得到錯誤'repetition-operator operand invalid'

SELECT a.product_id, a.category_id FROM products a 
LEFT JOIN users u ON u.userid=a.ownerid 
WHERE a.active=1 AND a.approved=1 AND a.deleted=0 AND a.creation_in_progress=0 
AND a.name LIKE '%%' 
AND ((a.name REGEXP '()*(*donut*)()*') OR (a.description REGEXP '()*(*donut*)()*')) 

錯誤:

Mysql Error: Got error 'repetition-operator operand invalid' from regexp 

不幸的是,開發人員無法(或不會)修復它,並且如果有人進行通配符搜索,它將使我的網站無用。

任何想法可能是什麼問題?或者一個簡單的修復?我已經嘗試在$ keywords_search之前放置一個反斜槓,但這沒有奏效。我也嘗試直接在PhpMyAdmin中運行上面的mySQL查詢,併產生了相同的錯誤。

我也嘗試完全擺脫REGEXP部分,但它不會返回任何結果。

的PHP搜索這部分的代碼如下:

$query[] = "((a.name REGEXP '()*(" . str_replace(' ', ')*()*(', $keywords_search) . ")()*') 
OR (a.description REGEXP '()*(" . str_replace(' ', ')*()*(', $keywords_search) . ")()*'))";  
+0

請看,這就是[VCS](http://en.wikipedia.org/wiki/Revision_control)的原因。 –

+0

不應該'()*'塊是'(*)'?我敢肯定,你不能應用重複操作符'* +'來捕獲似乎符合錯誤信息的組(')'(並且在某些聰明的alec說出來之前,顯然你可以應用它們)內部*捕獲組,但這不是我所做的點,以及你知道它;-)) – DaveRandom

+0

這修正了它對我來說: $ keywords_search = str_replace(「*」,「。*」,$ keywords_search) ; – user1227914

回答

2

你想,如果你希望它匹配一個明星來逃避星(*)。如果您希望它翻譯「任何字符串」,則需要將其更改爲.*。就這麼簡單。在查詢數據庫之前,只需輸入用戶的輸入並應用替換就可以了。

+0

我讀了你的答案10次,最後想出了下面的代碼。你猜怎麼着?有效!非常感謝。這裏是代碼,如果有人想知道,我希望它是正確的,但它適用於我 - > $ keywords_search = str_replace(「*」,「。*」,$ keywords_search); – user1227914

+0

似乎不知怎麼我的代碼被剝離出來。替換是dotwildcard的通配符。 – user1227914

+1

編輯你的評論,添加代碼在周圍添加內嵌代碼等刻度:''如此''' –