2011-10-29 3 views
0

J'ai une configuration de travail cron à regarder toutes les 24 heures pour un changement de valeur dans la table d'abonnement comme ceci, ici si la date courante devient plus que la date de fin d'abonnement, valeur du champ d'état devient « inactif »CHOISISSEZ QUERY AVEC UPDATE QUERY, envoyez un email si un champ MYSQL change

$curdate=date('Y-m-d'); 

$sql=("UPDATE subscription SET status='inactive' WHERE (end_date < '$curdate')"); 

Je voudrais envoyer un e-mail à l'utilisateur dont l'abonnement vient d'expirer en utilisant la tâche cron ci-dessus, pour lequel i a besoin de récupérer le user_id également stockées dans la même table d'abonnement

Existe-t-il un moyen que je peux exécuter un SELECT QUERY avec le QUESTION UPDATE ci-dessus et récupérer le user_id de l'utilisateur dont l'abonnement vient d'expirer?

Merci,

+0

Effectuez une requête pour 'SELECT utilisateur ID FROM FROM WHERE état = 'inactif' AND end_date <'$ curdate' LIMIT 0, 1000' avant la mise à jour. –

+0

Jared, cela ne fonctionnerait pas car il y aura de nombreuses autres entrées dans MYSQL où (end_date <'$ curdate') pour beaucoup d'utilisateurs précédents dont l'abonnement a déjà expiré. si je devais exécuter un select où end_date ABI

+0

Oups, cela aurait dû être 'status = 'active''. Je ne sais pas ce que vous voulez dire par votre deuxième phrase. –

Répondre

1

Est-ce en deux étapes:

SELECT user_id 
FROM subscriptions 
WHERE status='active' AND (end_date < '$curdate') 

pour récupérer tous les ids arrivant à échéance. Prenez cette liste des ids et des choses dans votre requête de mise à jour:

UPDATE subscriptions SET ... WHERE (user_id IN ($list_of_ids_from_before)) 

Puis re-utiliser la liste d'identification pour générer vos e-mails.

+0

Vous savez, je me demande si un champ 'status' est même nécessaire compte tenu de la logique de désactivation ... –

+0

Dans la requête select? Je ne voudrais pas re-spammer les utilisateurs qui ont été désactivés lors des exécutions précédentes et qui ont choisi de ne PAS les réactiver. –

+0

Ou, un autre champ pour notifié pourrait être utilisé. Je dis simplement, en général, il semble que la logique pour ce qui est "non actif" est assez claire (et pas vraiment un commentaire sur votre réponse, juste en général). –

0

Vous pouvez

A. Lancez votre sélection et obtenir d'abord les user_ids qui sont sur le point d'expirer, puis exécutez la requête pour les expirer. Vous risquez d'exécuter votre mise à jour deux fois si elle échoue la première fois.

B. Vous pouvez créer un déclencheur sur abonnement pour écrire un enregistrement dans une file d'attente de notification expire ou similaire que votre script cron peut consommer et générer des e-mails

C vous pouvez ajouter une date périmée à votre table d'abonnement puis interrogez la table après le fait pour trouver les abonnements qui ont expiré "aujourd'hui"

0

Utilisez une transaction et exécutez une instruction SELECT avec la même condition WHERE en premier.