Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL]Jak najlepiej zapisywać logi?
Forum PHP.pl > Forum > Przedszkole
koxu1996
Witam. Posiadam stronę na której mam button. Chcę zapisywać każde kliknięcie i je obok wyświetlać. Nie wiem jak najlepiej zapisywać historie tych kliknięć żeby strona była zoptymalizowana. Lepiej zrobić to w pliku txt czy może w mysql?

P.s Wiecie może jak w porównaniu do pliku txt mysql wykonuje operacje?
CTRL
Ja osobiście trzymam tablicę $_GET i $_POST w bazie mysql, razem z datą, ip itp. Baza danych zazwyczaj (chyba) jest w końcu przechowywana w plikach, lecz ma to większe znaczenie jeśli ktoś się decyduje na przechowywanie plików w blobie w bazie, ale nie o tym teraz. Jeśli chcesz tylko zapisywać a nie manipulować tym potem to zdecydowanie baza danych.
koxu1996
Chcę zapisywać te informacje do bazy i je później odczytywać. Mankamentem jest to że może być kilkadziesiąt buttonów a w każdym po kilkaset kliknięć. Czy odczytanie kilkuset rekordów z mysql nie będzie trwać więcej niż z pliku tekstowego?
CTRL
Czytelność zdecydowanie większa jest w bazie, szczególnie gdy się zapisuje każdą odsłonę forum, ponieważ usuwam z logów te bezużyteczne, czyli np. odświeżenie shoutboxa, które się wykonuje samoistnie. jedno zapytanie nawet przez klienta mysql i problem z głowy. Plik .txt jest również dostępny dla innych. (to zależy jak się postarasz żeby nie był) Być może będziesz coś modyfikował czy co, ja radzę mysql smile.gif Ale to Twój wybór
skowron-line
Zainteresuj się mongo
http://www.progresowi.pl/2011/11/10/porown...vs-mongodb.html
patrząc na ten test zapowiada się imponująco.
koxu1996
Ale czy baza mysql nada się do trzymania kilkuset tabel i w każdej po kilkaset rekordów? Bo mógłbym zrobić do każdego buttona inny plik i w nim trzymać logi. Co lepsze według was?
strife
A może warto się posłużyć tym co oferuje Google Analytics? Masz tam opcję trackingu eventów tego typu, hm ...
CTRL
Warto, ale ja to tam wolę mieć swoje (: A nie lepiej zrobić jedną tabele i zapisywać też id buttona?
konrados
@koxu1996:
Cytat
Witam. Posiadam stronę na której mam button. Chcę zapisywać każde kliknięcie i je obok wyświetlać


Ale, że co, dla każdego buttona trzymasz liczbę kliknięć wszystkich userów tak? Czy może dla każdego z osobna? Zresztą to bez znaczenia, baza na pewno jest lepszym rozwiązaniem.

Cytat
Ale czy baza mysql nada się do trzymania kilkuset tabel i w każdej po kilkaset rekordów? Bo mógłbym zrobić do każdego buttona inny plik i w nim trzymać logi. Co lepsze według was?


Kilkaset tabel?questionmark.gif Chcesz trzymasz każdy button w osobnej tabeli czy może czegoś nie rozumiem? Robimy tak (struktura tabeli):
nazwa tabeli: button_clicks
id (int, autoincrement)
button_id (int): można zamienić na varchar jak wolisz posługiwać się nazwami, ale to mało optymalne)
clicks (int): czyli liczba kliknięć.

I wtedy, by uzyskać liczbę klików:
Cytat
SELECT * from button_clicks WHERE `button_id`=id_danego_buttona
CTRL
Raczej myślę że on by chciał zapisywać kliknięcie użytkownika razem z danymi użytkownika, czyli w jednej tabeli znajdzie się id, id użytkownika, id buttona, i ewentualnie ip, user agent itp.
rossecki
Spróbuj może zrobić button który w momencie kliknięcie będzie tworzył zmienną np
  1. $log1 = "button nazwa"
, wyślij tą zmienną w postaci POST do wywoływanej strony.
Następnie stwórz plik który będzie można includować na początku każdej strony, a który będzie sprawdzał czy taka zmienna została przekazana jeśli tak odczytywał tą zmienną a następnie w krótkiej komendzie dodawał do bazy danych np w formie
Button, data, ip + yyy session['username'] i co tam jeszcze chcesz. Na koniec czyścić zmienną $log1 = NULL; i tyle

Tak wiem dla programistów którzy już mają o wiele wiekszę doświadczenie jest to tragiczny kod i podejście do problemu, jednak nadal się uczę a w moim przypadku takie rozwiązanie problemu zdało egzamin (400 klikających coś na raz nie zamuliło serwera smile.gif)
Crozin
Do logów potrzebna jest baza danych umożliwiająca szybki zapis (odczyt nie jest tak istotny) zróżnicowanych, nierelacyjnych danych. Tutaj Apache Casscandra wydaje się być jednym z faworytów.
Relacyjne bazy danych? Też dadzą radę, ale nie będą tak wygodne w użyciu.
koxu1996
Mam taki kod:
  1. <?php
  2. $host="mysql3.ugu.pl"; // Nazwa hosta.
  3. $db_user="*******"; // Nazwa użytkownika - MySQL.
  4. $db_password="*****"; // Hasło do bazy.
  5. $database="******"; // Nazwa bazy.
  6. mysql_connect($host,$db_user,$db_password);
  7. mysql_select_db($database);
  8. ?>
  9. <html>
  10. <head>
  11. <link rel="stylesheet" type="text/css" href="style.css" />
  12. </head>
  13. <body>
  14.  
  15.  
  16.  
  17.  
  18. <div id="pasek"><table><tr>
  19. <td class="form_input_login">
  20. <input type="text" name="login" class="login" value="Login" size="15" onfocus="if(!this._haschanged){this.value=''};this._haschanged=true;"></td><td class="form_input_login">
  21. <input type="password" name="password" class="login" value="Hasło" size="15" onfocus="if(!this._haschanged){this.value=''};this._haschanged=true;""></td></tr></table>
  22.  
  23. </div>
  24.  
  25.  
  26. <br><br>
  27. <div class="timenormal" id='time'></div>
  28. <button onclick="clickbutton()" type=button>KLIK</button>
  29.  
  30.  
  31.  
  32. </body>
  33. </html>
  34.  
  35. <script type="text/javascript">
  36.  
  37.  
  38.  
  39.  
  40.  
  41. function zmien_klase_CSS(nazwa_nowej_klasy, element) {
  42. var el = document.getElementById(element);
  43. el.className = nazwa_nowej_klasy;
  44. }
  45.  
  46.  
  47.  
  48. function czasDoWydarzenia(rok, miesiac, dzien, godzina, minuta, sekunda, milisekunda)
  49. {
  50. var check=0;
  51. var aktualnyCzas = new Date();
  52. var dataWydarzenia = new Date(rok, miesiac, dzien, godzina, minuta, sekunda, milisekunda);
  53. var pozostalyCzas = dataWydarzenia.getTime() - aktualnyCzas.getTime();
  54.  
  55. if (pozostalyCzas > 0)
  56. {
  57. if (check==0)
  58. {
  59. if (pozostalyCzas <= 10000)
  60. {
  61. zmien_klase_CSS(timehurry, time);
  62. check=1;
  63. }
  64. }
  65.  
  66. var s = pozostalyCzas / 1000; // sekundy
  67. var min = s / 60; // minuty
  68. var h = min / 60; // godziny
  69.  
  70. var sLeft = Math.floor(s % 60); // pozostało sekund
  71. var minLeft = Math.floor(min % 60); // pozostało minut
  72. var hLeft = Math.floor(h); // pozostało godzin
  73.  
  74. if (minLeft < 10)
  75. minLeft = "0" + minLeft;
  76. if (sLeft < 10)
  77. sLeft = "0" + sLeft;
  78.  
  79. return hLeft + " : " + minLeft + " : " + sLeft;
  80. }
  81. else
  82. {
  83. return "Zakończone";
  84. }
  85.  
  86. }
  87.  
  88. window.onload = function()
  89. {
  90. idElement = "time";
  91. document.getElementById(idElement).innerHTML = czasDoWydarzenia(2012, 06, 19, 15, 46, 0, 0);
  92. setInterval("document.getElementById(idElement).innerHTML = czasDoWydarzenia(2012, 06, 19, 15, 46, 0, 0)", 1000);
  93. };
  94.  
  95.  
  96.  
  97.  
  98.  
  99. function clickbutton()
  100. {
  101. <?php
  102. $zapytanie_add_user = "INSERT INTO `users` values(NULL, '"."xxxx"."', '"."yyy"."', '"."zzzzzz"."', '"."dddd"."')";
  103.  
  104. // Odpowiedz
  105. $odpowiedz = mysql_query($zapytanie_add_user);
  106. if($odpowiedz > 0){
  107. echo 'Log zaapisany';
  108. }
  109. else{
  110. $pokaz_form=false;
  111. echo 'Problem z MySQL.';
  112. }
  113. ?>
  114. }
  115. </script>
  116. <?php
  117. mysql_close($database);
  118. ?>

Jednak kliknięcie nie dodaje w ogóle rekordów do bazy. Co zrobiłem nie tak?
Crozin
Przede wszystkim nie rozumiesz różnicy pomiędzy kodem wykonywanym po stronie serwera i po stronie klienta (przeglądarki) - https://www.google.com/search?sugexp=chrome...+vs+client-side
koxu1996
Chodzi ci może o to że dodawanie rekordu jest po stronie klienta a nie serwera? Jakbym chciał zrobić po stronie serwera to wystarczył by submit i w pliku sprawdzenie czy został wciśnięty przycisk. Tylko wtedy strona by się przeładowywała. A mi chodzi o to żeby zapisywać i wyświetlać logi w czasie rzeczywistym, co podobno da się w js. Jednak javascript nie obsługuje łączenia z bazą danych mysql. To jak u licha mam to zrobić na bazach żeby działało w czasie rzeczywistym?
markonix
Ajax to właśnie pomost pomiędzy JS a PHP.
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.