1452 > 外键约束失败 PDO PHP

Posted

技术标签:

【中文标题】1452 > 外键约束失败 PDO PHP【英文标题】:1452 > a foreign key constraint fails PDO PHP 【发布时间】:2016-03-02 19:29:28 【问题描述】:

首先我知道外键的错误是什么,但是我不知道为什么它会在带有PDO的php代码中发生。

插入函数:

function insert_pedido($cod,$pagamento,$total) 
    $id = $cod;
    $con = $this->connect();
    $data = date("Y/m/d");
    $DBH = $con->prepare("INSERT INTO pedido (cod_cliente, data, pagamento, total) VALUES ('?','?','?','?')");

    $DBH->bindParam(1,$id);
    $DBH->bindParam(2,$data);
    $DBH->bindParam(3,$pagamento);
    $DBH->bindParam(4,$total);

    if ($DBH->execute()) 
        return 1;
     else 
        print_r($DBH->errorInfo());
    

我通过这些参数进行函数调用

$cod = $_POST["cod_cliente"];
$pagamento = $_POST["pagamento"];
$total = $_POST["total"];

以及函数调用:

insert_pedido($cod,$pagamento,$total);

这是收到的错误:

Array ( [0] => 23000 [1] => 1452 [2] => 无法添加或更新子行:外键约束失败 (empresa.pedido, CONSTRAINT fk_cliente FOREIGN KEY (cod_cliente) 参考cliente (cod_cliente) 删除时不执行更新不执行操作))

正如我之前所说,我已经检查了 cod_cliente 的存在,已经在 phpmyadmin 中手动添加并且它有效。

【问题讨论】:

好吧,它不存在,或者不是相同的匹配,所以mysql正确地拒绝了插入。仅仅因为 phpmyadmin 中的某些东西看起来相同并不意味着这些值实际上是相同的。尝试使用导致此错误的完全相同的值从客户中进行选择,例如select * from client where cod_client=? 并绑定完全相同的 $_POST 值。 不要引用占位符。 ? 在引用时是文字 ?s。 @chris85 是对的,也许您的问题只是占位符,将其更改为:` (?,?,?,?)` @chris85 我认为您可以将其添加为答案。 how to prevent sql injection from this query?的可能重复 【参考方案1】:

占位符不是字符串。它们不应被引用:

$DBH = $con->prepare("
    INSERT INTO pedido (cod_cliente, data, pagamento, total) 
    VALUES (?, ?, ?, ?)
");

PDO 将处理将您的输入转换为必要值的过程。您可以通过指定类型来帮助确保提交正确类型的数据:

$DBH->bindParam(1, $id,   PDO::PARAM_INT);
$DBH->bindParam(2, $data, PDO::PARAM_STR);

PDO::PARAM_STR 是默认类型。

【讨论】:

以上是关于1452 > 外键约束失败 PDO PHP的主要内容,如果未能解决你的问题,请参考以下文章

尝试插入外键时出现错误 #1452

创建外键时,phpmyadmin 中的外键约束失败

Laravel 6:违反完整性约束:1452无法添加或更新子行:外键约束失败

Magento DB错误:完整性约束违规:1452无法添加或更新子行:外键约束失败

如何在 Laravel 5.1 完整性约束违规中添加外键:1452?

由于外键约束,使用 phpMyAdmin 复制数据库失败