[英]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_slat
。 tbl_slat
,约束tbl_slat_ibfk_3
外键( descricao_acesso
)参考tbl_anomalia_acesso
( descricao
))'在第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_slat
。 tbl_slat
,约束tbl_slat_ibfk_3
外键( descricao_acesso
)参考tbl_anomalia_acesso
( descricao
))在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.