2010-12-04 59 views
0

我有一個功能低於它完美的作品,但現在客戶端回來,並要求數字只被採取做搜索,因爲他的大部分客戶不會輸入後綴「h」或任何它可能是每次我下面的例子:如何在用戶輸入後綴時用數字查詢mysql?

38039或38039h

不過他也表示,他只有一個組的產品代碼與「T」開頭所以他們可以鍵入「T760」在這種情況下,我們需要的字首。

我在下面的代碼搜索目前確切的產品,任何人都可以幫助我在這些例子中工作?

<?php 

//Find Stock Value 
function checkstock($prodCode) { 

    $prodCode = strtoupper($prodCode); 

    require '../../../../config.php'; 
    $dbh = new PDO(DB_DSN, DB_USER, DB_PASS); 
    $sql = "SELECT * FROM isproducts WHERE prodCode = '". 
     $prodCode."' AND AllowSalesOrder = '1'"; 
    $stmt = $dbh->query($sql); 
    $obj = $stmt->fetch(PDO::FETCH_OBJ); 

    $count = $stmt->rowCount(); 

    echo ($count == 1 ? 
    ROUND($obj->FreeStockQuantity, 0) : 'Invalid product code '.$prodCode.''); 

} 

//Call Stock Function 
checkstock($_POST['productcode']); 

?> 

回答

2

將查詢改爲如下所示?

SELECT * FROM isproducts 
WHERE 
    (
    prodCode='{$prodCode}'   // for product with prefix or suffix 
    OR prodCode LIKE '{$prodCode}%' // without suffix 
    OR prodCode='T{$prodCode}'  // without prefix 
) 
    AND AllowSalesOrder = ''"; 

野生卡由單個字符

OR prodCode LIKE '{$prodCode}_' // single character wild-card 
+0

爲什麼不使用LIKE'%「。$ prodCode。」%'?這以一種更簡單的方式處理所有上述問題。 – mspir 2010-12-04 11:14:38

+2

@Spiros - 你必須迎合性能問題,%anything%將**不**使用索引進行搜索 – ajreal 2010-12-04 11:15:51

+0

這使我的腳本死亡了:( – Andy 2010-12-04 11:19:48

0

看來你可能有產品相同的號碼,但不一樣的後綴?像8512n和8512h? 你可以使用LIKE「%$代碼%」

$sql = "SELECT * FROM isproducts WHERE prodCode LIKE '%".$prodCode."%' AND AllowSalesOrder = ''"; 

,我認爲它更安全的方式在你的情況下,使包含數字的所有產品會出現,無論後綴或前綴。

以上可能會返回多個產品,因此用戶仍然必須選擇他實際上正在查找的是哪一個。

0

您可以使用%通配符來解決這類問題。

0

在我的一些代碼,我使用了以下策略:

# psuedo-code ... NOT intended for real use: 
SELECT COUNT(*) FROM someTable WHERE someColumn = "{XXX}" 
# If that returns exactly one than use the corresponding query 
SELECT COUNT(*) FROM someTable WHERE someColumn LIKE "{XXX}" 
# If that returns exactly one then use it 
SELECT COUNT(*) FROM someTable WHERE someColumn LIKE "{XXX}%" 
# If that returns exactly one then use it 
SELECT COUNT(*) FROM someTable WHERE someColumn LIKE "%{XXX}%" 
# If that returns exactly one then use it 

...(其中{XXX}是用戶提供的搜索詞的佔位符)。

這裏的想法是,我首先嚐試一個精確的匹配,然後我假設該術語已經包含SQL通配符,然後嘗試後綴%通配符,最後嘗試用%通配符來包裝它。

在任何時候,如果我找到了一個明確的匹配,然後我使用它。如果我在任何時候發現不止一個匹配(這裏沒有顯示僞代碼),那麼我可能會拋出一個異常,或者根據我正在做的事情的具體情況,我可能會返回它們或它們的一部分。 (實際上,我使用的是Python或Perl的參數插值功能,或者對我的輸入進行了消毒處理,以允許通配符,同時防止SQL注入;所以代碼看起來不像我在這裏展示的那樣。傳達一般想法)。

我的目標是允許使用提供的最小明確參數來調用我的腳本,這聽起來大致類似於您的客戶在此處請求的內容。

從可用性的角度來看,大多數用戶會得到任何輸入權的第一個字符。因此,通過後綴通配符匹配的精確匹配最有可能在大多數時間成功。就我而言,我的用戶很可能熟悉SQL通配符,並且可能更願意使用它們來構建自己的明確匹配;並且在我開始後綴或用自己的通配符封裝之前,必須插入該嘗試。

這就是爲什麼我使用這種匹配嘗試的特定順序。

相關問題