Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> porcjownie działań zapytań bazy dla crona
admin22
post
Post #1





Grupa: Zarejestrowani
Postów: 36
Pomógł: 0
Dołączył: 18.12.2006

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
zakręcony
post
Post #2





Grupa: Zarejestrowani
Postów: 107
Pomógł: 10
Dołączył: 26.09.2007

Ostrzeżenie: (0%)
-----


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


--------------------
Rachunkowość w biurze we Wrocławiu: biuro rachunkowe wrocław, miejca parkingowe przy Okęciu parking Okecie.
Go to the top of the page
+Quote Post
admin22
post
Post #3





Grupa: Zarejestrowani
Postów: 36
Pomógł: 0
Dołączył: 18.12.2006

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
zakręcony
post
Post #4





Grupa: Zarejestrowani
Postów: 107
Pomógł: 10
Dołączył: 26.09.2007

Ostrzeżenie: (0%)
-----


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


--------------------
Rachunkowość w biurze we Wrocławiu: biuro rachunkowe wrocław, miejca parkingowe przy Okęciu parking Okecie.
Go to the top of the page
+Quote Post
admin22
post
Post #5





Grupa: Zarejestrowani
Postów: 36
Pomógł: 0
Dołączył: 18.12.2006

Ostrzeżenie: (0%)
-----


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");

}
}
?>
Go to the top of the page
+Quote Post
vokiel
post
Post #6





Grupa: Zarejestrowani
Postów: 2 592
Pomógł: 445
Dołączył: 12.03.2007

Ostrzeżenie: (0%)
-----


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. ?>


--------------------
Go to the top of the page
+Quote Post
admin22
post
Post #7





Grupa: Zarejestrowani
Postów: 36
Pomógł: 0
Dołączył: 18.12.2006

Ostrzeżenie: (0%)
-----


byle zliczalo za każdym razem gdy cron wykona skrypt kolejne 200 rekordow
Go to the top of the page
+Quote Post
vokiel
post
Post #8





Grupa: Zarejestrowani
Postów: 2 592
Pomógł: 445
Dołączył: 12.03.2007

Ostrzeżenie: (0%)
-----


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


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 19.08.2025 - 14:41