PHP外键问题 - 我无法使用外键更新数据库字段

时间:2016-02-02 14:50:04

标签: php mysql database forms foreign-keys

我无法使用PHP从表单中使用外键更新数据库字段。 我已经尝试了一些东西,但每次我有这两个错误:

致命错误:带有消息'SQLSTATE [23000]的未捕获异常'PDOException':完整性约束违规:1452无法添加或更新子行:外键约束失败(database_slattbl_slat,第20行的C:\ wamp \ www \ camaraSlat \ update_ocorrencia.php中的约束tbl_slat_ibfk_3 FOREIGN KEY(descricao_acesso)参考tbl_anomalia_acessodescricao))'

PDOException:SQLSTATE [23000]:完整性约束违规:1452无法添加或更新子行:外键约束失败(database_slattbl_slat,CONSTRAINT tbl_slat_ibfk_3 FOREIGN KEY( descricao_acesso)参考tbl_anomalia_acessodescricao))在第20行的C:\ wamp \ www \ camaraSlat \ update_ocorrencia.php

这是我的代码(只有表单的某些字段正在更新):

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');

?>

有人可以帮我吗??

1 个答案:

答案 0 :(得分: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);