I'm having an FK error. I can not insert data through form using ajax and php insert code .
When I fill out the form and click the submit button, ajax fulfills the role of sending the data to PHP in> add_ps.php ), however a return of costraint error where it says I can not add or update the table.
Error: Cannot add or update a child row: a foreign key constraint fails ('click1lw_fornecedores'.'produtos_servicos', CONSTRAINT 'produtos_servicos_ibfk_4' FOREIGN KEY ('categoria_id') REFERENCES 'categorias' ('categoria_id') ON DELETE NO ACTION ON UPDATE CASCADE)
In the case I have 5 tables. The Supplier table:
CREATE TABLE 'fornecedor' (
'fornecedor_id' int(11) NOT NULL AUTO_INCREMENT,
'nome' varchar(100) NOT NULL,
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
The Categories table:
CREATE TABLE 'categorias' (
'categoria_id' int(11) NOT NULL AUTO_INCREMENT,
'categoria' varchar(100) NOT NULL,
PRIMARY KEY ('categoria_id'),
KEY 'categoria' ('categoria')
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
The table subcategories :
CREATE TABLE 'categorias_sub' (
'subcategoria_id' int(11) NOT NULL AUTO_INCREMENT,
'subcategoria' varchar(100) NOT NULL,
'categoria' int(11) NOT NULL,
PRIMARY KEY ('subcategoria_id'),
KEY 'categoria' ('categoria') USING BTREE,
CONSTRAINT 'categorias_sub_ibfk_1' FOREIGN KEY ('categoria') REFERENCES 'categorias' ('categoria_id') ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
The table type_ps :
CREATE TABLE 'tipo_ps' (
'tipo_id' int(11) NOT NULL AUTO_INCREMENT,
'tipo' varchar(15) NOT NULL,
PRIMARY KEY ('tipo_id')
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8
And finally the table service_products :
CREATE TABLE 'produtos_servicos' (
'produto_id' int(11) NOT NULL AUTO_INCREMENT,
'fornecedor_id' int(11) NOT NULL,
'tipo' int(11) NOT NULL,
'nome' varchar(100) NOT NULL,
'categoria_id' int(11) NOT NULL,
'subcategoria_fk' int(11) NOT NULL,
'imagem' varchar(20) NOT NULL,
'descricao' text NOT NULL,
PRIMARY KEY ('produto_id'),
KEY 'tipo' ('tipo'),
KEY 'fornecedor_id' ('fornecedor_id'),
KEY 'categoria_id' ('categoria_id'),
KEY 'subcategoria_fk' ('subcategoria_fk'),
CONSTRAINT 'produtos_servicos_ibfk_2' FOREIGN KEY ('tipo') REFERENCES 'tipo_ps' ('tipo_id') ON DELETE NO ACTION ON UPDATE CASCADE,
CONSTRAINT 'produtos_servicos_ibfk_3' FOREIGN KEY ('fornecedor_id') REFERENCES 'fornecedor' ('fornecedor_id') ON DELETE NO ACTION ON UPDATE CASCADE,
CONSTRAINT 'produtos_servicos_ibfk_4' FOREIGN KEY ('categoria_id') REFERENCES 'categorias' ('categoria_id') ON DELETE NO ACTION ON UPDATE CASCADE,
CONSTRAINT 'produtos_servicos_ibfk_5' FOREIGN KEY ('subcategoria_fk') REFERENCES 'categorias_sub' ('subcategoria_id') ON DELETE NO ACTION ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=44 DEFAULT CHARSET=utf8
Below is the code for my form and the code responsible for AJAX :
<form id="insert_form" method="POST">
<div class="form-row">
<div class="form-group col-md-3">
<label for="tipo">Selecione o tipo</label>
<select id="tipo" class="form-control" name="tipo" >
<?php
//Include the database configuration file
include 'dbconnect.php';
//Fetch all the country data
$query = $conn->query("SELECT * FROM tipo_ps ORDER BY tipo ASC");
//Count total number of rows
$rowCount = $query->num_rows;
if($rowCount > 0){
while($row = $query->fetch_assoc()){
echo '<option value="'.$row['tipo_id'].'">'.$row['tipo'].'</option>';
}
}else{
echo '<option value="'.$row['tipo_id'].'">Tipo não encontrado</option>';
}
?>
</select>
</div>
<div class="form-group col-md-8">
<label for="nome">Nome</label>
<input type="text" name="nome" id="nome" class="form-control" />
</div>
<div class="form-group col-md-5">
<label for="categoria_id">Categoria Principal</label>
<select id="categoria" class="form-control" name="categoria_id" >
<option value="">Selecione uma categoria</option>
<?php
//Include the database configuration file
include 'dbconnect.php';
//Fetch all the country data
$query = $conn->query("SELECT * FROM categorias ORDER BY categoria ASC");
//Count total number of rows
$rowCount = $query->num_rows;
if($rowCount > 0){
while($row = $query->fetch_assoc()){
echo '<option value="'.$row['categoria_id'].'">'.$row['categoria'].'</option>';
}
}else{
echo '<option value="">Categoria não encontrada</option>';
}
?>
</select>
</div>
<div class="form-group col-md-5">
<label for="subcategoria_id">Sub Categoria</label>
<select id="subcategoria" name="subcategoria_fk" class="form-control">
<option value="">Selecione a categoria primeiro</option>
</select>
</div>
</div>
<div class="form-group">
<label for="exampleFormControlFile1">Imagem d produto ou serviço</label>
<input type="file" class="form-control-file" id="imagem" name="imagem">
</div>
<div class="form-group">
<label for="descricao">Descreva o produto ou serviço</label>
<textarea class="form-control" name="descricao" id="descricao" rows="2" ></textarea>
</div>
</form>
<script>
$(document).ready(function(){
$('#insert_form').on("submit", function(event){
$('#insert').val("CADASTRAR ITEM");
$('#insert_form')[0].reset();
event.preventDefault();
$.ajax({
url:"adicionar_ps.php",
method:"POST",
data:$('#insert_form').serialize(),
beforeSend:function(){
$('#insert').val("CADASTRANDO...");
},
success:function(data){
$('#insert_form')[0].reset();
$('#add_data_Modal').modal('hide');
$('#ps_table').html(data);
}
});
});
});
</script>
And a snippet of the PHP code that receives the data via AJAX :
<?php
include 'dbconnect.php';
if(!empty($_POST))
{
$output = '';
$session_id = $_SESSION['f_id'];
$imagem = mysqli_real_escape_string($conn, $_POST['imagem']);
$tipo = mysqli_real_escape_string($conn, $_POST['tipo']);
$nome = mysqli_real_escape_string($conn, $_POST['nome']);
$categoria = mysqli_real_escape_string($conn, $_POST['categoria_id']);
$subcategoria = mysqli_real_escape_string($conn, $_POST['subcategoria_fk']);
$descricao = mysqli_real_escape_string($conn, $_POST['descricao']);
$query = "
INSERT INTO produtos_servicos (fornecedor_id, imagem, tipo, nome, categoria_id, subcategoria_fk, descricao)
VALUES('".$_SESSION['f_id']."', '$imagem', '$tipo', '$nome', '$categoria', '$subcategoria', '$descricao')
";
if(mysqli_query($conn, $query))
{
When the script ajax sends the form data to PHP , only two fields are added as below:
What could it be?