Go Back   vb.org Archive > vBulletin 4 Discussion > vB4 Programming Discussions
  #1  
Old 06-07-2011, 07:06 PM
TalkVirginia's Avatar
TalkVirginia TalkVirginia is offline
 
Join Date: Oct 2008
Location: Virginia
Posts: 545
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default Any MySQL experts? Help is needed

Can anyone help me track down a couple issues with my Email Reminders for inactive users mod? It's been reported that it's sending out emails to members when it shouldn't be, and not sending email when it should be which doesn't make sense.

This SQL statement is supposed to grab all members that have been inactive over x number of days based on their last activity date and have never been sent an email, as long as they can receive emails from the administrator and have not opted out. There is a link in the reminder email which the inactive member may click on to optout.

Code:
    $sql = "SELECT userid, username, email, usergroupid, ".
           "FROM_UNIXTIME(lastvisit) lastvisit, ". 
           "FROM_UNIXTIME(lastactivity) lastactivity, ". 
           "CASE WHEN lastpost = 0 THEN '' ELSE FROM_UNIXTIME(lastpost) END AS lastpost, ". 
           "CASE WHEN rmEmailDate = 0 THEN '' ELSE FROM_UNIXTIME(rmEmailDate) END AS lastreminder, ".
           "TIMESTAMPDIFF(DAY, FROM_UNIXTIME(lastvisit), FROM_UNIXTIME(UNIX_TIMESTAMP())) days_since_lastvisit, ".
           "TIMESTAMPDIFF(DAY, FROM_UNIXTIME(lastactivity), FROM_UNIXTIME(UNIX_TIMESTAMP())) days_since_lastactivity, ".
           "CASE WHEN lastpost = 0 THEN 0 ELSE TIMESTAMPDIFF(DAY, FROM_UNIXTIME(lastpost), FROM_UNIXTIME(UNIX_TIMESTAMP())) END AS days_since_lastpost, ".
           "CASE WHEN rmEmailDate = 0 THEN 0 ELSE TIMESTAMPDIFF(DAY, FROM_UNIXTIME(rmEmailDate), FROM_UNIXTIME(UNIX_TIMESTAMP())) END AS days_since_lastemail, ".
           "rmoptout ".
           "FROM " . TABLE_PREFIX . "user ".  
           "WHERE TIMESTAMPDIFF(DAY, FROM_UNIXTIME(lastactivity), FROM_UNIXTIME(UNIX_TIMESTAMP())) >= ". $graceperiod . " ". 
           "AND usergroupid IN ('" . $usergroups . "') ".
           "AND rmEmailCount = 0 ".
           "AND options & 16 ". 
           "AND rmoptout = 0 ";
$graceperiod and the $usergroups are set in the mod settings screen.

$usergroups will be a comma-delimited list of integers (ex. 1','2','3','4 )

If anyone can help, I'll gladly give you credit on the mod page here.

Thanks in advance,
Jim
Reply With Quote
  #2  
Old 06-07-2011, 08:00 PM
Farcaster Farcaster is offline
 
Join Date: Dec 2005
Posts: 386
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Could you be more specific about what users are receiving emails that aren't supposed to and the other way around? Is that based on one of the filters, multiple, or all?

One shortcut that I can think of that might help is to use the unix timestamp natively for your comparisons. Example: UNIX_TIMESTAMP() - user_lastactivity is the difference in seconds between the two dates. Divide that by 86400 and you have your full days.
Reply With Quote
  #3  
Old 06-07-2011, 08:43 PM
kh99 kh99 is offline
 
Join Date: Aug 2009
Location: Maine
Posts: 13,185
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

I'm not a mysql expert, but: at the beginning you have

FROM_UNIXTIME(lastactivity) lastactivity

then in the WHERE you have another FROM_UNIXTIME(lastactivity). Wouldn't that end up doing a FROM_UNIXTIME() on something that's already been converted?

Or maybe not. Edit: no, I guess you can't use column aliases in a WHERE, so it has to refer to the table column. Never mind.
Reply With Quote
  #4  
Old 06-07-2011, 09:06 PM
TalkVirginia's Avatar
TalkVirginia TalkVirginia is offline
 
Join Date: Oct 2008
Location: Virginia
Posts: 545
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

[QUOTE=Farcaster;2204733]Could you be more specific about what users are receiving emails that aren't supposed to and the other way around? Is that based on one of the filters, multiple, or all?
[/?QUOTE]

The way I understand it is members that are not inactive are getting emails and members that are known to be inactive are not being found, however, I have reason to believe that the people this is happening to have not updated their copy of the addon to the recent changes because the addon has been working on my development site and my live site.

Quote:
Originally Posted by Farcaster View Post
One shortcut that I can think of that might help is to use the unix timestamp natively for your comparisons. Example: UNIX_TIMESTAMP() - user_lastactivity is the difference in seconds between the two dates. Divide that by 86400 and you have your full days.
That is what this is doing. It's just using the built-in MYSQL functions instead.
TIMESTAMPDIFF(DAY, FROM_UNIXTIME(lastactivity), FROM_UNIXTIME(UNIX_TIMESTAMP())) >= ". $graceperiod

What this is doing is converting the Unix time stamp to a date then subtracting the current date/time from the date the member was last active on site. It then gets the difference in days comparing that with the integer value entered in the addon settings screen (graceperiod).
Reply With Quote
  #5  
Old 06-07-2011, 09:39 PM
Farcaster Farcaster is offline
 
Join Date: Dec 2005
Posts: 386
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Quote:
Originally Posted by TalkVirginia View Post
The way I understand it is members that are not inactive are getting emails and members that are known to be inactive are not being found, however, I have reason to believe that the people this is happening to have not updated their copy of the addon to the recent changes because the addon has been working on my development site and my live site.
Looking at the code you pasted, I don't see any reason why that might might get the wrong subset of data based on the last activity date. Do you have the SQL from the previous version that might have had a problem?


Quote:
Originally Posted by TalkVirginia View Post
What this is doing is converting the Unix time stamp to a date then subtracting the current date/time from the date the member was last active on site. It then gets the difference in days comparing that with the integer value entered in the addon settings screen (graceperiod).
I understand how the function is working, but what I am saying is that you are converting two unixtime values and then comparing them when you could do it manually, which would allow your query to take advantage of any indexing available on that field instead of doing a table scan. It would also be quicker since it doesn't have to run each value through a function. Of course, with most boards and the relatively small amount of rows you are talking about, this probably wouldn't be noticeable.
Reply With Quote
Reply

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT. The time now is 07:44 PM.


Powered by vBulletin® Version 3.8.12 by vBS
Copyright ©2000 - 2024, vBulletin Solutions Inc.
X vBulletin 3.8.12 by vBS Debug Information
  • Page Generation 0.11624 seconds
  • Memory Usage 2,206KB
  • Queries Executed 13 (?)
More Information
Template Usage:
  • (1)SHOWTHREAD
  • (1)ad_footer_end
  • (1)ad_footer_start
  • (1)ad_header_end
  • (1)ad_header_logo
  • (1)ad_navbar_below
  • (1)ad_showthread_beforeqr
  • (1)ad_showthread_firstpost
  • (1)ad_showthread_firstpost_sig
  • (1)ad_showthread_firstpost_start
  • (1)bbcode_code
  • (3)bbcode_quote
  • (1)footer
  • (1)forumjump
  • (1)forumrules
  • (1)gobutton
  • (1)header
  • (1)headinclude
  • (1)navbar
  • (3)navbar_link
  • (120)option
  • (5)post_thanks_box
  • (5)post_thanks_button
  • (1)post_thanks_javascript
  • (1)post_thanks_navbar_search
  • (5)post_thanks_postbit_info
  • (5)postbit
  • (5)postbit_onlinestatus
  • (5)postbit_wrapper
  • (1)spacer_close
  • (1)spacer_open
  • (1)tagbit_wrapper 

Phrase Groups Available:
  • global
  • inlinemod
  • postbit
  • posting
  • reputationlevel
  • showthread
Included Files:
  • ./showthread.php
  • ./global.php
  • ./includes/init.php
  • ./includes/class_core.php
  • ./includes/config.php
  • ./includes/functions.php
  • ./includes/class_hook.php
  • ./includes/modsystem_functions.php
  • ./includes/functions_bigthree.php
  • ./includes/class_postbit.php
  • ./includes/class_bbcode.php
  • ./includes/functions_reputation.php
  • ./includes/functions_post_thanks.php 

Hooks Called:
  • init_startup
  • init_startup_session_setup_start
  • init_startup_session_setup_complete
  • cache_permissions
  • fetch_postinfo_query
  • fetch_postinfo
  • fetch_threadinfo_query
  • fetch_threadinfo
  • fetch_foruminfo
  • style_fetch
  • cache_templates
  • global_start
  • parse_templates
  • global_setup_complete
  • showthread_start
  • showthread_getinfo
  • forumjump
  • showthread_post_start
  • showthread_query_postids
  • showthread_query
  • bbcode_fetch_tags
  • bbcode_create
  • showthread_postbit_create
  • postbit_factory
  • postbit_display_start
  • post_thanks_function_post_thanks_off_start
  • post_thanks_function_post_thanks_off_end
  • post_thanks_function_fetch_thanks_start
  • post_thanks_function_fetch_thanks_end
  • post_thanks_function_thanked_already_start
  • post_thanks_function_thanked_already_end
  • fetch_musername
  • postbit_imicons
  • bbcode_parse_start
  • bbcode_parse_complete_precache
  • bbcode_parse_complete
  • postbit_display_complete
  • post_thanks_function_can_thank_this_post_start
  • tag_fetchbit_complete
  • forumrules
  • navbits
  • navbits_complete
  • showthread_complete