【发布时间】:2015-01-14 17:14:28
【问题描述】:
我想要做的是插入多行键/值对。 Entries 必须是唯一的(PrimaryKeys 是特定的)。
语句准备好要插入的值的计数:
$sql = "INSERT INTO `test_values` (`foreignID1`,`value`) VALUES";
for($ix=0;$ix<count($values);$ix++){
if($ix>0){ $sql.= ", ";}
$sql .= "(:parentID,:value$ix)";
}
echo $sql; //INSERT INTO `test_values` (`parentID`,`value`) VALUES (:parentID,:value0), (:parentID,:value1)
然后,在准备语句时,我循环值:
$stmt = $dbh->prepare($sql);
$stmt->bindParam(':parentID',$parentID);
foreach($values as $key => $value){
$valName = ":value$key";
var_dump($valName);
var_dump($value);
$stmt->bindParam($valName,$value);
}
转储告诉我,每次(正确)分配其他值时:
string(7) ":value0"
string(14) "one.domain.com"
string(7) ":value1"
string(18) "another.domain.com"
仍然,我得到了 SQL 错误:
Error: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '18-another.domain.com' for key 'PRIMARY'
我绝对知道这些条目不存在。我高度怀疑 PDOStatement 绑定相同的值两次,但我不知道为什么要这样做。
[编辑]:建议答案已实施,新输出:
string(7) ":parent0"
string(14) "18"
string(7) ":value0"
string(14) "one.domain.com"
string(7) ":parent1"
string(14) "18"
string(7) ":value1"
string(18) "another.domain.com"
还是同样的错误。
[EDIT2]:避免讨论:
INSERT INTO `test_values` (`parentID`,`value`) VALUES ('18','one.domain.com'),('18','another.domain.com')
使用 phpMyAdmin 直接应用于数据库,就像一个魅力......我担心我的陈述发生的情况是值以某种方式设置不正确,结果如下:
INSERT INTO `test_values` (`parentID`,`value`) VALUES ('18','another.domain.com'),('18','another.domain.com')
因为无论我尝试插入多少个,约束总是在 LAST 条目上失败。
[EDIT3]:
按要求的表结构:
CREATE TABLE IF NOT EXISTS `test_values` (
`foreignID1` int(11) NOT NULL,
`value` varchar(256) NOT NULL,
PRIMARY KEY (`foreignID1`,`value`)
)
[EDIT4]:
起作用的不是使用链式插入,而是为每个值使用单个插入:
$sql = "INSERT INTO `test_values` (`foreignID1`,`value`) VALUES (:parendID,:value)";
foreach($values as $key => $value){
$stmt = $dbh->prepare($sql);
$stmt->bindParam(":parendID",$parentID);
$stmt->bindParam(":value",$value);
$stmt->execute();
}
....但这不是问题的真正重点。
【问题讨论】:
-
您不能在 PDO 中重复使用占位符。您在每个值元组中都有相同的
parentID。就让它":parentID$ix"就像你的价值一样。 -
还是同样的错误。
-
哪个字段设置为主键?它有
UNIQUE约束吗? -
您是否有可能两次执行相同的查询?
标签: php mysql pdo prepared-statement