【发布时间】: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; ?> €</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