2016-02-02 34 views
1

我無法用PHP中的表單中的外鍵更新數據庫字段。 我已經嘗試了一些東西,但是每次出現這2個錯誤:PHP外鍵問題 - 我無法用外鍵更新數據庫字段

致命錯誤:帶有消息'SQLSTATE [23000]的未捕獲異常'PDOException':完整性約束違規:1452無法添加或更新子行:外鍵約束失敗(database_slattbl_slat,約束tbl_slat_ibfk_3外鍵(descricao_acesso)參考文獻tbl_anomalia_acessodescricao))」在C:\瓦帕\ WWW \ camaraSlat \ update_ocorrencia.php上線20

PDOException:SQLSTATE [23000]:完整性約束違例:1452無法添加或更新子行:外鍵約束失敗(database_slattbl_slat,CONSTRAINT tbl_slat_ibfk_3外鍵(descricao_acesso)參考文獻tbl_anomalia_acessodescricao))在C:\瓦帕\ WWW \ camaraSlat \ update_ocorrencia.php上線20

這是我的代碼(僅形式的某些字段是更新):

CREATE TABLE IF NOT EXISTS `tbl_anomalia_acesso` (
`descricao` varchar(255) NOT NULL, 
PRIMARY KEY (`descricao`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

INSERT INTO `tbl_anomalia_acesso` (`descricao`) VALUES 
('10.2 - Disjuntor - rearmar'), 
('4.1 Controlador - substituição integral'), 
('4.2 Controlador - carta danificada'), 
('4.3 Controlador - CPU danificado'), 
('4.4 Controlador - backplane danificado'), 
('4.5 Controlador - Reprogramar manualmente'), 
('4.6 Controlador - CC intermitente c/ chave de polícia '); 

CREATE TABLE IF NOT EXISTS `tbl_slat` (
`id_slat` int(11) NOT NULL AUTO_INCREMENT, 
`ocorrencia` int(11) NOT NULL, 
`descricao_slat` varchar(100) DEFAULT NULL, 
`descricao_cctv` varchar(100) DEFAULT NULL, 
`descricao_acesso` varchar(100) DEFAULT NULL, 
`ocorrencia_cronologia` varchar(50) NOT NULL, 
`tipologia` varchar(100) NOT NULL, 
`emissor` varchar(50) NOT NULL, 
`recetor` varchar(50) NOT NULL, 
`data` datetime NOT NULL, 
`local` varchar(100) NOT NULL, 
`grupo` int(11) DEFAULT NULL, 
`lado` varchar(50) DEFAULT NULL, 
`entrada` int(11) DEFAULT NULL, 
`estado_equipamento` varchar(100) DEFAULT NULL, 
`estado_anomalia` varchar(100) NOT NULL, 
`observacoes` varchar(100) DEFAULT NULL, 
PRIMARY KEY (`id_slat`), 
KEY `descricao_slat`  (`descricao_slat`,`descricao_cctv`,`descricao_acesso`,`ocorrencia_cronologia`,`tipologia`,`emissor`,`recetor`,`local`,`lado`,`estado_equipamento`,`estado_anomalia`), 
KEY `descricao_slat_2` (`descricao_slat`), 
KEY `descricao_cctv` (`descricao_cctv`), 
KEY `descricao_acesso` (`descricao_acesso`), 
KEY `ocorrencia_cronologia` (`ocorrencia_cronologia`), 
KEY `tipologia` (`tipologia`), 
KEY `emissor` (`emissor`), 
KEY `recetor` (`recetor`), 
KEY `local` (`local`), 
KEY `lado` (`lado`), 
KEY `estado_equipamento` (`estado_equipamento`), 
KEY `estado_anomalia` (`estado_anomalia`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ; 

INSERT INTO `tbl_slat` (`id_slat`, `ocorrencia`, `descricao_slat`, `descricao_cctv`, `descricao_acesso`, `ocorrencia_cronologia`, `tipologia`, `emissor`, `recetor`, `data`, `local`, `grupo`, `lado`, `entrada`, `estado_equipamento`, `estado_anomalia`, `observacoes`) VALUES 
(1, 150911414, NULL, NULL, '4.1 Controlador - substituição integral', 'TÉCNICO NO LOCAL', 'Manutenção corretiva', 'FERNANDO RIBEIRO - CMP', 'ANTÓNIO FERREIRA - CMP', '2015-01-09 14:15:30', '6/10 - Praça Trindade/F.Tomás/Rua Clube Fenianos /H. Mártires Angola/Rua Dr. Ricardo Jorge', NULL, NULL, NULL, NULL, 'CONCLUÍDO', NULL), 
(2, 1501191507, '1.6 Semáforo Ótica verde apagada', NULL, NULL, 'TÉCNICO NO LOCAL', 'Manutenção preventiva', 'PAULA PINHEIRO - CMP', 'BRUNO CARDOSO - CMP', '2016-01-19 15:07:49', '9 - Rua Campo Alegre/Rua Ruben A', NULL, NULL, NULL, NULL, 'CONCLUÍDO', 'Realização de testes á fibra ótica'), 
(3, 1501081700, '1.8 Semáforo Ótica encarnado apagado', NULL, NULL, 'PEDIDO DE INTERVENÇÃO', 'Manutenção preventiva', 'BRUNO CARDOSO - CMP', 'REIS PINTO - CMP', '2016-01-08 17:00:44', '1 - Rua Oliveira Monteiro/Rua Nossa Senhora Fátima', 5, 'DIREITO', NULL, NULL, 'CONCLUÍDO', NULL); 

FORM:

<form name="registo" action="update_ocorrencia.php" method="POST"/> 
    <input type="hidden" name="id_slat" value="<?php echo $row ["id_slat"]; ?>"> 
    Ocorrência nº <input type="text" name="ocorrencia" value="<?php echo $row ["ocorrencia"]; ?>"> 
    Data/hora de registo <input type="date" name="data" value="<?php echo $row ["data"]; ?>"> 
    <br><br> 
    Descrição da ocorrência Acesso 
    <select name="acesso"> 
     <?php 
     while($row = $sth2->fetch()) { 
        echo "<option value=".$row['descricao'].">".$row['descricao']."</option> "; 
       } 
     ?> 
    </select> 
    </br></br> 
    Descrição da ocorrência Slat 
    <select name="slat"> 
     <?php 
     while($row = $sth3->fetch()) { 
        echo "<option value=".$row['descricao'].">".$row['descricao']."</option> "; 
       } 
     ?> 
    </select> 
    </br></br> 
    Descrição da ocorrência CCTV 
    <select name="cctv"> 
     <?php 
     while($row = $sth4->fetch()) { 
        echo "<option value=".$row['descricao'].">".$row['descricao']."</option> "; 
       } 
     ?> 
    </select> 

    <br><br>Local 
    <select name="local"> 
     <?php 
     while($row = $sth5->fetch()) { 
        echo "<option value=".$row['local'].">".$row['local']."</option> "; 
       } 
     ?> 
    </select> 

    <br><br>Emissor 
    <select name="emissor"> 
    <?php 
     while($row = $sth6->fetch()) { 
      echo "<option value=".$row['notificante'].">".$row['notificante']."</option> "; 
     } 
    ?> 
    </select> 

    Oc. tabela Jul13 a Jul15 <input type="text" name="ocorrencia_tabela"> 

    <br><br>Recetor 
    <select name="recetor"> 
     <?php 
      while($row = $sth7->fetch()) { 
       echo "<option value=".$row['notificante'].">".$row['notificante']."</option> "; 
      } 
     ?> 
    </select> 
    Grupo <input type="text" name="grupo" value="<?php echo $row2 ["grupo"]; ?>"> 
    Entrada <input type="text" name="entrada" value="<?php echo $row3 ["entrada"]; ?>"> 

    <br><br>Ocorrência cronologia 
    <select name="ocorrencia_cronologia"> 
     <?php 
      while($row = $sth10->fetch()) { 
       echo "<option value=".$row['ocorrencia_cronologia'].">".$row['ocorrencia_cronologia']."</option> "; 
      } 
     ?> 
    </select> 

    <br><br>Lado 
    <select name="lado"> 
     <?php 
      while($row = $sth11->fetch()) { 
        echo "<option value=".$row['lado'].">".$row['lado']."</option> "; 
       } 
     ?> 
    </select> 

    <br><br>Observações 
    <textarea name="observacoes" rows="4" cols="50"><?php echo $row4 ["observacoes"]; ?></textarea> 

    <br><br>Estado anomalia/avaria 
    <select name="estado"> 
     <?php 
      while($row = $sth13->fetch()) { 
        echo "<option value=".$row['estado_anomalia'].">".$row['estado_anomalia']."</option> "; 
       } 
     ?> 
    </select> 

    <br><br>Estado equipamento 
    <select name="estado_equipamento"> 
     <?php 
      while($row = $sth14->fetch()) { 
        echo "<option value=".$row['estado_equipamento'].">".$row['estado_equipamento']."</option> "; 
       } 
     ?> 
    </select> 

    <br><br>Tipologia de intervenção 
    <select name="tipo"> 
     <?php 
      while($row = $sth15->fetch()) { 
        echo "<option value=".$row['tipologia'].">".$row['tipologia']."</option> "; 
       } 
     ?> 
    </select> 

    <button type="submit">Submit</button> 
</form> 

update_ocorrencia.php

<?php 

include('connections/ligacao.php'); 
header('Content-Type: text/html; charset=utf-8'); 
session_start(); 

$id_slat=$_POST['id_slat']; 
$ocorrencia=$_POST['ocorrencia']; 
$data=$_POST['data']; 
$acesso=$_POST['acesso']; 

error_reporting(E_ERROR | E_PARSE | E_CORE_ERROR); 

$sql=$database->prepare("update tbl_slat set ocorrencia=:ocorrencia, data=:data, descricao_acesso=:acesso where id_slat=:id_slat"); 

$sql->bindParam(':ocorrencia', $_POST['ocorrencia'], PDO::PARAM_INT);   
$sql->bindParam(':id_slat', $_POST['id_slat'], PDO::PARAM_INT); 
$sql->bindParam(':data', $_POST['data'], PDO::PARAM_INT); 
$sql->bindParam(':acesso', $_POST['acesso'], PDO::PARAM_STR); 
$sql->execute(); 

header('Location: editar_ocorrencia.php'); 

?> 

有人可以幫我嗎?

+0

檢查這鏈接: http://stackoverflow.com/questions/5005388/cannot-add-or-update-a-child-row-a-foreign-key-constraint-fails/33238549#33238549 –

回答

0

更換

$sql=$database->prepare("update tbl_slat set ocorrencia=:ocorrencia, data=:data, descricao_acesso=:acesso where id_slat=:id_slat"); 

通過

$sql=$database->prepare("update tbl_slat set ocorrencia=:ocorrencia, data=:data where id_slat=:id_slat"); 

因爲你試圖修改外鍵 「descricao_acesso =:acesso」。

如果descricao_acesso不是一個外鍵直接刪除它從你表模式:)

此行的外鍵:KEY descricao_acesso ( descricao_acesso ),

,也拆除$sql->bindParam(':acesso', $_POST['acesso'], PDO::PARAM_STR);

+0

謝謝你的回答!但我無法修改外鍵?我的目標是用外鍵更新字段。那可能嗎? –

+0

是的,所以外鍵應該在這個位置之後,像這樣:$ sql = $ database-> prepare(「update tbl_slat set ocorrencia =:ocorrencia,data =:data where id_slat =:id_slat」and descricao_acesso =:acesso); ' – airliquide

+0

像這樣: $ sql = $ database-> prepare(「update tbl_slat set ocorrencia =:ocorrencia,data =:data,descricao_acesso =:acesso where id_slat =:id_slat」,descricao_acesso = tbl_slat_ibfk_3); ? –