2016-11-23 7 views
0

私のトリガーで助けが必要です。私は2つのテーブル '製品'と 'ストレージ'を持っています。アイデアは、テーブル 'ストレージ'トリガでカラム 'フラグ'の更新を実行するときに、正しいIDの在庫を計算する必要がありますが、常にすべての製品に間違った値を返します。右の株価は「テスト」10個と「aaaaaa」5個の値でなければなりません。手伝ってくれてありがとう。Mysqlトリガーが悪い株価を返す

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関数:ProductView

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

:カートコントローラ:

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あなたのトリガが間違って書かれている

<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

あなたのPHPコードはどこですか? –

+0

こんにちは、今投稿を編集しました – matus177

+0

"insert"クエリを実行する前に、在庫を確認するantotherクエリを実行します。たとえば、 "product = 'product_id'というストレージからcount(*)を選択します。 number_of_stock = $ query_res-> fetchColumn();これで株式数が –

答えて

1

、それはすべてのためのアップデートを行うことです製品に関係なくf 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を追加して何。

株式を更新する方法が最適ではないと思います。更新するたびに株式を計算するのはなぜですか?

+0

こんにちは、ありがとうございました。それは私がカートに商品を持っていて、商品ページからこの商品の数を自動的に数えた場合です(最初の写真に見られるように)。製品 'Test'には10個、製品には 'aaaaaa'が5個あります。 – matus177

+0

'flags 'の値はどのようなものでしょうか? – developer

+0

主なアイデアは:商品が利用可能な場合フラグが「A」で、数量がページに表示されている場合、誰かが購入ボタンを押して商品をカートに入れると「C」に更新され、これらの商品をカートの数量から削除すると、カウントアップされます。最後に、カート内のフォームが提出され、商品が販売されたときにフラグ値 'S'が取得され、利用できなくなりました。 – matus177

関連する問題