Мне нужна помощь с моим курком. У меня есть две таблицы «продукт» и «хранение». Идея заключается в том, что когда я запускаю обновление для столбца ‘flag’ в таблице ‘storage’, триггер должен вычислять запас для правильного идентификатора, но всегда возвращать неправильное значение для всего продукта, см. Приложение. Правильная стоимость акции должна быть для «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');
}
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');
}
}
ProductModel:
<?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; ?> €</span>
</h4>
</div>
</div>
</li>
<?php endforeach; ?>
</ul>
</div>
Ваш триггер написан неверно, это обновление для всех продуктов независимо от их идентификатора.
Чтобы внести изменения только для продукта с обновленным флагом, измените оператор обновления в триггере на следующий:
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
сделать обновление только для обновленного флага продукта.
И я думаю, что способ обновления запаса не оптимален, поэтому каждый раз, когда вы делаете обновление, вы пересчитываете запас?
Других решений пока нет …