价格范围查询返回不准确的结果

时间:2012-06-20 02:00:00

标签: php mysql

我有一个搜索表单,用户可以在其中搜索指定价格范围内的产品。 其中我有2个输入框1用于起始范围,另一个用于结束范围。

我的数据库表中有3个产品商店。价格分别为2300.00001200.00001000.5000

我在选择输入价格范围内的值时遇到问题。问题是,当我输入像

这样的值时
  1. 100起始范围为1100结束范围。 1200.0000的产品 并且正在显示1000.5000而不是1000.5000 产品
  2. 0起始范围为1100结束范围或1000.50结束范围。该 显示1200.00001000.5000的产品而不是。{ 只有1000.5000产品。
  3. 1100起始范围。仅包含2300.0000的产品 显示的不是2300.00001200.0000。但当时 所有3种产品的起始值均小于或等于500 正在展示。
  4. 这是我正在使用的代码。

    function db_prepare_input($string)
    {
        if (is_string($string)) {
            return trim(stripslashes($string));
        } elseif (is_array($string)) {
            reset($string);
            while (list($key, $value) = each($string)) {
                $string[$key] = db_prepare_input($value);
            }
            return mysql_real_escape_string($string);
        } else {
            return mysql_real_escape_string($string);
        }
    }
    
    $pricefrom_key = db_prepare_input(number_format($_GET['pricefrom'], 4, '.', ''));
    $priceto_key = db_prepare_input(number_format($_GET['priceto'], 4, '.', ''));
    
    // Price Range
    if (!empty($_GET['pricefrom']) && !empty($_GET['priceto'])) {
        $price_range = " having price >= ".$pricefrom_key." and price <= ".$priceto_key;
    }
    elseif(empty($_GET['pricefrom']) && !empty($_GET['priceto']))
    {
        $price_range = " having price >= 0 and price <= ".$priceto_key;
    }
    
    elseif(!empty($_GET['pricefrom']) && empty($_GET['priceto']))
    {
        $price_range = " having price >= ".$pricefrom_key;
    }
    
    elseif(!empty($_GET['pricefrom']) && !empty($_GET['priceto']))
    {
        $price_range = "";
    }
    
    $catglobal_sql = "select p.blog_id, p.global_category_id, p.products_id, p.products_currency, p.products_type, p.products_name, p.products_description, p.products_quantity, p.products_model, p.products_image, p.products_price, p.products_date_added, p.products_last_modified, p.products_date_available, p.products_weight, p.products_status, p.products_tax_class_id, p.manufacturers_id, p.products_ordered, p.specials_new_products_price, p.specials_date_added, p.specials_last_modified, p.expires_date, p.date_status_change, p.status, p.display_product, case when (p.specials_new_products_price > 0 or p.specials_new_products_price != 0000-00-00 and p.expires_date > Now() and p.status != 0) then p.specials_new_products_price else p.products_price end price from ".TABLE_GLOBAL_PRODUCTS." p INNER JOIN ".TABLE_STORES." s ON s.blog_id = p.blog_id where MATCH (p.products_name,p.products_description) AGAINST ('%".$search_key."%') OR p.products_name like '%".$search_key."%' and s.countries_id = '168' ".$search_cat." and p.display_product = '1' and p.products_status = '1' ".$price_range." order by p.products_date_added DESC, p.products_name";
    

    我尝试了,添加了die($catglobal_sql);,结果是,

    select p.blog_id, p.global_category_id, p.products_id, p.products_currency, p.products_type, p.products_name, p.products_description, p.products_quantity, p.products_model, p.products_image, p.products_price, p.products_date_added, p.products_last_modified, p.products_date_available, p.products_weight, p.products_status, p.products_tax_class_id, p.manufacturers_id, p.products_ordered, p.specials_new_products_price, p.specials_date_added, p.specials_last_modified, p.expires_date, p.date_status_change, p.status, p.display_product, case when (p.specials_new_products_price > 0 or p.specials_new_products_price != 0000-00-00 and p.expires_date > Now() and p.status != 0) then p.specials_new_products_price else p.products_price end price from wp_global_products_table p INNER JOIN wp_blogs s ON s.blog_id = p.blog_id where MATCH (p.products_name,p.products_description) AGAINST ('%cotton%') OR p.products_name like '%cotton%' and s.countries_id = '168' and p.products_currency = 'php' and p.display_product = '1' and p.products_status = '1' and p.products_type = 'a' having price >= 0 and price <= 1200.0000 order by p.products_date_added DESC, p.products_name
    

    似乎是什么问题?

2 个答案:

答案 0 :(得分:0)

我发现了问题..它的情况......我已将其修改为case when p.specials_new_products_price >= 0.0000 and p.expires_date > Now() and p.status != 0 then p.specials_new_products_price else p.products_price end price

答案 1 :(得分:-1)

你到底在用这条线做什么..

$price_range = " having price >= ".$pricefrom_key." and price <= ".$priceto_key;

你不应该只设置$ price_range,即:。

if (!empty($_GET['pricefrom']) && !empty($_GET['priceto']))

{

      if($price_range >= $pricefrom_key && $price_range <= $priceto_key)
      {
      echo "you are in the pricerange from" .$pricefrom_key." to ".$priceto_key;
      } 
//etc......
}

编辑:因为有些人没有得到答案,这只是指向正确的方向。如果我们使用“echo”语句或SQL查询并不重要,您仍需要正确指定范围。声明:

$price_range = " having price >= ".$pricefrom_key." and price <= ".$priceto_key;

..几乎说:价格范围=一些文字。号码。一些文字。数 &lt; =&gt;运算符在“”中表示TEXT,它们将被忽略。我希望这是有道理的。