2012-10-01 56 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