2012-08-08 220 views
0

嘗試使用php的pdo中的預處理語句插入或更新sql。首先,我想到了使用REPLACE INTO命令,但它給了我一個錯誤,因爲我的索引上有一個外鍵。請閱讀我必須使用INSERT...ON DUPLICATE KEY UPDATE語法使其工作,但我不清楚如何使用準備好的語句來做到這一點。任何解決方案?謝謝。在MySQL中使用預處理語句插入或更新

的SQL是:

$sql="REPLACE INTO fn_currencies(id,short,name,buy,sell,date) VALUES (:id,:short,:name,:buy,:sell,:update)"; 

UPD:我正在Yii中此查詢使用個人包裝在PDO。 當我使用未命名參數,我得到這種類型的錯誤:

CDbCommand failed to execute the SQL statement: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens. The SQL statement executed was: INSERT INTO `fn_currencies` (id,short,name,buy,sell,date) VALUES (?,?,?,?,?,?) ON DUPLICATE KEY UPDATE id=?,short=?,name=?,buy=?,sell=?,date=? 

當我使用與插入和更新遞延名字命名的參數是mentioned..I沒有錯誤和沒有數據插入我的數據庫。 下面是DB模式:

CREATE TABLE IF NOT EXISTS `fn_currencies` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `short` varchar(4) NOT NULL, 
    `name` varchar(200) NOT NULL, 
    `buy` decimal(10,4) NOT NULL, 
    `sell` decimal(10,4) NOT NULL, 
    `date` date NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

-- 
ALTER TABLE `fn_currencies` 
    ADD CONSTRAINT `FK_fn_currencies` FOREIGN KEY (`id`) REFERENCES `fn_operations` (`currency_id`); 
+0

我懷疑是讓你感到困惑的是,你不能在一個準備好的語句中多次使用一個命名參數。這意味着你必須寫一個例如INSERT INTO tablename(field1,field2)VALUES(:field1i,:field2i)ON DUPLICATE KEY UPDATE field1 =:field1u,field2 =:field2u'您必須複製您發送的數據。它稍微吸收編程,但它確實工作(只是測試它) – DaveRandom 2012-08-08 10:28:10

+0

@DaveRandom咦?重複使用命名參數的工作很好,除非我的記憶讓我感到非常失望。 – deceze 2012-08-08 10:35:39

+0

@deceze ['不能在準備好的語句中兩次使用同名的命名參數標記。](http://php.net/manual/en/pdo.prepare.php) – DaveRandom 2012-08-08 10:36:31

回答

3

感謝DavaRandom,他指出,在我的代碼中的錯誤,但是這應該做的伎倆。與?更換指定的參數和使用數組合並來隨時進行這樣的SQL:

$sql=" 
    insert INTO fn_currencies(id,short,name,buy,sell,date) 
    VALUES (?,?,?,?,?,?) 
    on duplicate key update currencies set 
     short=?, name=?, buy=?, sell=?, update=?"; 
$values=array("id"=>1, "short"=>36, "name"=>'Bazinga', "sell"=>3.67, "date"=>'2012-08-08'); 
$db->query($sql, array_merge(array_values($values),array_values($values))); 

顯然,這也將工作(見註釋各地約是/否/也許頁),但上述肯定會工作:

$sql=" 
    insert INTO fn_currencies(id,short,name,buy,sell,date) 
    VALUES (:id,:short,:name,:buy,:sell,:update) 
    on duplicate key update currencies set 
     short=:short, name=:name, buy=:buy, sell=:Sell, update=:update"; 
+1

在同一查詢中,不能多次使用命名參數。我承認,這有點吸吮。你也不需要'UPDATE'部分中的表名或'SET'關鍵字。 – DaveRandom 2012-08-08 10:28:43

+0

@DaveRandom嘿,謝謝你,但這些蘋果怎麼樣? – Fluffeh 2012-08-08 10:38:20

+0

看起來不錯 - 雖然如果您仔細查看Q上的評論,您會看到我已更正了重複使用命名參數點。愚蠢的是,我相信我在手冊中讀到的是什麼。但無論如何,使用未命名的參數可以保證它能正常工作。 – DaveRandom 2012-08-08 10:49:47