【问题标题】:PHP Prepared Statements fails to assign correct valuesPHP Prepared Statements 无法分配正确的值
【发布时间】: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


【解决方案1】:

改变这个 -

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

到这里——

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

所以你的父母 id 也会增加。

【讨论】:

  • 那行不通。还是同样的错误。另外,我经常重复使用参数,所以这不是错误的根源。
  • 您似乎正试图将重复值插入作为主键 @Mr.Manhattan 的列中。
  • 它是一个连接的主节点,所以 1-value 和 1-anotherValue 是可能的!
  • 已连接主节点?是的,多个唯一值是可能的,但您的错误指向重复值@Mr.Manhattan。
  • 如果我使用 phpMyAdmin 并执行结果查询,它就像一个魅力
【解决方案2】:

据我所知,您收到的错误表明PRIMARY KEYs 组合已存在于表中。你的桌子有composite primary keys 这意味着,有

PRIMARY KEY (`foreignID1`,`value`)

你可以INSERT这样的数据

+------------+-------+
| 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
+------------+-------+

【讨论】:

  • 请阅读我对帖子所做的最后一次编辑。如果我分开插入,它工作正常。如果已经有相同的条目,则不会出现这种情况。
  • 当我通过 phpMyAdmin 手动执行结果语句时,它也可以与链式插入一起使用
【解决方案3】:

我终于自己找到了答案:

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

要使其正常工作,必须使用 for 循环,否则可能不使用该值:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-03
    • 2014-03-29
    • 2015-07-14
    • 1970-01-01
    • 2012-08-23
    • 2013-08-25
    • 1970-01-01
    • 2016-10-25
    相关资源
    最近更新 更多