2016-03-02 184 views
1

首先我知道外鍵的錯誤是什麼,但是我不知道爲什麼它會在PDO的PHP代碼中發生。1452>外鍵約束失敗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); 

這是接收到的錯誤:

陣列([0] => 23000 [1] => 1452 [2] =>無法添加或更新的子行,外鍵約束失敗(empresapedido,約束fk_cliente外鍵(cod_cliente)參考文獻clientecod_cliente)ON DELETE NO ACTION ON UPDATE NO ACTION))

前面說過,已經我檢查已經在phpmyadmin的手動添加的cod_cliente存在和有效。

+0

好吧,它不能在那裏,或不是一個完全匹配的,所以mysql正確拒絕插入。僅僅因爲在phpmyadmin中看起來相同的東西並不意味着實際的值。嘗試像從客戶那裏選擇導致該錯誤的確切值相同的值,例如'select * from client where cod_client =?'並綁定完全相同的$ _POST值。 –

+1

不要引用佔位符。引用時,'?'是文字'?'。 – chris85

+0

@ chris85是對的,也許你的問題只是佔位符,將它改爲:'(?,?,?,?)' –

回答

2

佔位符不是字符串。它們應該沒有被引用:

$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是默認的類型。