eliminar toda la fila después de x minutos en mysql db y PHP

Estoy intentando configurar una base de datos SQL donde los usuarios deben confirmar su dirección de correo electrónico. Me pregunto si hay una manera de eliminar automáticamente a los usuarios en la base de datos sql que intentaron registrarse (enviar su información) pero no confirmar su dirección de correo electrónico después de x cantidad de minutos.

el script que he escrito inserta su información directamente en la base de datos y luego actualiza una columna en la base de datos a "ACTIVO" una vez que los usuarios han confirmado, por lo que no inserto los datos una vez que se han activado, pero antes con un estado de "INACTIVO". Luego, cuando confirman su dirección de correo electrónico, ese estado cambia a "ACTIVO".

por lo tanto, si un usuario envía su información, pero no puede confirmar su dirección de correo electrónico, sus datos aún están en la base de datos. Necesito algo que elimine automáticamente una fila con el estado "NON_ACTIVE" después de x minutos hasta que enviaron su información. Tengo otra columna en la base de datos con su fecha y hora de envío exactas.

¿algunas ideas?

preguntado el 27 de agosto de 11 a las 17:08

no hay forma de realizar esto automáticamente. necesita ayuda de cronjob / planificador con la poda -

5 Respuestas

El SQL sería DELETE FROM users WHERE (now() - mailsent) > (120*60) AND state = "NON_ACTIVE", Donde usuarios es el nombre de la tabla, correo enviado la marca de tiempo del envío de correo y 120 la cantidad de minutos que desea como tiempo de espera.

Puede ejecutar este comando a través de un cronjob en un sistema Linux con cron -e someUser e ingresando la siguiente línea

* * * * * mysql myDatabase < 'DELETE FROM users WHERE (now() - mailsent) > (120*60) AND state = "NON_ACTIVE"'

Esto ejecutará el comando cada minuto. Tenga en cuenta que su someUser tiene que poder acceder a la base de datos mysql sin una contraseña, por ejemplo, poniendo la contraseña en $ INICIO / .my.cnf

Respondido 27 ago 11, 22:08

No está limitado a ejecutar cronjobs como root, incluso podría ser una buena idea dejar que cronjobs para la base de datos se ejecute como un usuario sin privilegios. Lo mismo ocurre con el usuario de mysql, es mejor crear un usuario para este tipo de trabajos que sea de confianza si es local. - fvu

hola gracias por la respuesta. ¿Dónde colocaría ese código? Soy nuevo en SQL DB y extrañamente esperaba que pudiera haber una forma de usar php para hacerlo. No me molestaré con el cronjob ya que no estoy usando un sistema Linux. Tengo la configuración de MySQL WorkBench (si es necesario). Supongo que el código debe ir en el campo "Activadores". ¡Gracias amigo! - usuario849137

En una máquina con Windows, también puede agregar trabajos programados en Start > Programs > Accessories > System Tools > Scheduled Tasks. Guarde la consulta mysql anterior en un archivo \ ruta \ a \ ejemplo.sql y agregue una nueva tarea programada con mysql.exe (generalmente en algún lugar de c: \ Archivos de programa \ Mysql \ 5.0) y el argumento '-e "\ ruta \ a \ ejemplo.sql -D myDatabase". Programe el trabajo para que se ejecute cada minuto y tendrá lo mismo que un cronjob. ¡Bienvenida (dame reputación;))! - Lars

@Nav "molestar"? Necesitará alguna facilidad para ejecutar ese código de forma regular, si está utilizando Windows, debe buscar algún otro programador de tareas; es una infraestructura realmente crucial para cualquier tipo de configuración de servidor. - fvu

La cosa es que estoy en un host compartido (GoDaddy), así que no creo que pueda hacer cosas así. Estoy jodido? Gracias (te di representante por cierto xD) - user849137

Escribiría una declaración similar a @Lars:

DELETE
FROM users
WHERE (mailsent < NOW() - INTERVAL @x MINUTE)
  AND (state = 'NON_ACTIVE')

pero no es necesario tener un trabajo cron o un disparador para esto. Simplemente colóquelo en una de las páginas PHP a las que acceden sus usuarios (¿quizás la página de inicio de sesión o registro?). Incluso puede configurarse para que no se ejecute siempre, pero digamos, una vez por cada cien inicios de sesión si no le importa que algunos registros se eliminen unos segundos o minutos más tarde.

Respondido 27 ago 11, 22:08

hola gracias por la respuesta. Sólo una pregunta rápida .. Donde ha escrito "mailsent", esa sería la columna en la que se almacena la fecha y hora en que el usuario envió la información? y el "@x" debe reemplazarse por cuántos minutos tiene el usuario para confirmar? ¡Gracias! - usuario849137

Almacene la hora de creación de la fila en una nueva columna.

Haga que otro script (llamado por cron?) O parte de su otro código de sitio borre periódicamente cualquiera / todas las filas de la tabla con Status = "NON_ACTIVE", que se crearon hace más de X minutos.

Psudeo-sql: Eliminar de UserTable Where (status = "NON_ACTIVE" And (Minutes (now () - createdate))> 30);

Dos trabajos que intentan eliminar el mismo registro es una posible condición de carrera, pero no es realmente mala.

Respondido 27 ago 11, 21:08

¡INCREÍBLE! Ya tengo la información de fecha y hora en una fila diferente. Pero la columna se llama "date_reg". ¿Dónde se definiría esa columna en el código que acaba de proporcionar? ¡Gracias! - usuario849137

Además, ¿cómo se ejecutará este script automáticamente? ¿Parece algo que tendré que ejecutar? - usuario849137

Use algo como cron, como lo describió @Lars. - Alan J Castonguay

No es necesario utilizar una base de datos en absoluto. Simplemente solicite su correo electrónico a un usuario, envíe un enlace de verificación y comience el registro solo después de hacer clic en este enlace.

Respondido 27 ago 11, 22:08

Eso funcionaría, pero podría desanimar a algunos usuarios. Si solo ven un campo de dirección de correo electrónico para algo que esperaban requerir más información, es una mala impresión. Parece que solo quiero su correo electrónico ... aunque gracias por tu respuesta. - usuario849137

¿Qué tal usar un evento mysql?

https://dev.mysql.com/doc/refman/5.1/en/events.html

CREATE EVENT delete_event
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 DAY
ON COMPLETION PRESERVE

DO BEGIN
      DELETE messages WHERE date < DATE_SUB(NOW(), INTERVAL 7 DAY);
END;

Lo encontré aquí

contestado el 23 de mayo de 17 a las 15:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.