【发布时间】:2012-08-05 10:40:24
【问题描述】:
尝试使用 php 的 pdo 中准备好的语句插入或更新 sql。首先我想到了使用REPLACE INTO 命令,但它给了我一个错误,因为我的索引上有一个外键。读到我必须使用INSERT...ON DUPLICATE KEY UPDATE 语法才能使其工作,但我不清楚如何使用准备好的语句来做到这一点。有什么解决办法吗?谢谢。
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=?
当我使用具有不同名称的命名参数进行插入和更新时,如上所述..我没有收到任何错误,也没有数据插入到我的数据库中。 这是数据库的架构:
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`);
【问题讨论】:
-
我怀疑让您感到困惑的是,您不能在准备好的语句中多次使用命名参数。这意味着您必须将其编写为例如
INSERT INTO tablename (field1, field2) VALUES (:field1i, :field2i) ON DUPLICATE KEY UPDATE field1 = :field1u, field2 = :field2u,您将不得不复制您发送的数据。它在编程上有点糟糕,但它确实有效(刚刚测试过) -
@DaveRandom 嗯?重用命名参数效果很好,除非我的记忆力非常糟糕。
-
它没有给出错误但执行后数据库中没有值..那是什么?
-
@Dave 我很确定我之前写过
INSERT INTO foo (bar) VALUES (:baz) ON DUPLICATE UPDATE bar = :baz之类的代码并且它有效。该陈述可能是错误的或有其他含义。
标签: php sql pdo prepared-statement