Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Skrypt "rss go email" nie wysyła do bazy danych
Forum PHP.pl > Forum > PHP
cox
Witam,
nie wiedziałem w jakim dziale to umieścić także w razie czego proszę o przeniesienie.
Potrzebuje z pewnymi kanałami rss być na bieżąco dlatego też posiadam skrypt, który dany kanał parsuje i wstawia do bazy danych po czym wysyła maila z daną informacją na adres e-mail. Po kilku minutach sprawdza kanał i jeżeli jest nowy wpis (czyli nie ma go w bazie) wysyła maila i dodaje do bazy by nie wysyłać po raz kolejny tego samego.

Kłopot polega na tym, że na niektórych kanałach hula to fajnie, a na niektórych pewne wpisy nie są dodawane do bazy i cały czas są wysyłane.

Np. dzisiaj próbowałem kanał rss bash.org.pl i tylko jedna "news" nie został dodany do bazy i wysyłany jest non stop.

Co może być przyczyną i jak naprawić ?
Z góry dzięki.


Wykorzystywany parser to Simplepie.

Kod skryptu:
  1. <?php
  2.  
  3. header('Content-Type: text/html');
  4. require_once(dirname(__FILE__).'/config.php');
  5. require_once(dirname(__FILE__).'/simplepie.php');
  6.  
  7. $connect = mysql_connect($dbhost,$dbuser,$dbpass) or die("Cannot Connect Database");
  8.  
  9.  
  10. if(!(mysql_select_db($dbbase))){
  11. echo "CANNOT SELECT DATABASE";
  12. die();
  13. }
  14. // Call SimplePie
  15. $feed = new SimplePie();
  16.  
  17. $feed->set_feed_url($urls);
  18.  
  19. $feed->enable_cache('false');
  20. $feed->set_cache_location($cachedir);
  21. $cachetime = (intval($cachetime) / 60); //convert from seconds to minutes
  22. $feed->set_cache_duration($cachetime);
  23.  
  24. // Init feed
  25. $feed->init();
  26. // Make sure the page is being served with the UTF-8 headers.
  27. $feed->handle_content_type();
  28. $items = $feed->get_items();
  29.  
  30. foreach($items as $item){
  31.  
  32. $title = $item->get_title();
  33. $guid = md5($item->get_id());
  34. $desc = $item->get_description();
  35. $link = $item->get_link();
  36.  
  37. // Check Row
  38. $query = mysql_query("SELECT * FROM rssgoemail WHERE guid='$guid'");
  39. $row = mysql_num_rows($query);
  40.  
  41. // If row empty send email and happy blogging
  42. if( $row < 1){
  43.  
  44. $mail = $desc."<br /><br /><a href=\"".$link."\" rel=\"nofollow\">Read More</a>";
  45.  
  46. $send = mail($email, $title, $mail, "From: {$title}");
  47.  
  48. echo "Send ".$title."<br />";
  49.  
  50. if($send){
  51. mysql_query("INSERT INTO rssgoemail(title,guid,description) VALUES ('$title','$guid','$desc')");
  52. }
  53. }else{
  54. continue;
  55. }
  56.  
  57. }?>
404
Skoro wpisy są wysyłanie, ale nie są dodawane do bazy to przyczyna prawdopodobnie leży tu:
  1. $send = mail($email, $title, $mail, "From: {$title}");
  2. //...
  3. if($send){
  4. mysql_query("INSERT INTO rssgoemail(title,guid,description) VALUES ('$title','$guid','$desc')");
  5. }

Przynajmniej ja bym od tego zaczął. Jesteś pewny, że do funkcji mail przesyłasz wszystkie potrzebne argumenty odpowiednio?
cox
Chyba tak. Jak wspominalem wcześniej np. z kanału rss strony bash.org.pl wszystko zostało zrobione oprócz jednego news'a, który nie wiem czemu nie został dodany i był wysyłany ciągle.
404
Być może to był błąd po ich stronie i np. news miał taką samą treść, ale inne id, co by prowadziło do generowania różnych skrótów MD5. Dodaj tam sobie jakiś mini system logów i następnym razem, w takim przypadku będziesz wiedział co poszło nie tak.
cox
To chyba nie błąd tej samej treści a innego id. Podejrzewam, że to przez niedozwolone znaki w tytule newsów. Czy to możliwe, że przez znaki typu ' lub / rzeczy nie są dodawane do bazy? Jeżeli tak to jak to ominąć ?

Przepraszam jeżeli pytania są zbyt banalne lecz na php znam się jak prawiczek na sexie.
Kofel
No właśnie kolego. Problemem jest to, jak tworzysz zapytanie do bazy:
  1. "INSERT INTO rssgoemail(title,guid,description) VALUES ('$title','$guid','$desc')"

Zauważ, że jeśli w tytule/opisie będziesz miał znak ' to zapytanie się rozwali. smile.gif Musisz się przed tym zabezpieczyć.
Uniwersalnym rozwiązaniem będzie zastosowanie mysql_real_escape_string, który wszystkie niebezpieczne znaki odpowiednio "przerobi".
cox
W takim razie o co trzeba uzupełnić skrypt by wysłać prawidłowe zapytanie do bazy i przy kolejny sprawdzeniu było widać, że taki wpis już istnieje i nie trzeba wysyłać maila?
Kofel
Ahh.. ok.

  1. <?php
  2.  
  3. header('Content-Type: text/html');
  4. require_once(dirname(__FILE__).'/config.php');
  5. require_once(dirname(__FILE__).'/simplepie.php');
  6.  
  7. $connect = mysql_connect($dbhost,$dbuser,$dbpass) or die("Cannot Connect Database");
  8.  
  9.  
  10. if(!(mysql_select_db($dbbase))){
  11. echo "CANNOT SELECT DATABASE";
  12. die();
  13. }
  14. // Call SimplePie
  15. $feed = new SimplePie();
  16.  
  17. $feed->set_feed_url($urls);
  18.  
  19. $feed->enable_cache('false');
  20. $feed->set_cache_location($cachedir);
  21. $cachetime = (intval($cachetime) / 60); //convert from seconds to minutes
  22. $feed->set_cache_duration($cachetime);
  23.  
  24. // Init feed
  25. $feed->init();
  26. // Make sure the page is being served with the UTF-8 headers.
  27. $feed->handle_content_type();
  28. $items = $feed->get_items();
  29.  
  30. foreach($items as $item){
  31.  
  32. $title = $item->get_title();
  33. $guid = md5($item->get_id());
  34. $desc = $item->get_description();
  35. $link = $item->get_link();
  36.  
  37. // Check Row
  38. $query = mysql_query("SELECT * FROM rssgoemail WHERE guid='$guid'");
  39. $row = mysql_num_rows($query);
  40.  
  41. // If row empty send email and happy blogging
  42. if( $row < 1){
  43.  
  44. $mail = $desc."<br /><br /><a href=\"".$link."\" rel=\"nofollow\">Read More</a>";
  45.  
  46. $send = mail($email, $title, $mail, "From: {$title}");
  47.  
  48. echo "Send ".$title."<br />";
  49.  
  50. if($send){
  51. $title = mysql_real_escape_string( $title );
  52. $guid = mysql_real_escape_string( $guid );
  53. $desc = mysql_real_escape_string( $desc );
  54.  
  55. mysql_query("INSERT INTO rssgoemail(title,guid,description) VALUES ('$title','$guid','$desc')");
  56. }
  57. }else{
  58. continue;
  59. }
  60.  
  61. }?>


Sprawdzanie, czy został wpis istnieje już jest. Po prostu, nie działało, gdyż jest oparte na bazie. Skoro wpisów Ci pewnych nie dodawał... smile.gif
cox
Smiga aż miło. Dziękuję bardzo za pomoc. Pozdrawiam
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.