I have a Ticket system, the code works 90% considering the requirements of the system, the problem is that sometimes when I make a record, it is duplicated.
I have tried several things without success, it is clear that I can not have unique fields in my table in my database (except for my PK
). The problem is that it duplicates everything, as if the script were executed twice.
Annex my codes to see if you can guide me.
Code where I call the Modal :
<div class="row">
<div class="col-lg-12">
<div class="card">
<div class="card-header">
<i class="fa fa-ticket"></i> Tickets
<button type="button" class="btn btn-primary btn-sm pull-right" data-toggle="modal" data-target="#registrarTicket" id="btnagregarTicket">
<i class="fa fa-plus-circle"></i> Ticket
</button>
</div>
<div class="card-block">
<div class="removeMessages"></div>
<table id="tickets" class="table table-striped table-bordered" width="100%" cellspacing="0">
<thead>
<tr>
<th>No</th>
<th>Actualizado</th>
<th>Ref</th>
<th>Categoria</th>
<th>Requerimiento</th>
<th>Status</th>
<th>Prioridad</th>
<th>Creado</th>
<th>Asignado</th>
<th></th>
</tr>
</thead>
</table>
</div>
</div>
</div>
</div>
HMTL code:
<div class="modal fade" id="registrarTicket" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg modal-primary" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel"><i class="fa fa-plus-circle"></i> Crear Ticket</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<form action="" method="post" id="frmregistrarTicket" enctype="multipart/form-data">
<div class="modal-body">
<div class="messages"></div>
<hr>
<div class="row">
<div class="col-md-6">
<div class="form-group">
<div class="input-group">
<span class="input-group-addon">¿Es hijo?</span>
<select class="form-control" id="regEshijo" name="regEshijo">
<option value="0">No</option>
<option value="1">Si</option>
</select>
<button type="button" class="btn btn-tool btn-sm" data-toggle="tooltip" data-placement="right" title="Si el ticket a generar depende de otro ya creado">
<i class="fa fa-question"></i>
</button>
</div>
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<div class="input-group" id="referencia">
<span class="input-group-addon">ID Referencia</span>
<input type="text" id="regReferencia" name="regReferencia" class="form-control" placeholder="Referencia ticket padre">
<button type="button" id="heredar" class="btn btn-primary btn-sm"><i class="fa fa-angle-double-right"></i></button>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="form-group">
<div class="input-group">
<span class="input-group-addon">Requerimiento</span>
<select class="form-control" name="regCategoria" id="regCategoria" required>
<option value="">Seleccione...</option>
</select>
</div>
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<div class="input-group" id="idSubcategoria_">
<span class="input-group-addon">Subcategoria</span>
<select class="form-control" name="regSubcategoria" id="regSubcategoria" required>
</select>
</div>
</div>
</div>
</div>
<div class="form-group">
<div class="input-group">
<span class="input-group-addon">Tema</span>
<input type="text" id="regTema" name="regTema" class="form-control" placeholder="Titulo tema" required>
</div>
</div>
<div class="form-group">
<div class="input-group">
<span class="input-group-addon">Descripción</span>
<textarea rows="3" id="regDescripcion" name="regDescripcion" class="form-control" placeholder="Descripcion" required></textarea>
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="form-group">
<div class="input-group">
<span class="input-group-addon">Cliente</span>
<select class="form-control" name="regCliente" id="regCliente" required>
</select>
</div>
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<div class="input-group" id="idSucursal_">
<span class="input-group-addon">Sucursal</span>
<select class="form-control" name="regSucursal" id="regSucursal" required>
</select>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="form-group">
<div class="input-group">
<span class="input-group-addon">Tipo de ticket</span>
<select class="form-control" name="regTipo" id="regTipo" required>
<option value="">Seleccione...</option>
<option value="1">Servicio</option>
<option value="2">Incidente</option>
<option value="3">Problema</option>
</select>
</div>
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<div class="input-group">
<span class="input-group-addon">Asignar a</span>
<select class="form-control" name="regTecnico" id="regTecnico" required>
</select>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="form-group">
<div class="input-group">
<span class="input-group-addon">Status</span>
<select class="form-control" name="regStatus" id="regStatus" required>
<option value="">Seleccione...</option>
<option value="1">Abierto</option>
<option value="2">Asignado</option>
<option value="3">Pendiente</option>
<option value="4">Cerrado</option>
<option value="5">Cancelado</option>
<option value="6">Resuelto</option>
<option value="7">Reabierto</option>
</select>
</div>
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<div class="input-group">
<span class="input-group-addon">Prioridad</span>
<select class="form-control" name="regPrioridad" id="regPrioridad" required>
<option value="">Seleccione...</option>
<option value="1">Critica </option>
<option value="2">Urgente </option>
<option value="3">Alto </option>
<option value="4">Medio </option>
<option value="5">Bajo</option>
</select>
</div>
</div>
</div>
</div>
<hr>
<label class="input-group-addon">Archivo(s)</label>
<input class="file-loading" id="imagen" type="file" multiple name="image[]">
<div id="errorBlock" class="help-block"></div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal" id="limpiarCampos">Cerrar</button>
<button type="submit" class="btn btn-primary" id="btnGuardar_">Guardar</button>
</div>
</form>
</div>
</div>
</div>
PHP Code:
if($_POST) {
$validator = array('success' => false, 'messages' => array());
#Obtener el Usuario que inició sesion para saber quién está manipulando los tickets.
$usuarioCreado = $_SESSION['u_usuario']['PK_idUsuario'];
$regEshijo = $_POST["regEshijo"];
#Si el ticket no es hijo la REFERENCIA será 0, de caso contrario tomará el valor del campo referencia.
$regReferencia = $_POST["regReferencia"];
if (empty($regReferencia)) {
$regReferencia = 0;
}else{
$regReferencia = $_POST["regReferencia"];
}
#Datos del formulario.
$regCategoria = $_POST["regCategoria"];
$regSubcategoria = $_POST["regSubcategoria"];
$regTitulo = $_POST["regTema"];
$regDescripcion = $_POST["regDescripcion"];
$regTipo = $_POST["regTipo"];
$regTecnico = $_POST["regTecnico"];
$regStatus = $_POST["regStatus"];
$regPrioridad = $_POST["regPrioridad"];
$regCliente = $_POST["regCliente"];
$regUbicacion = $_POST['regSucursal'];
$regAlerta = 1;
$regEscalado = 1;
$alta = 'ALTA';
$atencion = 'ATENCION';
$cliente = 'CLIENTE';
$query = mysqli_query($con, "INSERT INTO ticket (FK_idUbicacion, FK_idSubcategoria, tituloTicket, descripcionTicket, statusTicket, prioridadTicket, alertaTicket, escaladoTicket, tipoTicket, esHijo, refTicket) VALUES ('$regUbicacion','$regSubcategoria','$regTitulo','$regDescripcion','$regStatus','$regPrioridad','$regAlerta', '$regEscalado', '$regTipo', '$regEshijo' , '$regReferencia')");
$idTick = mysqli_insert_id($con);
#Dar de alta en la tabla ticket_usuario los datos del Cliente, del Técnico y quien creó el Ticket.
$query1 = mysqli_query ($con, "INSERT INTO ticket_usuario(FK_idTicket, FK_idUsuario, status) VALUES ('$idTick', '$usuarioCreado', '$alta')");
$query2 = mysqli_query ($con, "INSERT INTO ticket_usuario(FK_idTicket, FK_idUsuario, status) VALUES ('$idTick', '$regTecnico', '$atencion')");
$query3 = mysqli_query ($con, "INSERT INTO ticket_usuario(FK_idTicket, FK_idUsuario, status) VALUES ('$idTick', '$regCliente', '$cliente')");
#Crear las carpetas para los archivos, se agruparán por CATEGORIA Y SUBCATEGORIA
$sql = mysqli_query($con, "SELECT * FROM categoria WHERE PK_idCategoria ='".$regCategoria."'");
$cat = mysqli_fetch_assoc($sql);
$rutaCat = $cat['categoriaDesc'];
#$des = str_replace(" ","_",$rutaCat);
$des = sanear_string($rutaCat);
#$nuevo = sanear_string($cadena);
$sql1 = mysqli_query($con, "SELECT * FROM subcategoria WHERE PK_idSubcategoria ='".$regSubcategoria."'");
$subcat = mysqli_fetch_assoc($sql1);
$rutaSubcat = $subcat['subcategoriaDesc'];
#$des1 = str_replace(" ","_",$rutaSubcat);
$des1 = sanear_string($rutaSubcat);
#Ruta para los archivos
$archivo = "../archivos/$des/$des1/";
#Crear carpetas sino existen.
if (!file_exists($archivo)) {
mkdir($archivo, 0777, true);
}
#Cargar Imagenes
if(isset($_FILES['image']['tmp_name'])){
#Numero de archivos a cargar
$num_files = count($_FILES['image']['tmp_name']);
for($i=0; $i < $num_files;$i++)
{
#Ver si hay archivos para subir
if(!is_uploaded_file($_FILES['image']['tmp_name'][$i]))
{
#echo "No se encontraron archivos";
}
else
{
#Copiar imagenes a la carpeta correspondiente de acuerdo a la marca
if(@copy($_FILES['image']['tmp_name'][$i],"$archivo".$_FILES['image']['name'][$i])){
$path = "".$_FILES['image']['name'][$i];
$query3= mysqli_query($con, "INSERT INTO archivoticket(FK_idTicket, archivoTicket) VALUES('$idTick', '$path')");
}
else
{
#echo "No se pudo subir el archivo";
}
}
}
}
#Si todos los datos se han insertado correctamente se muestra un mensaje de éxito, de caso contrario una alerta de error.
if($query === TRUE && $query1 === TRUE && $query2 === TRUE && $query3 === TRUE) {
$validator['success'] = true;
$validator['messages'] = "Ticket creado correctamente";
} else {
$validator['success'] = false;
$validator['messages'] = "Error al crear el ticket";
}
$con->close();
echo json_encode($validator);
}
JQUERY Code:
$("#btnagregarTicket").on('click', function() {
//$(".form-group").removeClass('has-error').removeClass('has-success');
$(".messages").html("");
$("#frmregistrarTicket")[0].reset();
$("#frmregistrarTicket").on("submit", function(e){
e.preventDefault();
var formData = new FormData(document.getElementById("frmregistrarTicket"));
var ruta = "crudTickets.php?op=create";
$.ajax({
url: ruta,
type: "POST",
data: formData,
contentType: false,
processData: false,
dataType : 'json',
success: function(response)
{
if(response.success == true) {
$(".messages").html('<div class="alert alert-success alert-dismissible" role="alert">'+
'<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>'+
'<strong> <span class="fa fa-check"></span> </strong>'+response.messages+
'</div>');
// Recargar la tabla y limpiar los campos
tblTicket.ajax.reload();
$("#frmregistrarTicket")[0].reset();
$("#registrarTicket").modal('hide');
location.reload();
//Error
} else {
$(".messages").html('<div class="alert alert-warning alert-dismissible" role="alert">'+
'<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>'+
'<strong> <span class="fa fa-exclamation-triangle"></span> </strong>'+response.messages+
'</div>');
}
}
});
});
});