2016-11-23 5 views
0

Ich brauche Hilfe mit meinem Auslöser. Ich habe zwei Tabellen "Produkt" und "Speicher". Die Idee ist, wenn ich Update auf Spalte "Flag" in der Tabelle ausführen "Speicher" Trigger müssen Lager für richtige ID berechnen, aber immer den falschen Wert für das gesamte Produkt zurückgeben, siehe Anhang. Der richtige Lagerwert sollte für "Test" 10 Stück und für "aaaaaa" 5 Stück sein. Danke für die Hilfe.Mysql Trigger Return schlechten Aktien Wert

result screen

Produkte Tabelle:

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

Speichertabelle:

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

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

Product:

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

Product:

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

wo ist dein PHP-Code? –

+0

Hallo, jetzt habe ich einen Beitrag bearbeitet – matus177

+0

Bevor Sie die "Einfügen" -Abfrage ausführen, führen Sie eine andere Abfrage, die für den Bestand überprüft z. B. "Anzahl (*) aus dem Speicher auswählen, wo Produkt = 'Produkt_ID'" nach der Abfrage können Sie einfach $ ausführen number_of_stock = $ query_res-> fetchColumn(); und damit hast du die Anzahl der Aktien –

Antwort

1

Ihre Trigger falsch geschrieben wird, ist es Update für alle machen Produkte unabhängig o f id.

Um die Änderungen nur für das Produkt mit dem aktualisierten Flag in dem Trigger die Update-Anweisung ändern, um den folgenden:

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 

Was wir tun where id = new.product_id fügen Update nur für aktualisierte Produkt Flagge zu machen.

Und ich denke, die Art, wie Sie den Bestand aktualisieren, ist nicht optimal, warum Sie jedes Mal, wenn Sie aktualisieren, den Bestand berechnen?

+0

Hallo, danke für Hilfe. Es ist, weil ich möchte, wenn ich ein Produkt im Warenkorb habe dann automatisch die Anzahl der Stücke dieses Produkts von der Produktseite heruntergezählt (wie Sie in der ersten Abbildung sehen). Für das Produkt 'Test' gibt es 10 Stück und für das Produkt 'aaaaaa' 5 Stück. – matus177

+0

was könnten die Werte von 'flags' sein? – developer

+0

Hauptidee ist: Wenn Produkt verfügbar ist Flagge ist "A" und Menge wird auf der Seite angezeigt, wenn jemand die Schaltfläche Kaufen drücken und Produkt in den Warenkorb Flagge wird auf "C" aktualisiert und Menge dieses Produkts ist von der gesamten Menge heruntergezählt aber wenn diese Produkte aus dem Warenkorb gelöscht werden, wird die Menge zurück gezählt. Schließlich, wenn das Formular im Einkaufswagen eingereicht wurde und das Produkt verkauft wurde, dann erhält der Flag-Wert "S" und es ist nicht mehr verfügbar. – matus177