2012-08-08 218 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