【问题标题】:Check running inventory for available rental stock检查可用租赁库存的运行库存
【发布时间】:2016-12-06 10:07:33
【问题描述】:

我正在为假设的租赁业务构建一个网站,并尝试在用户单击“添加到购物车”按钮时检查指定时间段内的可用库存。我在运行 SQL 查询时遇到了一些问题,主要是(我认为)因为我的 $product_id 变量是一个整数,但我要查询的列的形式是“item1”、“item2”等。

我尝试使用的逻辑是从表中可用的数字中减去所需的数量,在给定的时间跨度内取这些值中的最小值,然后检查该数字是否在任何时候低于零.

以下是相关代码:

switch ($action) {
case 'view':
    $cart = cart_get_items();
    break;
case 'add':
    $product_id = filter_input(INPUT_GET, 'product_id', FILTER_VALIDATE_INT);
    $quantity = filter_input(INPUT_GET, 'quantity');
    $pickup = filter_input(INPUT_GET, 'pickup');
    $return = filter_input(INPUT_GET, 'return');

    // validate the quantity entry
    if ($quantity === null) {
        display_error('You must enter a quantity.');
    } elseif (!is_valid_number($quantity, 1)) {
        display_error('Quantity must be 1 or more.');
    }

    // check for available inventory
    $query = "SELECT MIN((SELECT CONCAT('item',:product_id)) - :quantity) FROM running_inventory WHERE date BETWEEN :pickup AND :return";
    $statement = $db->prepare($query);
    $statement->bindValue(':product_id', $product_id);
    $statement->bindValue(':quantity', $quantity);
    $statement->bindValue(':pickup', $pickup);
    $statement->bindValue(':return', $return);
    $statement->execute();
    $available = $statement->fetch();
    $num_avail = $available[0];
    var_dump($num_avail);
    $statement->closeCursor();
    if ($num_avail - $quantity >= 0) {
    cart_add_item($product_id, $quantity);
    } else {
        display_error('The indicated quantity of stock is not available for your rental period.');
    }
    $cart = cart_get_items();
    break;

这是 $available 的 var_dump:

array(2) { ["MIN((SELECT CONCAT('item','6')) - '3')"]=> string(2) "-3" [0]=> string(2) "-3" } string(2) "-3"

这显然只是从 0 中减去 $quantity,但我似乎无法准确找出问题所在。

【问题讨论】:

  • 那么,有什么问题?
  • 抱歉,我是 SO 新手,目前有点杂乱无章。我用 var_dump 编辑了帖子。
  • 你还没有解释问题。您期望返回什么值?为什么要从字符串中减去一个数字?当然,这是行不通的。为什么对单个值使用 MIN 函数?这不会有任何作用。

标签: php html mysql sql


【解决方案1】:

试试这个:

$query = "SELECT item{$product_id} - :quantity FROM running_inventory WHERE  date BETWEEN :pickup AND :return";

【讨论】:

  • 感谢您提供帮助。我不确定我应该发布多少底层表结构的细节,但我现在意识到这比我做的要多得多。我的 running_inventory 表中的列是日期 (DATE) 和每个项目的一列,每个项目的形式为 itemX (INT)。我的主要问题是我需要从名为“item7”的列中进行选择,但 $product_id 只是一个整数。我试图在查询中使用 CONCAT,以便调用正确的列名,但我不确定这是否是正确的处理方式。
猜你喜欢
  • 1970-01-01
  • 2013-08-22
  • 2018-07-25
  • 1970-01-01
  • 2016-06-12
  • 2019-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多