动态传递值时的PDO异常

时间:2016-07-27 18:55:05

标签: php pdo constraints

我有一个简单的PDO到MYSQL数据库的插入代码。

这是我的代码。

$catinsert="insert into shop_detail(shop_id,sub_category_id)values(:shop_id,:subcatid)";

$catresult=$pdocon->prepare($catinsert);

foreach($catexplode as $catval)
{
    $subcat=$catval;
//  $subcat=6;
    $catresult->bindValue(':shop_id',$shopid,PDO::PARAM_INT);
    $catresult->bindValue(':subcatid',$subcat,PDO::PARAM_INT);
    $catresult->execute();
}

当我传递$ subcat的静态值(已注释掉)时,它可以正常工作。但是当相同的值通过数组传递并且有界时,它会返回外键完整性违规的异常。

为了这个问题的背景。我有一个外键,将shop_detail表的sub_category_id列与具有相同列名的 sub_category 表相关联。

重要的。 要绑定和插入的值确实存在于 sub_category 表中。

以下是详细错误

  

exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`list`.`shop_detail`, CONSTRAINT `shop_to_subcat` FOREIGN KEY (`sub_category_id`) REFERENCES `sub_category` (`sub_category_id`))' in somewhat file.

1 个答案:

答案 0 :(得分:0)

从技术上讲,你做错了。你应该在循环之外绑定ONCE:

$subcat = null;
$stmt->bindParam(':subcatid', $subcat);
foreach($catexplode as $subcat) {
   $stmt->execute();
}

将变量绑定到占位符的重点是您只执行绑定ONCE。在PHP内部将设置相当于绑定变量的指针/引用,以便在您实际执行语句时拾取变量值的任何更改。