Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/237.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP准备的语句无法指定正确的值_Php_Mysql_Pdo_Prepared Statement - Fatal编程技术网

PHP准备的语句无法指定正确的值

PHP准备的语句无法指定正确的值,php,mysql,pdo,prepared-statement,Php,Mysql,Pdo,Prepared Statement,我试图做的是插入多行键/值对。条目必须是唯一的(PrimaryKey必须是特定的) 准备语句时,要插入值的计数: $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; //I

我试图做的是插入多行键/值对。条目必须是唯一的(PrimaryKey必须是特定的)

准备语句时,要插入值的计数:

$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)
转储告诉我,每次(正确)分配其他值时:

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'
我肯定知道这些条目并不存在。我高度怀疑PDO语句会绑定同一个值两次,但我不知道为什么它会这样做


[编辑]:已实施建议答案,新输出:

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')
因为无论我尝试插入多少,约束总是在最后一个条目上失败


[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();  
}
…但这不是问题的实质所在。

改变这个-

$sql .= "(:parentID,:value$ix)";
为此—

$sql .= "(:parentID$ix,:value$ix)";

因此您的父id也会增加。

据我所知,您收到的错误表明表中已经存在
主键的组合。你的桌子有,也就是说

PRIMARY KEY (`foreignID1`,`value`)
您可以插入此类数据

+------------+-------+
| foreignID1 | value |   # There are duplicated `foo` values
+------------+-------+   # for column `value` which is ok
|     1      |  foo  |   # because PRIMARY KEY is made of
+------------+-------+   # two columns together,
|     2      |  foo  |   # not each respectively
+------------+-------+
|     3      |  bar  |
+------------+-------+
而这种情况是不可能的

+------------+-------+
| foreignID1 | value |   # First two entries are
+------------+-------+   # a constraint violation.
|     1      |  foo  |   #
+------------+-------+   # Columns `foreignID1` and `value`
|     1      |  foo  |   # create a single PRIMARY KEY
+------------+-------+   # therefore having the same combination
|     2      |  bar  |   # of values in these columns is impossible
+------------+-------+

我自己终于找到了答案:

问题在于foreach循环,因为bindParam()不复制变量,而是保存对它的引用。执行语句时,将读取值。foreach循环完成后,$value变量将保存foreach循环的最后一个值

要使其正常工作,必须使用for循环或不使用该值:

foreach($values as $key => $value){
    $stmt->bindParam(":parendID$key",$parentID);
    $stmt->bindParam(":value$key",$values[$key]);
}

您不能在PDO中重复使用占位符。在每个值元组中都有相同的
parentID
。只需将其设置为
”:parentID$ix“
,就像您对值一样。可能会重复相同的错误。哪个字段设置为主键?它是否具有
UNIQUE
约束?是否可能执行同一查询两次?这不起作用。还是一样的错误。另外,我经常重复使用参数,所以这不是错误的根源。看起来您试图在主键@Mr.Manhattan的列中插入一个重复的值。它是一个连接的主键,因此可以使用1-value和1-anotherValue!连接的主?是的,可以有多个唯一的值,但您的错误指向了一个重复的值@Mr.Manhattan。如果我使用phpMyAdmin并执行结果查询,它的工作原理就像一个示例,读取我对文章的最后一次编辑。如果我把插件分开,它就可以正常工作了。如果已经有相同的条目,则不会出现这种情况。当我通过phpMyAdmin手动执行生成的语句时,它也可以与链式插入一起工作
foreach($values as $key => $value){
    $stmt->bindParam(":parendID$key",$parentID);
    $stmt->bindParam(":value$key",$values[$key]);
}