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
, CONSTRAINTfk_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的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 6:违反完整性约束:1452无法添加或更新子行:外键约束失败
Magento DB错误:完整性约束违规:1452无法添加或更新子行:外键约束失败