2012-11-14 108 views
2

我有一個非常奇怪的錯誤,插入查詢到MySQL通過PDO。PHP PDO INSERT WHERE NOT EXISTS語句不起作用

如果此表中尚未存在此記錄,我想在表中插入記錄。

$query = "INSERT INTO Phrases (KeyText) 
      SELECT * FROM (SELECT :key_text) as tmp WHERE NOT EXISTS (SELECT 1 FROM Phrases WHERE KeyText = :key_text)"; 

    try 
    { 
     $preparedStatement = $db->prepare($query); 
     foreach ($phrases as $phrase) 
     { 
      $preparedStatement->execute(array(':key_text' => $phrase)); 
      echo "-"; 
     } 
    } 
    catch(PDOException $e) 
    { 
     echo $e->getMessage(); 
    } 

它引發exeption:調用一個非對象的成員函數execute()。

我不明白我的SQL命令錯誤在哪裏。其他代碼段是正確的,因爲當我將SQL命令更改爲其他時(例如:SELECT:key_text as kt)它正常工作。

感謝您的回答。

UPDATE: 錯誤是:

[0] => HY000 [1] => 1096 [2] =>否表中使用

我怎樣才能使正確的SQL命令對於MySQL? 變種與

INSERT INTO Phrases (KeyText) 
SELECT :key_text WHERE NOT EXISTS (SELECT 1 FROM Phrases WHERE KeyText = :key_text) 

也無法在MySQL中工作。

更新2:

INSERT INTO Phrases (KeyText) 
SELECT :key_text FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM Phrases WHERE KeyText = :key_text) 

該查詢與DUAL表的作品!

回答

5

您的準備調用失敗,並且您簡單地認爲它成功。

嘗試

$preparedStatement = $db->prepare($query) or die($db->errorInfo()); 

捕獲錯誤。

+0

哎呀,對不起。應該是$ db-> errorInfo()。我會編輯答案。 –

+0

錯誤是:[0] => HY000 [1] => 1096 [2] =>否表中使用 – Dmitriy

+0

解始建於DUAL表。謝謝! – Dmitriy

1

聽起來像prepare失敗,因此您試圖對無效對象調用execute(不是像預期的那樣準備好的語句對象)。檢查prepare的返回值實際上是一個PDOStatement對象,而不是FALSE

+0

但是,爲什麼當我改變SQL命令 「選擇1」 它的工作原理? – Dmitriy

+0

請看,我的編輯 – Dmitriy

1

您UPDATE2應該工作。

備選

對現場KeyText唯一或主鍵

ALTER TABLE `Phrases` ADD UNIQUE INDEX (`KeyText`); 

,然後使用查詢:

INSERT IGNORE INTO Phrases (KeyText) VALUES (:key_text); 

關於沒有改變被記錄,請檢查是否有自動提交在或做commit

+0

是的,謝謝。 DUAL表解決了我的問題。謝謝! – Dmitriy

0

錯誤:

insert into table 
    select * from (select 1 a, 2 b) t 
    where not exists(select 1 from t2 where t2.c =2) 

權:

insert into table 
    select * from (select 1 a, 2 b union select 1 a, 2 b) t 
    where not exists(select 1 from t2 where t2.c =2)