2014-10-04 60 views
0

我試圖創建多個條件的INSERT語句作爲PHP函數的一部分 - 這是我到目前爲止的代碼:MYSQL有條件的插入與多個條件

public function insertData($data) 
    { 
     try 
     { 
      $stmt = $this->con->prepare(' 
      INSERT IGNORE INTO tblProductData(
      strProductCode, 
      strProductName, 
      strProductDesc, 
      smintStockLevel, 
      dblPrice, 
      dtmDiscontinued, 
      dtmAdded) 
      SELECT :strProductCode, 
        :strProductName, 
        :strProductDesc, 
        :smintStockLevel, 
        :dblPrice, 
      (CASE WHEN :dtmDiscontinued = "yes" then NOW(); 
      ELSE SET dtmlDiscontinued = "NULL"; 
      END CASE), 
      NOW() 
      FROM dual 
      WHERE not (:dblPrice < 5.0 and :smintStockLevel < 10) 
      and not (:dblPrice > 1000.0) '); 

      $length = count($data); 
      for ($x=0; $x < $length; $x++) { 
      $params = array(':strProductCode' => $data[$x][0], 
          ':strProductName' => $data[$x][1], 
          ':strProductDesc' => $data[$x][2], 
          ':smintStockLevel' => $data[$x][3], 
          ':dblPrice' => $data[$x][4]); 

      $stmt->execute($params); 
      } 

      return $stmt; 
      } catch(PDOException $e) { 
       echo 'ERROR: ' . $e->getMessage(); 
      } 
     } 
    } 

的條件如下

  • 如果dblPrice的值小於5,並且smintStockLevel的值小於10,則不會插入該行。
  • 如果dblPrice值大於1000 - 不要插入該行
  • 其中dtmDiscontinued =「是」的NOW()函數將被調用插入單元格中的當前日期/時間。否則,請輸入NULL

此查詢正在作爲PHP準備語句的一部分執行,它正在遍歷包含所有值的多維數組。

我需要創建多個CASE(s)嗎?有人可以提供建議,以解決這個問題的最佳途徑。

需要更多信息,請告訴我。

UPDATE

上面的代碼已被輸入到顯示完整的背景,其中包括戈登的建議。但是,我正在執行時收到錯誤ERROR: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens

有人可以看到原因嗎?由於

所需的解決方案

:dtmlDiscontinued添加到$params解決錯誤:

$params = array(':strProductCode' => $data[$x][0], ':strProductName' => $data[$x][1], ':strProductDesc' => $data[$x][2], 
          ':smintStockLevel' => $data[$x][3], ':dblPrice' => $data[$x][4], ':dtmDiscontinued' => $data[$x][5]); 
+2

檢查的條件。 – 2014-10-04 18:51:44

回答

1

不能使用where條款與values。您可以在SQL中實現你的邏輯,像這樣的東西:(使用where時,請注意from dual實際上並沒有做任何事情,但有些數據庫需要from條款)

INSERT INTO tblProductData(strProductCode, strProductName, strProductDesc, smintStockLevel, 
          dblPrice, dtmDiscontinued, dtmAdded 
         ) 
    SELECT :strProductCode, :strProductName, :strProductDesc, :smintStockLevel, 
      :dblPrice, 
      (case when :dtmDiscontinued = 'Yes' then NOW() end), 
      NOW() 
    FROM dual 
    WHERE not (:dblPrice < 5.0 and :smintStockLevel < 10) and 
      not (:dblPrice > 1000.0); 

我不知道什麼dtmDiscontinued = 'yes'的意思。但是像上面這樣的東西應該有效。

也就是說,您可能會發現將邏輯放在應用程序層而不是數據庫中更容易。如果你總是想檢查這些條件,那麼考慮一個觸發器。

+0

感謝 - 不幸的是這是拋出'錯誤:SQLSTATE [HY093]:無效的參數號:綁定變量的數量不匹配令牌數量 - 任何想法爲什麼?參數的數量似乎與兩部分相匹配? – aphextwix 2014-10-04 19:14:06

+0

難道這是因爲在'dtmDiscontinued ='''什麼都沒有輸入的情況下? – aphextwix 2014-10-04 19:17:05

+0

@aphextwix。 。 。我不知道爲什麼參數數量不匹配。 – 2014-10-04 19:35:44

0

Mysql沒有檢查約束,因此您必須在觸發器中實現它們。 爲了讓YPU一個領先地位:

DELIMITER $$ 
CREATE TRIGGER product_cond BEFORE INSERT ON tblProductData 
FOR EACH ROW 
BEGIN 
    declare message VARCHAR(255); 
    declare hasError BIT; 
    IF new.dblPrice < 5 AND new.smintStockLevel < 10 THEN 
     SET hasError := 1; 
     SET message := 'If price is less then 5 stock has to be more then 10'; 
    END IF; 
    IF new.dblPrice > 1000 THEN 
     SET hasError := 1; 
     SET message := 'Price can not be over 1000'; 
    END IF; 
    /* create the other ckecks in the same way 
    If check failed signal an error */ 
    IF hasError = 1 THEN 
     SIGNAL SQLSTATE '45000' 
      SET MESSAGE_TEXT = message; 
    END IF; 
END$$ 

DELIMITER ; 

注意,MySQL 5。5+需要使用SIGNAL

當然,你可以插入之前做這些檢查也是在應用層中的PHP