php - Mysql触发返回不良股票值(value)

标签 php mysql codeigniter triggers stock

我需要有关触发器的帮助。我有两个表“产品”和“存储”。这个想法是,当我对表“存储”触发器中的“标志”列运行更新时,必须计算正确 ID 的库存,但始终返回所有产品的错误值,请参阅附件。正确的库存值(value)应该是“测试”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 函数: 购物车 Controller :

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

产品 Controller :

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

产品 View :

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

最佳答案

你的触发器写错了,它是对所有产品进行更新,无论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 以便仅针对更新的产品标志进行更新。

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

关于php - Mysql触发返回不良股票值(value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40762200/

相关文章:

php - 在 Zend Framework 2 (ZF2) 中创建新 Controller 的问题

c# - 仅使用c# winform,不使用asp.netc#输入表单后如何检查用户是否登录

PHP:当使用explode()两次时,如何自动增加

php - 如何查询多个变量以在 Codeigniter 的 View 中显示

css - CodeIgniter:如何从助手中将 css 链接标记添加到 html 页面的头部

php - 批处理未插入到表中

javascript - Laravel Mix Uncaught ReferenceError : $ is not defined

C# 之于 Visual Studio 就像 PHP 之于……什么?

php - Excel PHP垂直对齐不起作用?

php - MySQL 查询不打印所有表数据