PHP简单搜索项目范围

时间:2012-10-01 13:01:28

标签: php mysql search between

首先,在写下PHP代码之前。我在mySQL数据库中有一个名为items的表。 假设它在 item_no

中有以下reocrds
  • 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。

现在我想要的是在我写下2l9时输出所有2l900 ...我认为BETWEEN在查询中有问题,但我找不到另一种方法。

谢谢

2 个答案:

答案 0 :(得分:1)

它停在那里因为与字符串的比较是按字母顺序完成的。这意味着 2L9 小于 2L900

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

foo 就是这种情况下你会得到的。另一个例子可能是,

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

你会得到一个像Baracus这样的名字,因为 Bara 小于“Bart”,但不是Bartholomew(按字母顺序大于Bart)。

因此,如果你想要2L900,你必须设置你想要的最大可能元素,即 2L900BR

请参阅Binary Ordering

答案 1 :(得分:1)

结果是正确的,因为"2L9" < "2L900BK"为真。它就像一本字典,你不希望在add之前找到a,对吗?

您应该尝试使用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";