Perform insertion into a foreign key table

4
include_once 'acesso_bd/conexao_bd.php';

class PropriedadeDAO { 


    function inserirPropriedadeBD($propriedade) { 

        $nome = $propriedade->getNome();
        $endereco = $propriedade->getEndereco();
        $telefone = $propriedade->getTelefone();

        $conexaobd = new ConexaoBD;

        $conexao = $conexaobd->conectarAoBD();

        $sql = "INSERT INTO propriedade (nome, endereco, telefone) VALUES ('$nome', '$endereco', '$telefone')";

        if (!mysqli_query($conexao, $sql)) {
            echo "Erro: " . $sql . "<br>" . mysqli_error($conexao);
        }


    } 

The above code refers to the registration of a property, where its ID is AUTO_INCREMENT .

include_once 'acesso_bd/conexao_bd.php';

class TalhaoDAO { 


    function inserirTalhaoBD($talhao) { 

        $nome = $talhao->getNome();


        $conexaobd = new ConexaoBD;

        $conexao = $conexaobd->conectarAoBD();


        $sql = "INSERT INTO talhao (nome, id_propriedade) VALUES ('$nome', LAST_INSERT_ID())";

        if (!mysqli_query($conexao, $sql)) {
            echo "Erro: " . $sql . "<br>" . mysqli_error($conexao);
        }


    } 

This is the Talhao registration code, which necessarily needs the foreign key "id_propriedade" to be identified. I used LAST_INSERT_ID , the problem is that I'm returning the following error when trying to register Talhao:

  

Error: INSERT INTO talhao (name, property_id) VALUES ('aaa', LAST_INSERT_ID ())       Can not add or update child row: a foreign key constraint fails ( teste , talhao , CONSTRAINT id_propriedade_fk FOREIGN KEY ( id_propriedade ) REFERENCES propriedade ( id_propriedade ) ON DELETE ON ACTION ON UPDATE NO ACTION )

CREATE TABLE IF NOT EXISTS 'propriedade' (
  'id_propriedade' int(11) NOT NULL AUTO_INCREMENT,
  'nome' varchar(20) NOT NULL,
  'endereco' varchar(20) NOT NULL,
  'telefone' varchar(20) NOT NULL,
  PRIMARY KEY ('id_propriedade')
) ENGINE=InnoDB  ;

CREATE TABLE IF NOT EXISTS 'talhao' (
  'id_parcela' int(11) NOT NULL AUTO_INCREMENT,
  'nome' varchar(20) NOT NULL,
  'id_propriedade' int(11) NOT NULL,
  PRIMARY KEY ('id_parcela'),
  KEY 'id_propriedade' ('id_propriedade'),
  KEY 'id_propriedade_fk' ('id_propriedade')
) ENGINE=InnoDB ;
    
asked by anonymous 22.06.2017 / 19:49

3 answers

0

DAO Property Class     

include_once 'acesso_bd/conexao_bd.php';

class PropriedadeDAO { 


    function inserirPropriedadeBD($propriedade) { 

        $nome = $propriedade->getNome();
        $endereco = $propriedade->getEndereco();
        $telefone = $propriedade->getTelefone();

        $conexaobd = new ConexaoBD;

        $conexao = $conexaobd->conectarAoBD();

        $sql = "INSERT INTO propriedade (nome, endereco, telefone) VALUES ('$nome', '$endereco', '$telefone')";

        if (!mysqli_query($conexao, $sql)) {
            echo "Erro: " . $sql . "<br>" . mysqli_error($conexao);
        }else {
        $propriedade->setID(mysqli_insert_id($conexao)); // Alteração
        }


    } 

Class Property

<?php

include_once '../dao/dao_propriedade.php';

class Propriedade { 
    private $id;
    private $nome; 
    private $endereco; 
    private $telefone; 

    function setID($id) { 
        $this->id = $id;
    } 

    function setNome($nome) { 
        $this->nome = $nome;
    } 

    function setEndereco($endereco) { 
        $this->endereco = $endereco;
    } 

    function setTelefone($telefone) { 
        $this->telefone = $telefone;
    } 

    function getID() { 
        return $this->id; 
    } 

    function getNome() { 
        return $this->nome; 
    } 

    function getEndereco() { 
        return $this->endereco;  
    } 

    function getTelefone() { 
        return $this->telefone;
    } 

TalhaoDAO class'

include_once 'acesso_bd/conexao_bd.php';
include_once '../modelo/modelo_propriedade.php';

class TalhaoDAO { 



    function inserirTalhaoBD($talhao) { 

        $nome = $talhao->getNome();
        $idPropriedade = $talhao->getPropriedade(); //Alteração


        $conexaobd = new ConexaoBD;

        $conexao = $conexaobd->conectarAoBD();


        $sql = "INSERT INTO talhao ('nome', 'id_propriedade') VALUES ('$nome', '$idPropriedade')";

        if (!mysqli_query($conexao, $sql)) {
            echo "Erro: " . $sql . "<br>" . mysqli_error($conexao);
        }


    } '

Class Talhao '

include_once '../dao/dao_talhao.php';

class Talhao { 
    private $id;
    private $nome; 
    private $endereco; 
    private $telefone; 
    private $id_propriedade;

    function setID($id) { 
        $this->id = $id;
    } 

    function setNome($nome) { 
        $this->nome = $nome;
    } 

    function setPropriedade($id_propriedade){
    $this->id_propriedade = $id_propriedade;
    }


    function getID() { 
        return $this->id; 
    } 

    function getNome() { 
        return $this->nome; 
    } 

    function getPropriedade(){
     return $this->id_propriedade;
    }'

The error that is returning:

  

Error: INSERT INTO talhao ( nome , id_propriedade ) VALUES ('B2', '')   Can not add or update child row: a foreign key constraint fails   ( teste . talhao , CONSTRAINT id_propriedade_fk FOREIGN KEY   ( id_propriedade ) REFERENCES propriedade ( id_prop ) ON DELETE NO   ACTION ON UPDATE NO ACTION)

    
22.06.2017 / 22:46
0

The property entry form:

<body>
<h1> Nova propriedade</h1>
<form action="../controle/controle_propriedade.php" method="post">
    Nome:
    <br/>
    <input name="nome" type="text" value="" required="required">
    <br/>
    Endereco:
    <br/>
    <input name="endereco" type="text" value="" required="required">
    <br/>
    Telefone:
    <br/>
    <input name="telefone" type="text" value="" required="required">
    <br/>
    <input name="acao" type="hidden" value="inserir">
    <br/>
    <input type="submit" value="Cadastrar">
</form>
<br/>

The property tracking code:

include_once '../modelo/modelo_propriedade.php';

$acao = ($_POST["acao"]);

switch ($acao) {
    case "inserir":
        $propriedade = new Propriedade;
        $propriedade->setNome($_POST["nome"]);
        $propriedade->setEndereco($_POST["endereco"]);
        $propriedade->setTelefone($_POST["telefone"]);

        $propriedade->cadastrarPropriedade();

        include_once '../visao/novo_talhao.html';

        break;
    
22.06.2017 / 23:13
0

You added KEY instead of FOREIGN KEY , that is, your table has index but has no foreign key. That way it will certainly give error of CONSTRAINT and FK . It makes a backup first and then gives DROP TABLE talhao . It is best to delete the table so that there is no risk of anything being left behind by giving ALTER TABLE and create the table as I put it down and see if it works. I removed the quotation marks just for preference.

CREATE TABLE IF NOT EXISTS talhao (
  id_parcela int(11) NOT NULL AUTO_INCREMENT,
  nome varchar(20) NOT NULL,
  id_propriedade int(11) NOT NULL,
  PRIMARY KEY (id_parcela),
CONSTRAINT id_propriedade_fk FOREIGN KEY (id_propriedade) REFERENCES propriedade(id_propriedade)
)ENGINE=InnoDB;

Below is my export that I created from testing, also using phpMyAdmin.

-- phpMyAdmin SQL Dump
-- version 4.5.2
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Generation Time: Jun 22, 2017 at 11:47 PM
-- Server version: 10.1.16-MariaDB
-- PHP Version: 5.5.38

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;

--
-- Database: 'teste'
--

-- --------------------------------------------------------

--
-- Table structure for table 'propriedade'
--

CREATE TABLE 'propriedade' (
  'id_propriedade' int(11) NOT NULL,
  'nome' varchar(20) NOT NULL,
  'endereco' varchar(20) NOT NULL,
  'telefone' varchar(20) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- --------------------------------------------------------

--
-- Table structure for table 'talhao'
--

CREATE TABLE 'talhao' (
  'id_parcela' int(11) NOT NULL,
  'nome' varchar(20) NOT NULL,
  'id_propriedade' int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Indexes for dumped tables
--

--
-- Indexes for table 'propriedade'
--
ALTER TABLE 'propriedade'
  ADD PRIMARY KEY ('id_propriedade');

--
-- Indexes for table 'talhao'
--
ALTER TABLE 'talhao'
  ADD PRIMARY KEY ('id_parcela'),
  ADD KEY 'id_propriedade_fk' ('id_propriedade');

--
-- AUTO_INCREMENT for dumped tables
--

--
-- AUTO_INCREMENT for table 'propriedade'
--
ALTER TABLE 'propriedade'
  MODIFY 'id_propriedade' int(11) NOT NULL AUTO_INCREMENT;
--
-- AUTO_INCREMENT for table 'talhao'
--
ALTER TABLE 'talhao'
  MODIFY 'id_parcela' int(11) NOT NULL AUTO_INCREMENT;
--
-- Constraints for dumped tables
--

--
-- Constraints for table 'talhao'
--
ALTER TABLE 'talhao'
  ADD CONSTRAINT 'id_propriedade_fk' FOREIGN KEY ('id_propriedade') REFERENCES 'propriedade' ('id_propriedade');

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
    
22.06.2017 / 22:49