Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: porcjownie działań zapytań bazy dla crona
Forum PHP.pl > Forum > PHP
admin22
Witam. Mam bazę użytkowników na moich stronach internetowych. Chciałbym ich poinformować o nowych promocjach i produktach, więc chce wysłać do nich jednorazowego maila.
Ale wiadomo że funkcja mail wyśle jednorazowo max. 200 do 500 maili.
W tabelach mam nazwy kolumn między innymi ID oraz mail.

Poniższy przykład pokazuje w jaki sposób wysyłać większą ilość maili przy użyciu crona, identyfikatorem jest tutaj jednak data.

Kod
<?php

/********************************************************
* Skrypt ten będzie uruchamiany raz dziennie jako cron. *
* Odpyta on bazę danych i wyśle maila do tych osób,     *
* które pobrały licencję próbną 45 dni temu.            *
********************************************************/

$db = mysql_connect("localhost", "root");
mysql_select_db("evaluators");

// Sformatowanie daty dla celów zapytania
// SPrawdzamy popołudnie 46 dni temu
$now = time();
$fortyfive_days_ago = $now - 3888000 - 43200;

$target_date = date('Y-m-d', $fortyfive_days_ago);
$send_info_email_arr = array();

$query = "SELECT email
          FROM sent_licenses
          WHERE sent_date >= '$target_date 00:00:00'
          AND sent_date <= '$target_date 23:59:59'
         ";
$result = mysql_query($query,$db);
if (mysql_num_rows($result) > 0) {
  while ($email_arr = mysql_fetch_array($result)) {
    $to = $email_arr[0];
    $from = 'mailbot@example.com';
    $subject = 'Licencja próbna na oprogramowanie wygasła';
    $msg     =  'Próbną wersję oprogramowania pobrałeś 45 dni temu.  Jeżeli nie uiścisz opłaty, program sam się usunie.';
    $mailsend = mail($to, $subject, $msg, "From: $from");
    $send_info_email_arr .= "\n".$to."\n";
  }

  // Wyślij e-maila informującego o wykonanych działaniach
  $info_msg .= "Dzisiaj wysłano e-maila do następujących użytkowników:<BR><BR>\n";
  $info_msg .= print_r($send_info_email_arr);
  $info_mail = mail('webdev@example.com', "Zadanie Cron na dzień $target_date", $info_msg, "From: cronjob@example.com");

} else {
  // Jeżeli dzisiaj nie było żadnych adresatów, również o tym poinformuj
  $info_msg = "Dziś nie wysłano e-maila do nikogo.";
  $info_mail = mail('webdev@example.com', "Zadanie Cron na dzień $target_date", $info_msg, "From: cronjob@example.com");

}
?>

Ja niestety nie dysponuję datą, lecz tylko ID. Macie jakiś pomysł aby przerobić zapytanie tak aby cron uruchamiając skrypt zaczynał od klejnych 200 nowych pozycji ID questionmark.gif.
zakręcony
zamiast:

Kod
WHERE sent_date >= '$target_date 00:00:00'          AND sent_date <= '$target_date 23:59:59'


daj

Kod
ORDER BY twojeID DESC LIMIT 0,200
admin22
No ok. ale za każdym razem będzie pobierał pierwsze 200 rekordów, a chodzi mi o to aby za każdym razem były to kolejne 200
zakręcony
być może jest prostszy sposób winksmiley.jpg

najpierw pobierasz sumę rekordów, dzielisz ją przez 200 i masz ilośc pętli, jak masz ilość pętli to zapuszczasz to co wyżej w pętle, zamiast 0 dajesz kolejne 200-setki i masz załatwione winksmiley.jpg
admin22
Nie chce eksperymentować i wysyłać do ludzi SPAM-u, więc sprawdźcie czy dobrze kombinuje.

Kod
<?php


$db = mysql_connect("localhost", "root");
mysql_select_db("evaluators");


$send_info_email_arr = array();


// zliczam te rekordy

$ilosc = "SELECT COUNT(*) FROM sent_licenses";
$resultilosc = @mysql_query($ilosc);
$row = mysql_fetch_array($resultilosc);
$count_rekords = $row[0];

$podziel = '200';
$iloscwywolan = ceil ($count_rekords / $podziel);

  for($i = 0; $i < $iloscwywolan; $i++)
        {
      

$query = "SELECT email
          FROM sent_licenses
          ORDER BY twojeID DESC LIMIT 200,200
         ";
$result = mysql_query($query,$db);
if (mysql_num_rows($result) > 0) {
  while ($email_arr = mysql_fetch_array($result)) {
    $to = $email_arr[0];
    $from = 'mailbot@example.com';
    $subject = 'Licencja próbna na oprogramowanie wygasła';
    $msg     =  'Próbną wersję oprogramowania pobrałeś 45 dni temu.  Jeżeli nie uiścisz opłaty, program sam się usunie.';
    $mailsend = mail($to, $subject, $msg, "From: $from");
    $send_info_email_arr .= "\n".$to."\n";
  }

  // Wyślij e-maila informującego o wykonanych działaniach
  $info_msg .= "Dzisiaj wysłano e-maila do następujących użytkowników:<BR><BR>\n";
  $info_msg .= print_r($send_info_email_arr);
  $info_mail = mail('webdev@example.com', "Zadanie Cron na dzień $target_date", $info_msg, "From: cronjob@example.com");

} else {
  // Jeżeli dzisiaj nie było żadnych adresatów, również o tym poinformuj
  $info_msg = "Dziś nie wysłano e-maila do nikogo.";
  $info_mail = mail('webdev@example.com', "Zadanie Cron na dzień $target_date", $info_msg, "From: cronjob@example.com");

}
}
?>
vokiel
A czy nie lepiej będzie zapisać query jako:
  1. <?php
  2. $query = "SELECT email
  3. FROM sent_licenses
  4. ORDER BY twojeID DESC 
  5. LIMIT ".$licz_od." , 200;";
  6.  
  7. // a pozniej zwiększamy $licz_od
  8. $licz_od += 200;
  9. ?>
admin22
byle zliczalo za każdym razem gdy cron wykona skrypt kolejne 200 rekordow
vokiel
A jak nie bedzie zliczać to zrób plik tekstowy, w nim zapisz kolejne $licz_od, i po wczytaniu wiersza do zmiennej od razu go usuwaj w pliku i zapisuj plik. Wtedy już powinno na pewno zadziałać. dry.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.