php - duplicar la inserción de datos en CodeIgniter
duplicate-data double-submit-prevention (2)
Solo estoy insertando datos en la parte del controlador codeigniter en pastebin http://pastebin.com/KBtqrAkZ
public function add_product()
{
$this->lang->load(''log_in'', ''english'');
log_in_check($this->lang->line(''log_in_authentication_error''), ''admin/log_in'');
$this->lang->load(''common'', ''english'');
$data[''title''] = $this->lang->line(''admin_index_title'');
$this->load->view(''admin_template/header'', $data);
$this->load->view(''admin_template/left_menu'');
$data[''error_msg''] = '''';
if ($this->form_validation->run(''add_product'') === TRUE)
{
$this->admin_model->add_product($this->input->post());
$this->session->set_flashdata(''status_msg'', $this->lang->line(''add_product_success''));
redirect(uri_string(), ''refresh'');
exit ;
$data[''error_msg''] = $this->lang->line(''add_product_invalid_data'');
}
$this->load->view(''admin/add_product'');
//$this->load->view(''admin_template/notification'');
$this->load->view(''admin_template/footer'');
}
Que mi parte modelo es simple agregar en pastebin http://pastebin.com/WiLHV2sr
public function add_product($data = array())
{
$this->db->insert(''ishop_product'', $data);
return $this->db->insert_id();
}
mi problema es después de redirigir si presiono ctrl + F5 o F5 que los datos están insertando. Soy un nuevo en codeigniter. Ayudame por favor. Cualquier ayuda será apreciada.
Hay una solución simple, puede redirigir a otra página después de agregar un producto, como:
redirect(base_url(). "yourcontrollername/index");
Hacer esto eliminará los datos de la publicación y los datos no se volverán a agregar a la base de datos.
Este es el problema de envío doble .
Hay varias formas de lidiar con esto:
El patrón Publicar / Redirigir / Obtener : Rompe el botón Atrás, y no evita que su usuario retroceda lo suficiente como para enviar nuevamente. No maneja múltiples clics.
Deshabilitar el botón de enviar : maneja varios clics de vez en cuando, pero no soluciona que el usuario regrese y vuelva a enviar.
Almacenar un token en la sesión : si tiene varias pestañas abiertas en el navegador, el token almacenado en la sesión puede confundirse. (Nota: Es posible crear cookies específicas de la pestaña del navegador usando JavaScript, pero no lo he probado yo mismo).
Cambie la base de datos para no permitir duplicados : la mejor solución, pero también el mayor esfuerzo. Si detecta un conjunto de datos duplicados, ignore la segunda solicitud.
Identificación de transacción única : descrita en esta página de hacks de PHP , y en esta respuesta .
Varios tokens en la sesión : una variación en la opción 3. Si almacena todos los tokens generados en la sesión, no necesita involucrar a la base de datos. La probabilidad de un duplicado es mucho menor, dado que los tokens son únicos dentro de una sesión. Los posibles problemas incluyen el conjunto de tokens que crece fuera de control. Tal vez se puede reparar con una pila de tamaño limitado donde se agrega a la parte superior de la pila, y tokens extra se caen de la parte inferior. No probado.
-
Me gusta el método único de identificación de transacción . Funciona así:
Genere un
transaction_id
aleatorio y póngalo en su formulario web. Se acompaña cuando el usuario hace clic ensubmit
.Cuando reciba la solicitud para agregar un producto, busque el
transaction_id
en la tabla de transacciones.Si el ID no existe en la tabla, realice la transacción e inserte el transaction_id en la tabla.
Si la identificación no existe en la tabla, la transacción ya está hecha.
También debe buscar [prevención de doble envío] para ver si puede encontrar una solución aún mejor.