philos Δημοσ. 13 Αυγούστου 2013 Δημοσ. 13 Αυγούστου 2013 Καλησπέρα στο forum!Έχω ένα πρόβλημα προς επίλυση.Λοιπόν, έχουμε ένα σύστημα αυτόματης αποστολής e-mail.Τα e-mails προς αποστολή στους χρήστες, αποθηκεύονται στον πίνακα emails, ο οποίος έχει μεταξύ άλλων το column "after_x_weeks" (άλλα columns του που δεν μας ενδιαφέρουν είναι τα emailid AUTO_INCR, emailbody, subject κτλ).Το after_x_weeks παίρνει τιμές 1,2,3 κτλ κτλ, δλδ αριθμό εβδομάδων, που σημαίνει ότι το τάδε e-mail θα σταλεί στους χρήστες Χ εβδομάδες μετά την εγγραφή τους και ΟΧΙ επαναλαμβανόμενα.Μπορεί για παράδειγμα ο διαχειριστής να αποθηκεύσει ένα e-mail που θα σταλεί 2 εβδομάδες μετά την εγγραφή του χρήστη και ένα άλλο 3 εβδομάδες μετά την εγγραφή του.Οπότε ο χρήστης θα λάβει το πρώτο e-mail όταν συμπληρώσει 2 εβδομάδες από την εγγραφή του και άλλο ένα όταν συμπληρώσει 3 εβδομάδες. Δηλαδή όταν συμπληρώσει 3 εβδομάδες, θα έχει λάβει ήδη το e-mail των 2 εβδομάδων, δεν πρέπει να το ξανά λάβει, και ασφαλώς τότε θα λάβει και το e-mail των 3ων εβδομάδων.- Ας πούμε ότι η στιγμή εγγραφής των χρηστών είναι στον πίνακα users, στο column registration_date (= είναι UNIX TIMESTAMP).- Όταν τρέχει το cronjob αποστολής e-mail (κάθε 24 ώρες), σημειώνει σε έναν πίνακα με όνομα sentemails, το κάθε e-mail που στάλθηκε. Το structure αυτού του πίνακα είναι: itemidemailiduseridsentdate (= UNIX TIMESTAMP) Προσοχή στο ότι το emailid είναι του πίνακα emails (ο οποίος πίνακας έχει και τα subject, emailbody κτλ), και όχι το emailid που στάλθηκε (για το email που στάλθηκε έβαλα το itemid). Έχουμε λοιπόν όλα τα δεδομένα που χρειαζόμαστε στη βάση.Θέλω τη βοήθειά σας στο εξής. Ποιες if και κώδικα πρέπει να τρέξω στο cronjob για να στέλνονται σωστά τα e-mail στο σωστό χρόνο και χωρίς επανάληψη? Φυσικά μια χρονική καθυστέρηση μέχρι 24 ωρών, δεν μας ενοχλεί, μιας που κάθε 24 ώρες ελέγχει το cronjob σε ποιους είναι να στείλει.Προσοχή στο ότι το after_x_weeks είναι αριθμός εβδομάδων, οπότε ίσως πρέπει να κάνουμε κάποια μετατροπή σε unix timestamps. Για να μη φανώ και τεμπέλης, να πω ότι προσπαθώ το εξής: Αρχικά τραβάω τα στοιχεία του πίνακα emails και ύστερα τα εξάγω με μια while ($email = fetch_array(emails)).Μέσα σε αυτή τη while τραβάω τα στοιχεία του πίνακα users και πάλι με μια while ($user = fetch_array($users)) και κάνω το εξής:$check = $timenow - $email['after_x_weeks'] * 7 * 86400;if ($user['registration_date'] < $check){ // στέλνει το email // καταχωρεί τα στοιχεία στον πίνακα sentmails}To $timenow είναι timestamp του τώρα.Δεν ξέρω πως να ελέγξω αν το τάδε email έχει ήδη σταλλεί. Προσπάθησα να κάνω κάποιο JOIN του user με τον sentmails, όμως το μόνο κοινό που έχουν είναι το userid.Δοκίμασα στο SELECT query των users να βάλω IF(sentmails .itemid,1,0) AS has_receive,και προσθέτω:if ($user['registration_date'] < $check AND !$user['has_receive']){ // στέλνει το email // καταχωρεί τα στοιχεία στον πίνακα sentmails}... όμως όπως είπα το μόνο κοινό είναι το userid, οπότε στέλνει μόνο το πρώτο email που εντοπίζει, όχι τα υπόλοιπα.Γενικά δεν μου έρχεται το πως μπορώ να χρησιμοποιήσω την τιμή sentdate. --------------------------------- Update: Δοκίμασα το εξής μέσα στην while ($email = fetch_array(emails)), το οποίο απ' ότι φαίνεται δουλεύει (δεν χρησιμοποιώ καν την τιμή sentdate). SELECT users.* FROM users WHERE users.userid NOT IN ( SELECT userid FROM sentmails WHERE emailid = " . intval($email['emailid']) . ") Είναι όμως εντάξει σαν λύση από θέμα βελτιστοποίησης; Αν έχουμε 1000δες απεσταλμένα emails, αυτό το NOT IN δεν μου κάθεται καλά. Πιστεύω λάθος; Θα ήθελα πολύ τη βοήθειά σας για το όλο πρόβλημα. Οποιαδήποτε παρατήρηση μπρος βελτίωση, ευπρόσδεκτη. :-)
warlock9_0 Δημοσ. 13 Αυγούστου 2013 Δημοσ. 13 Αυγούστου 2013 το after x weeks γιατί δεν το κάνεις και αυτό timestamp? και αν το cron τρέχει μετά από αυτό το timestamp και υπάρχουν email που δεν έχουν σταλεί, να τα στέλνει
philos Δημοσ. 13 Αυγούστου 2013 Μέλος Δημοσ. 13 Αυγούστου 2013 το after x weeks γιατί δεν το κάνεις και αυτό timestamp? και αν το cron τρέχει μετά από αυτό το timestamp και υπάρχουν email που δεν έχουν σταλεί, να τα στέλνει Αν δεις στο quote χρησιμοποιώ το $check Αν και γενικά απ ότι καταλαβαίνω, το πρόβλημά μου είναι η σύνταξη του query. Έχω παραθέσει στο τέλος κάτι που δουλεύει, όμως δεν ξέρω αν είναι οκ από θέμα βελτιστοποίησης.
warlock9_0 Δημοσ. 13 Αυγούστου 2013 Δημοσ. 13 Αυγούστου 2013 βασικά το καλύτερο νομιζω θα ήταν στον ίδιο πίνακα να βάλεις άλλη μια στήλη status για να γλιτώσεις τα δύο select μετά θα είναι κάπως έτσι select * from users where email_status = 0 and sent_data < utc_timestamp()
philos Δημοσ. 13 Αυγούστου 2013 Μέλος Δημοσ. 13 Αυγούστου 2013 Ποιο όμως το νόημα του email_status? Επίσης το sent_data τι περιέχει? Απλά δεν μπορώ να καταλάβω σε τι χρειάζονται αυτές οι τιμές στον users. Ο διαχειριστής μπορεί να ορίσει πάνω από 1 emails για after_x_weeks. thanks
warlock9_0 Δημοσ. 13 Αυγούστου 2013 Δημοσ. 13 Αυγούστου 2013 οπα sorry σκ@τ@ τα έκανα χαχαχααχ εννοώ τους πίνακες email και sentmail να τους κάνεις έναν, το users μου ξέφυγε το status θα είναι 0 ή 1 αν στάλθηκε ή όχι, ή boolean το άλλο ήταν δοκάρι sent_date, όχι sent_data
sougiasdj Δημοσ. 13 Αυγούστου 2013 Δημοσ. 13 Αυγούστου 2013 Καταρχάς μιλάς για αποδοτικότητα αλλα δε εχεις δώσει κάποια νούμερα. Επίσης καλύτερα να μας δώσεις μερικές εγγραφές(για ασφάλεια μπορεις να αλλάξεις τα προσωπικά δεδομένα) απο του πίνακες που χρησιμοποιείς για να μπορέσουμε να κρίνουμε.
spartakoscs Δημοσ. 14 Αυγούστου 2013 Δημοσ. 14 Αυγούστου 2013 Εάν κατάλαβα κάλα αυτό που θες είναι να στέλνεις mails σε συγκεκριμένες χρονικές στιγμές στους users . Για παράδειγμα το σημερινό 24ωρο είναι 1376456400 - 1376542800 . Τώρα εάν καποιανού χρήστη η έγγραφη αληθεύει μεταξύ αυτών των τιμών θα του έστελνα το email . ΠΧ για το email μιας της δεύτερης εβδομάδας : $uts = strtotime('+14 days', $user_registration_date_timestamp); if($uts >= 1376456400 && $uts <= 1376542800){ //send mail ….. } Αυτή είναι η λογική !!
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα