【问题标题】:Mysql trigger return bad stocks valueMysql 触发器返回坏股票值
【发布时间】:2017-04-07 07:53:48
【问题描述】:

我的触发器需要帮助。我有两张表“产品”和“存储”。这个想法是当我对表“存储”触发器中的“标志”列运行更新时,必须计算正确 ID 的库存,但总是为所有产品返回错误值,请参阅附件。正确的库存价值应该是 'Test' 10 件和 'aaaaaa' 5 件。感谢帮助。

产品表:

CREATE TABLE `products` (
  `id` int(11) NOT NULL,
  `subcategory_id` int(11) NOT NULL,
  `product_name` varchar(255) COLLATE utf8_bin NOT NULL,
  `product_description` varchar(255) COLLATE utf8_bin NOT NULL,
  `product_price` int(11) NOT NULL,
  `product_type` varchar(1) COLLATE utf8_bin NOT NULL,
  `product_quantity` int(11) NOT NULL
) ENGINE=InnoDB;

INSERT INTO `products` (`id`, `subcategory_id`, `product_name`, `product_description`, `product_price`, `product_type`, `product_quantity`) VALUES
(45, 11, 'Test', 'test', 1111, 'G', 15),
(46, 11, 'aaaaaa', 'aaaaaa', 12, 'G', 15);

存储表:

CREATE TABLE `storage` (
  `id` int(11) NOT NULL,
  `product_id` int(11) NOT NULL,
  `flag` varchar(1) COLLATE utf8_bin NOT NULL DEFAULT 'A'
) ENGINE=InnoDB;

INSERT INTO `storage` (`id`, `product_id`, `flag`) VALUES
(46, 45, 'A'),
(47, 45, 'A'),
(48, 45, 'A'),
(49, 45, 'A'),
(50, 45, 'A'),
(51, 45, 'A'),
(52, 45, 'A'),
(53, 45, 'A'),
(54, 45, 'A'),
(55, 45, 'A'),
(56, 46, 'A'),
(57, 46, 'A'),
(58, 46, 'A'),
(59, 46, 'A'),
(60, 46, 'A');

mysql 触发器:

DELIMITER $$
CREATE TRIGGER `tg_ai_table22` AFTER UPDATE ON `storage` FOR EACH ROW UPDATE products
   SET products.product_quantity = (SELECT COUNT(product_quantity)
FROM STORAGE, (SELECT id FROM products) as prod
WHERE prod.id = storage.product_id AND storage.flag = 'A' LIMIT 1)
$$
DELIMITER ;

PHP 功能: 购物车控制器:

public function addToCart()
    {
        $id = $this->uri->segment(3);
        $data = $this->ProductModel->selectProductToCart($id);
        $cartData = array();
        foreach ($data as $datas) {
            $cartData = array(
                'id' => $datas->id,
                'qty' => 1,
                'price' => $datas->product_price,
                'name' => $datas->product_name
            );
        }
        $this->cart->insert($cartData) ? $this->db->limit(1)->set('flag', 'C')->where('product_id', $cartData['id'])->where('flag', 'A')->update('storage') : '';
    }

public function updateCart()
    {
        $updatedCartData = $this->input->post();

        for ($i = 1; $i <= sizeof($this->cart->contents()); $i++)
        {
            if ($this->cart->contents()[$updatedCartData[$i]['rowid']]['rowid'] == $updatedCartData[$i]['rowid'])
            {
                if ($this->cart->contents()[$updatedCartData[$i]['rowid']]['qty'] > $updatedCartData[$i]['qty'])
                {
                    $result = $this->cart->contents()[$updatedCartData[$i]['rowid']]['qty'] - $updatedCartData[$i]['qty'];
                    for ($j = 1; $j <= $result; $j++)
                    {
                        $this->db->limit(1)->set('flag', 'A')->where('product_id',
                            $this->cart->contents()[$updatedCartData[$i]['rowid']]['id'])->where('flag',
                            'C')->update('storage');
                    }
                } else
                {
                    $result = $updatedCartData[$i]['qty'] - $this->cart->contents()[$updatedCartData[$i]['rowid']]['qty'];
                    for ($j = 1; $j <= $result; $j++)
                    {
                        $this->db->limit(1)->set('flag', 'C')->where('product_id',
                            $this->cart->contents()[$updatedCartData[$i]['rowid']]['id'])->where('flag',
                            'A')->update('storage');
                    }
                }
            }
        }

        $this->cart->update($updatedCartData);
        $this->session->set_flashdata('category_success', 'Kosik bol aktualizovany.');
        redirect('Cart');
    }

产品控制器:

<?php defined('BASEPATH') OR exit('No direct script access allowed');

class Product extends MY_Controller
{
    public function __construct()
    {
        parent::__construct();
        $this->load->model('ProductModel');
    }

    public function index($id)
    {
        $data['product'] = $this->ProductModel->selectProduct($id);
        $this->load->view('HeaderView');
        $this->load->view('UpperMenuView');
        $this->load->view('LeftMenuView');
        $this->load->view('ProductView', $data);
        $this->load->view('FooterView');
    }
}

产品型号:

<?php defined('BASEPATH') OR exit('No direct script access allowed');

class ProductModel extends CI_Model
{
    private $table = 'products';

    public function __construct()
    {
        parent::__construct();
    }

    function selectProduct($id)
    {
        return $this->db->get_where($this->table, array('subcategory_id' => $id))->result();
    }

    function selectProductToCart($id)
    {
        return $this->db->get_where($this->table, array('id' => $id))->result();
    }

    public function insertProduct($data)
    {
        $this->db->insert($this->table, $data);
    }

    public function insertProductToStorage($data)
    {
        $this->db->insert('storage', $data);
    }
}

产品视图:

<div class="col-md-9">
    <?php $this->load->view('FlashMessagesView'); ?>
    <ul class="list-unstyled" id="products" data-role="list">
        <?php foreach ($product as $value): ?>
            <li class="span3 col-md-3">
                <div class="thumbnail">
                    <a href="product_details.html"><img src="<?php echo base_url('assets/img/12.jpg'); ?>"/></a>
                    <div class="caption" style="height: 300px; overflow: hidden">
                        <h5><?php echo $value->product_name; ?></h5>
                        <p><?php echo $value->product_description; ?></p>
                    </div>
                    <div class="product_footer caption">
                        <?php if ($value->product_quantity == 0) { ?>
                            <p style="text-align: center"><span style="color:orange"><b>Ordered on request.</b></span></p>
                        <?php } else { ?>
                            <p style="text-align: center">
                                <span style="color:green">
                                    <b>In stock <?php echo $value->product_quantity ?> pcs.</b>
                                </span>
                            </p>
                        <?php } ?>
                        <h4>
                            <a type="button" href="<?php echo base_url('Cart') ?>" id="<?php echo $value->id ?>"
                               class="btn btn-success">Buy</a>
                            <span class="pull-right"><?php echo $value->product_price; ?> &euro;</span>
                        </h4>
                    </div>
                </div>
            </li>
        <?php endforeach; ?>
    </ul>
</div>

【问题讨论】:

  • 你的php代码在哪里?
  • 你好,我现在编辑了一个帖子
  • 在执行“插入”查询之前,运行另一个查询来检查库存,例如“select count(*) from storage where product='product_id'”在执行查询之后你可以简单地运行 $number_of_stock = $query_res->fetchColumn();有了这个,你就有了股票的数量
  • 所以我不应该使用触发器?
  • @RafaelShkembi 你能具体说明一下吗?

标签: php mysql codeigniter triggers stock


【解决方案1】:

您的触发器写错了,它是对所有产品进行更新,而不管 id。

要仅针对具有更新标志的产品进行更改,请将触发器中的更新语句更改为以下内容:

UPDATE products
SET products.product_quantity = 
    (   
        SELECT COUNT(product_quantity)
        FROM STORAGE, (SELECT id FROM products) as prod
        WHERE prod.id = storage.product_id 
        AND storage.flag = 'A' LIMIT 1
    )
where id = new.product_id

我们所做的是添加where id = new.product_id 来更新产品标志。

而且,我认为你更新库存的方式不是最佳的,为什么每次更新时,你都要重新计算库存?

【讨论】:

  • 您好,感谢您的帮助。这是因为我想如果我在购物车中有一个产品,然后自动从产品页面倒数该产品的件数(如您在第一张图片中看到的那样)。产品“测试”有 10 件,产品“aaaaaa”有 5 件。
  • flags 的值可能是多少?
  • 主要思想是:当产品可用标志为'A'并且页面中显示数量时,如果有人按下购买按钮并将产品插入购物车标志更新为'C'并且该产品的数量从整体数量中倒数,但是当从购物车中删除这些产品时,数量会倒数。最后,当购物车中的表单被提交并且产品被售出时,获得标志值'S'并且它不再可用。
  • 好的,是的,但只有一个部分,当我按下购买按钮时,每个产品的数量都完美倒计时,但所有产品的整体数量都被计算为错误,并且问题处于触发状态,因为在我们的示例 15 中返回所有部分对于每个产品,我们希望 10 个用于“测试”,5 个用于“aaaa”。我们必须准确设置每种产品的件数。所以现在我在想如何解决这个问题。我是 MySQL 初学者,非常感谢您的帮助和提示。
  • 拜托,你能帮我用触发器来计算每个产品的总量吗?非常感谢。
猜你喜欢
  • 2017-09-08
  • 2011-01-17
  • 1970-01-01
  • 1970-01-01
  • 2016-08-12
  • 2017-08-12
  • 2020-03-29
  • 2021-03-23
  • 1970-01-01
相关资源
最近更新 更多