2012-10-01 55 views
1

首先,寫下PHP代碼之前。我有一個名爲mySQL數據庫中的項目的表。 假設它有內部ITEM_NO以下reocrds:PHP簡單搜索項目範圍

  • 1L900BK
  • 1L900BE
  • 1L900BR
  • 2L900BK
  • 2L902BE
  • 2L910PU

和PHP代碼:

require_once('connect_db.php'); 
$from = $_POST['from']; 
$to = $_POST['to']; 

$query = "SELECT * FROM items WHERE item_no BETWEEN '".$from."' AND '".$to."' ORDER BY item_no Asc"; 
$result = mysql_query($query); 

if(mysql_num_rows($result)>0){ 
$num = mysql_num_rows($result); 

for($i=0;$i<$num;$i++){ 
$row = mysql_fetch_assoc($result); 
echo $row['item_no']; 
echo "<br /><br />";  
} 
} 

現在的問題從這裏開始:假設我想搜索項目從1l900bk TO 2l900BK,它將輸出所有ITEM_NO它們之間(1L900bk 1L900BE ------- 2L900BK)哪個是完美的!

但是,當我想尋找ITEM_NO FROM 1L9 TO 2L9 ...結果或輸出是不正確的(1L900BK - 1L900BE - 1L900BR - 並停止!)哪裏是2L900的?當for循環達到此值時它跳過2l9。

現在我想要的是輸出所有2l900當我寫下2l9 ...我認爲在查詢內部BETWEEN有問題,但我找不到另一種方法。

謝謝

+0

什麼是ITEM_NO數據類型? – Awemo

+0

@Awemo varchar(20) – Alihamra

回答

1

結果是正確的,因爲"2L9" < "2L900BK"是真實的。這就像字典,你不希望在a之前找到add,是嗎?

你應該嘗試使用的item_no一子,其長度等於$from$to之間的最大距離:

$from = $_POST['from']; 
$to = $_POST['to']; 
$length = max(strlen($from), strlen($to)); 

$query = "SELECT * FROM items WHERE SUBSTRING(item_no, 1, ".$length.") BETWEEN '".$from."' AND '".$to."' ORDER BY item_no Asc"; 
+0

謝謝,它現在可行! – Alihamra

1

它停在那裏,因爲使用字符串比較按字母順序進行。這意味着2L9小於2L900

1L9 <= foo <= 2L9 <2L900 

是你會在這種情況下得到的。另一個例子是,

SELECT * FROM users WHERE name BETWEEN "A" and "Bart" 

你會得到一個名稱,如Baracus,因爲巴拉小於「巴特」,但不巴塞洛繆(比巴特字母更大)。

所以,如果你想要的2L900,你將不得不設置要最大可能的元素,即2L900BR

Binary Ordering