Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL]update odporne na odświeżanie
Forum PHP.pl > Forum > Przedszkole
Pcbecaw
Mam coś takiego:
  1. $wynik = mysql_query("UPDATE newsy SET uni = uni + 1 WHERE id = '14' LIMIT 1")
  2. or die('Błąd zapytania');

Dałoby radę zrobić to odporne na odświeżanie?
Ulysess
ale ta odporność ile by trwała questionmark.gif mógłbyś zrobić dodatkowe pole w którym trzymał byś date ost update , przy próbie aktualizacji sprawdzał byś czy data ostatniej aktualizacja spełnia twój warunek czyli minęło np 24h jeśli tak to wykonuje się update
Pcbecaw
Z Twojej wypowiedzi zrozumiałem, iż powinienem zrobić nowe pole (INT), do przetrzymywania update z bazy, ale jak zmodyfikować ten warunek tak, żeby sprawdzało datę ostatniej aktualizacji?
pablo_83
nie int tylko typ date lub datetime i przy aktualizacji wstawiasz aktualną datę a przy kolejnym update pobierasz ją porównujesz do aktualnej i jeśli minęło np 24h to robisz update
Pcbecaw
Czyli tak:
robię pole o nazwie "x", typ pola: DATE i teraz nie rozumiem Twojego sformułowania "wstawiasz aktualną datę". Co dokładniej masz na myśli?
"przy kolejnym update pobierasz ją" - czyli robię ifa? Eh,.. nie rozumiem.
Ulysess
dodaje pole typu int , przechowuj w nim w psotaci unix (w php funkcja time();

pobierasz wpierw date ostatniej aktulizacji

  1. SELECT ost_aktulizacja FROM tabela WHERE id = 14 LIMIT 1


następnie
  1. if($rekord['ost_aktulizacja'] > (time-3600))
  2. {
  3. UPDATE newsy SET uni = uni + 1,ost_aktulizacja = ".time()." WHERE id = '14' LIMIT 1
  4. }


nie jest pewnie czy dobrze napisałem warunek ale chodziło mi że zapytanie wykonuje się wtedy gdy czas z bazy jest wiekśzy od aktualnej godziny-1
pablo_83
tworzysz kolumnę data_aktualizacji

  1. $wynik = mysql_query("UPDATE newsy SET uni = uni, data_aktualizacji = date("Y-m-d H:i:s")");


to wstawia Ci datę aktualizacji, jeśli potem będziesz chciał zrobić kolejną aktualizację to robisz selecta

  1. $sprawdz_date = Select data_aktualizacji FROM newsy where id_newsa = id_newsa_ktory_chcesz_aktualizowac;
  2.  


i teraz warunek

  1. $data = date("Y-m-d H:i:s") + 24h
  2.  
  3. if($sprawdz_data >= $data ){
  4. //twój update
  5. $wynik = mysql_query("UPDATE newsy SET uni = uni, data_aktualizacji = date("Y-m-d H:i:s")");
  6. }
  7.  


kod jest czysto poglądowy więc musisz go przystosować do siebie
Pcbecaw
Ja chciałbym zrobić tak, że każdy kto raz obejrzy newsa, to po odświeżeniu nie doda już +1 do odsłon przez 24h. Chyba źle wytłumaczyłem problem. Jak zrobić coś takiego?
pablo_83
to co Ci napisałem to właśnie to robi, jedyne co dotyczy użytkowników, musisz ich w jakiś sposób identyfikować musisz dodać jeszcze kolumnę users, jeśli są to użytkownicy zalogowani to w tabeli wstawiasz ich id_user.

w warunku if później sprawdzasz czy user o danym id w czasie krótszym niż 24 h głosował.

Jeśli nie masz zalogowanych użytkowników, to pozostaje Ci albo ciastko albo IP
w przypadku IP do bazy wstawiasz IP użytkownika i tak samo jak wyżej pózniej sprawdzasz, jeśli ciastko to dane przechowujesz w sesji
Ulysess
to ja bym zrobił dla tych co oddali głos oddzielna w ogóle tabele w której bym umieścił ID usera,id_newsa,data_aktulizacji

przy naciśnięciu +1 sprawdzało by czy w ogóle istnieje dla tego usera i tego newsa rekord w tej tabeli , jeśli nie dodawany jest i dodawane jet w innej uni +1 a w przypadku jeśli już jest sprawdzasz czy data jest większa od 24 godzin , jeśli tak robisz aktualizacje i uni +1 wink.gif
Pcbecaw
To nie jest glosowanie, tylko zwykłe odsłony biggrin.gif
Po prostu ktoś wchodzi na danego newsa i przy tym wejściu automatycznie dodawana jest odslona. Chciałem tylko to zablokować na 24h, że jak ktoś naciśnie odśwież, to już nie doda +1 do bazy.

Jak zmodyfikować tą linijkę, żeby zapisywało IP danego użytkownika i blokowało dodawanie +1 odsłon na 24h?

Nieaktualne - to przecież nie ma sensu...
Jak ktoś kombinuje, to i tak wykombinuje na niekorzyść.
Magic WWW
Najlepszy sposób i mało obciążający bazę danych to ciasteczka smile.gif

  1. if(!isset($_COOKIE['visit']))
  2. {
  3. $result = mysql_query(...);
  4. setcookie('visit', $_SERVER['REMOTE_ADDR'], $_SERVER['REQUEST_TIME'] + 86400);
  5. }
Pcbecaw
Ciasteczka do usunięcia w sekunde i już zabezpieczenie szlag trafia. Szkoda w sumie, że nie można skutecznie się obronić przed niechcianymi gośćmi.
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.