简体   繁体   English

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

[英]PHP foreign keys issues - I can't update a database field with a foreign key

I can't update a database field with a foreign key from a form with PHP. 我无法使用PHP表单中的外键更新数据库字段。 I already try some things but everytime I have this 2 errors: 我已经尝试了一些方法,但是每次遇到这2个错误时:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails ( database_slat . tbl_slat , CONSTRAINT tbl_slat_ibfk_3 FOREIGN KEY ( descricao_acesso ) REFERENCES tbl_anomalia_acesso ( descricao ))' in C:\\wamp\\www\\camaraSlat\\update_ocorrencia.php on line 20 致命错误:未捕获的异常“PDOException”有消息“SQLSTATE [23000]:完整性约束违规:1452不能添加或更新子行,外键约束失败( database_slattbl_slat ,约束tbl_slat_ibfk_3外键( descricao_acesso )参考tbl_anomalia_acessodescricao ))'在第20行的C:\\ wamp \\ www \\ camaraSlat \\ update_ocorrencia.php中

PDOException: SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails ( database_slat . tbl_slat , CONSTRAINT tbl_slat_ibfk_3 FOREIGN KEY ( descricao_acesso ) REFERENCES tbl_anomalia_acesso ( descricao )) in C:\\wamp\\www\\camaraSlat\\update_ocorrencia.php on line 20 PDOException:SQLSTATE [23000]:完整性约束违规:1452不能添加或更新子行,外键约束失败( database_slattbl_slat ,约束tbl_slat_ibfk_3外键( descricao_acesso )参考tbl_anomalia_acessodescricao ))在C:\\ WAMP \\ WWW第20行的\\ camaraSlat \\ update_ocorrencia.php

This is my code (only some fields of the form are updating): 这是我的代码(仅表单的某些字段正在更新):

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

?>

Someone can help me please?? 有人可以帮我吗?

Replace 更换

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

By 通过

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

Because you are trying to modify a foreign key "descricao_acesso=:acesso". 因为您正在尝试修改外键“ descricao_acesso =:acesso”。

If descricao_acesso is not a foreign key just remove it as a foreign key from you table schema :) 如果descricao_acesso不是外键,只需将其作为外键从表架构中删除:)

This line : KEY descricao_acesso ( descricao_acesso ), 此行: KEY descricao_acesso ( descricao_acesso ),

And also remove the $sql->bindParam(':acesso', $_POST['acesso'], PDO::PARAM_STR); 并删除$sql->bindParam(':acesso', $_POST['acesso'], PDO::PARAM_STR);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM