Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]ilosc wykonań skryptu w PHP
Forum PHP.pl > Forum > Przedszkole
elmozaur
Witam.
Mam napisany prosty skrypt do pokazywania stron.
Skrypt zakończony jest funkcją updatującą statystyki.

końcówka skryptu wygląda tak:
  1. $view = new Core_Template($data);
  2. echo $view->getView();
  3. Core_Statistics::update($router);


W czym problem:
Odpaliłem phpmyadmin z tabelką statystyk i robię F5 skryptu mojej strony -> wynik statystyki zwiększają się o dwa.
Jeśli zakomentuję 'echo $view->getView();' statystyki zwiększają się o jeden (czyli tak jak powinno być).
Metoda getView() wygląda tak:
  1. public function getView() {
  2. return $this->res;
  3. }


Problem: dlaczego zwykłe wyświetlenie $this->res powoduje że skrypt zachowuje się jakby wykonywał się dwa razy questionmark.gif?
Gdzie można szukać rozwiązania bo spotykam się z tym po raz pierwszy.

pozdrawiam
Grzegorz
rad11
Pokaż jeszcze skąd się bierze $router i co się dzieje w Core_Statistics::update
elmozaur
  1. static function update($router) {
  2.  
  3. global $db;
  4. $data = date("Y-m-d");
  5. $ip = $_SERVER['REMOTE_ADDR'];
  6.  
  7. $sql = "INSERT INTO statisctics_details VALUES('', :time, :mod, :ip)";
  8. $q = $db->prepare($sql);
  9. $q->bindValue(':time', time(), PDO::PARAM_STR);
  10. $q->bindValue(':mod', $router->mod, PDO::PARAM_STR);
  11. $q->bindValue(':ip', $ip, PDO::PARAM_STR);
  12. $q->execute();
  13.  
  14. $tab = '';
  15. $sql = "SELECT * FROM statisctics_views WHERE data= :data";
  16. $q = $db->prepare($sql);
  17. $q->bindValue(':data', $data, PDO::PARAM_STR);
  18. $q->execute();
  19. $tab = $q->fetchAll(PDO::FETCH_ASSOC);
  20.  
  21. if (count($tab)==0) {
  22. $sql = "INSERT INTO statisctics_views VALUES('', :data, '1', :ip)";
  23. $q = $db->prepare($sql);
  24. $q->bindValue(':data', $data, PDO::PARAM_STR);
  25. $q->bindValue(':ip', $ip, PDO::PARAM_STR);
  26. $q->execute();
  27. } else {
  28.  
  29. $id = 0;
  30. $ogladany = 0;
  31. foreach ($tab as $row) {
  32. if ($row['ip']==$ip) {
  33. $id = (int)$row['id'];
  34. $ogladany = (int)$row['ogladany'];
  35. }
  36. }
  37.  
  38. if ($id!=0) {
  39. $ogladany++;
  40. $sql = "UPDATE statisctics_views SET ogladany = :ogladany WHERE id = :id";
  41. $q = $db->prepare($sql);
  42. $q->bindValue(':id', $id, PDO::PARAM_INT);
  43. $q->bindValue(':ogladany', $ogladany, PDO::PARAM_INT);
  44. $q->execute();
  45. } else {
  46. $sql = "INSERT INTO statisctics_views VALUES('', :data, '1', :ip)";
  47. $q = $db->prepare($sql);
  48. $q->bindValue(':data', $data, PDO::PARAM_STR);
  49. $q->bindValue(':ip', $ip, PDO::PARAM_STR);
  50. $q->execute();
  51. }
  52.  
  53. }
  54. }

A jesli chodzi o router to poprostu klasa rozkladajaca url na odpowiedni modul i jego parametry :
  1. public function __construct() {
  2. $this->url = substr($_SERVER['REQUEST_URI'], 1);
  3. $this->method = $_SERVER['REQUEST_METHOD'];
  4.  
  5. $args = array();
  6. $routes = array();
  7.  
  8. $routes['mod_mainpage'] = array('method'=>'GET', 'type'=>'literal', 'action'=>'/^(,[a-z]{2})?$/', 'args'=>array('1'=>'lang'), 'langswitch'=>array('/,[a-z]{2}$/', ',{LANG}'));
  9. $routes['mod_page'] = array('method'=>'GET', 'type'=>'literal', 'action'=>'/^[a-zA-Z0-9\-\_]+(,[a-z]{2})?.htm$/', 'args'=>array('1'=>'lang'), 'langswitch'=>array('/(,[a-z]{2})?.htm$/', ',{LANG}.htm'));
  10. $routes['mod_content'] = array('method'=>'GET', 'type'=>'segment', 'action'=>'/^[a-zA-Z0-9\-\_]+\/[a-zA-Z0-9\-\_]+(,[0-9]+)(,[0-9]+)(,[a-z]{2})?.htm$/', 'args'=>array('1'=>'catid', '2'=>'newsid', '3'=>'lang'), 'langswitch'=>array('/(,[a-z]{2})?.htm$/', ',{LANG}.htm'));
  11. $routes['mod_category'] = array('method'=>'GET', 'type'=>'segment', 'action'=>'/^[a-zA-Z0-9\-\_]+(,[0-9]+)(,[0-9]+)(,[a-z]{2})?\/$/', 'args'=>array('1'=>'catid', '2'=>'page', '3'=>'lang'), 'langswitch'=>array('/(,[a-z]{2})?\/$/', ',{LANG}/'));
  12. $routes['mod_contact'] = array('method'=>'GET', 'type'=>'literal', 'action'=>'/^contact(,[a-z]{2})?.htm$/', 'args'=>array('1'=>'lang'), 'langswitch'=>array('/(,[a-z]{2})?.htm$/', ',{LANG}.htm'));
  13. $routes['mod_sitemap'] = array('method'=>'GET', 'type'=>'literal', 'action'=>'/^sitemap(,[a-z]{2})?.htm$/', 'args'=>array('1'=>'lang'), 'langswitch'=>array('/(,[a-z]{2})?.htm$/', ',{LANG}.htm'));
  14.  
  15. if ($this->url!='') {
  16. foreach ($routes as $mod => $data) {
  17. if ($this->method==$data['method']) {
  18.  
  19. if ($data['action']!='') {
  20. if (preg_match($data['action'], $this->url, $results)) {
  21.  
  22. $this->mod = $mod;
  23.  
  24. if (isset($data['args'])) {
  25. $args = array();
  26. foreach ($data['args'] as $key=>$val) {
  27. if (isset($results[$key])) {
  28. $args[$val] = substr($results[$key], 1);
  29. }
  30.  
  31. }
  32. if (isset($args['lang'])) {
  33. $this->lang = $args['lang'];
  34. }
  35.  
  36. $this->args = $args;
  37. }
  38.  
  39. if ($this->url!='') {
  40. $this->langpattern = preg_replace($data['langswitch'][0], $data['langswitch'][1], $this->url);
  41. }
  42. }
  43. }
  44. }
  45. }
  46. } else {
  47. $this->langpattern = ',{LANG}';
  48. }
  49. }
nospor
w view zapewne masz odwolanie do jakiegos zasobu, ktory nie istnieje i wywolywany jest wowczas dla takiego zasobu normanie kod php.
Takim zasobem, ktory nie istnieje moze byc np. FAVICON.

Rownie dobrze mozesz tez w view robic jakis AJAX o ktorym zapomniales.

Mozliwosci jest wiele. Najczesciej jednak chodzi o ten nieszczesny FAVICON smile.gif
elmozaur
a czy np zła konstrukcja np .htaccessa może powodować takie ponowne wykonanie tego samego skryptu ? (np wystąpił jakiś błąd i następuje przeładowanie ?)

Dzięki nospor - znalazłem.
Faktycznie, jeśli brakuje zmiennej to PHP wywala info natomiast jeśli w trakcie generowania strony dynamicznie liknowane są pliki np js to już trudniej to wyszukać.
Ciekawostką jest to, że jak miałem źródło strony
  1. <script type="text/javascript" src="/js/mod_page.js"></script>

a pliku 'mod_page.js' fizycznie nie było na dysku to po kliknięciu w link '/js/mod_page.js' nie dostawałem 404 tylko ponownie tą samą stronę (dlatego statystyki zliczały się x2).
ciekawe...
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.