I have a Ticket system, the code works 90% considering the system requirements, the problem is that sometimes when I make a record, it comes out duplicated.
I have tried several things without success, it should be noted that I cannot have unique fields in my database table (except for my PK
). The problem is that it duplicates everything, as if the script was executed twice.
I attach 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>
HTML 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>');
}
}
});
});
});
You are surely calling the AJAX process twice by defining an event
onClick
with aonSubmit
inside.Try using the following JQuery code: