Mysql触发返回坏股票价值

时间:2016-11-23 10:43:20

标签: php mysql codeigniter triggers stock

我的触发器需要帮助。我有两个表'产品'和'存储'。我的想法是当我在表'storage'中的列'flag'上运行update时,触发器必须为正确的ID计算库存,但总是为所有产品返回错误的值,请参阅attach。正确的库存值应为'测试'10个,'aaaaaa'5个。感谢帮助。

result screen

产品表:

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');
    }

ProductController的:

<?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);
    }
}

的ProductView:

<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>

1 个答案:

答案 0 :(得分: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以仅针对更新的产品标记进行更新。

而且,我认为您更新股票的方式不是最优的,为什么每次进行更新时,您都会重新计算股票?