2011-06-29 57 views
0

我正在進行一場演出,現在客戶希望用戶能夠按產品代碼搜索產品。MYSQL - 數字格式問題

產品代碼的格式如下所示:123.4567.89

所以,用戶是否進入與期間的個數在搜索框中應返回的產品,如果沒有時間,或用空格。

因此,以下所有的應返回的產品:123.4567.89,123456789,123 4567 89

我目前的查詢看起來像這樣:

SELECT  * 
FROM  products 
WHERE  product_code LIKE '%$search_code%'" 

我不知所措我將如何修改,以包括用戶如何輸入這些數字的所有不同可能性。

在此先感謝您的幫助。

回答

1
  1. [前端]限制字符,用戶可以輸入。只允許句號和空格。不要允許任何字母字符(如果您的所有產品SKU都是數字)。

  2. [中間層]表單發佈後,請仔細檢查數據以查找後端的無關字符。如果客戶端以某種方式設法通過了前端的驗證,您可以在後端捕獲它。使用簡單的搜索並用您選擇的語言進行替換。

  3. [數據庫/後端]一旦數據僅限於數字並且您將SKU發送到您的數據庫查詢,請刪除產品表上的所有期間。如果您知道您只使用期限來存儲SKU,只需搜索排除它們,例如

SELECT * 
FROM products 
WHERE REPLACE(product_code,'.','') = @productCode 

避免通配符搜索%%,他們是昂貴的。

1

您必須normalize用戶在進行搜索前輸入的數字,即:使其具有與存儲在數據庫中的數字相同的格式。

例如,如果數字在沒有句點(如123456789)的情況下存儲在數據庫中,則必須預先處理用戶輸入的數字,以從中刪除句點,空格和其他任何字符。

編輯:如果數字與期間存儲在數據庫中,則還需要通過刪除期限來正常化它們,正如@HertzaHaeon在答案中指出的那樣。

1

如何刪除數據庫代碼和搜索輸入中的點和空格,所以你只有數字?類似這樣的:

WHERE REPLACE(product_code, '.', '') LIKE '%formatted_search_code%' 

對於搜索輸入,您可以剝除除正數表達式或簡單子串替換之外的所有數字。

1

我認爲你的問題的最佳解決方案是格式化搜索值,以便匹配數據庫中使用的格式。但是,如果用戶填寫整個產品編號,則只能找到該產品。如果這不是所需的解決方案,並且您希望能夠讓用戶填寫產品代碼的任何部分,並找到包含代碼的產品,那麼我認爲您應該過濾數據庫中的期限。

禁食解決方案將實際上在你的數據庫中。從您的產品代碼中刪除點或添加一個包含產品代碼而沒有點的額外字段。這會在數據集變大時加快查詢速度。

如果你不想這樣做,你總是可以過濾掉點在搜索查詢:

REPLACE(product_code,'.','') LIKE '%$search_code%' 

這將做thrick但可以當數據集變得更大非常緩慢。

1

我一直與社會安全號碼一起工作。我的解決方案是將你的輸入字符串,去掉字符和非數字字符,確保字符串是合適的長度,然後使用子字符串函數將字符串分開,然後再與分隔符一起放回去。如果你使用PHP,該功能可能是這樣的:

<?php 
function FormatProductCode($String) { 
    $String = preg_replace("/[^0-9]/", "", $String); 
    if ($String == "") { 
     return null; 
    } 
    $String = str_pad($String, 9, "0", STR_PAD_LEFT); 
    return substr($String, 0, 3) . "." . substr($String, 3, 4) . "." . substr($String, 7, 2); 
} 
?> 

使用此功能,你需要將數據輸入到數據庫或比較數據的任何時間。