Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Restrykcja pliku .php
Forum PHP.pl > Forum > Przedszkole
playdewu
Cześć.
Mam sobie skrypt:
  1. <?php
  2. $tablica = array(
  3. 0 => 'http://forum.php.pl',
  4. 1 => 'http://google.pl',
  5. 2 => 'http://wp.pl'
  6. );
  7.  
  8. $day = $row['last_day']; // w tej zmiennej zakładam, że masz ostatni numer dnia tygodnia, zgodny z funkcją date(), czyli 0 (dla Niedzieli) aż do 6 (dla
  9.  
  10. Soboty).
  11. if ( $day !== date("w", time()) )
  12. {
  13. echo '<center><a href="'.$tablica[(date("w", time()))].'" id="loading-link" TARGET="_blank"><img src="images/webshop/KT.png"></a></center>';
  14. $sql = "update ..."; // tutaj aktualizujesz tą zmienną $day, na obecny dzień, pobierasz ją z tej funkcji: date("w", time())
  15. }
  16. ?>

Skrypt ten co dzień aktualizuje wartość href pobierając ją z $tablicy.

I teraz dwa pytania:
1. Jak nadać takiemu odnośnikowi dzienny limit wejść? (osoba może wejść w dany odnośnik tylko raz dziennie, potem odnośnik się "blokuje")
2. Jak nadać sprawdzanie czy osoba jest zalogowana? Jeżeli niezalogowana, nie może zobaczyć treści danego skryptu.

Forum stoi na systemie plików phpBB by Przemo 1.12.7.
Będę niezmiernie wdzięczny za pomoc, jest mi to bardzo potrzebne.
Michael2318
Ad. 2:

  1. if ( $userdata['session_logged_in'] )
  2. {
  3. echo 'osoba jest zalogowana, pokaż jej ten skrypt tutaj';
  4. }
  5. else
  6. {
  7. echo 'Nie jesteś zalogowany! Zaloguj się: <a href="login.php">CLICK</a>';


Ad. 1:

Po kliknięciu w odnośnik twórz ciastko - funkcja setcookie - i potem przy klikaniu sprawdzaj czy ciacho istnieje - jeśli tak to odrzucaj próbę kliknięcia w link. Możesz do tego celu wykorzystać evercookies (google -> javascript evercookies). Jeśli to jest tylko dla zalogowanych użytkowników - w tabeli z userami stwórz pole tinyint(1) NOT NULL DEFAULT 0. Po kliknięciu w link aktualizuj pole na wartość 1 i jeśli to pole dla danego usera jest równe 1 - odrzucaj jego "kliknięcie".

Do tego należałoby zapisywać czas, kiedy to pole zostało zaktualizowane na wartość 1. Potem odbierasz ten czas i sprawdzasz czy to ten sam dzień na podstawie czasu czy też nie. Jeśli nie to aktualizuj po zalogowaniu usera, to pole na wartość 0 z powrotem.

EDIT:

Albo po prostu stwórz jedno pole z samym czasem: int(11) NOT NULL i po kliknięciu pchaj tam czas. Przy próbie kliknięcia w link, pobieraj od usera ten czas i rób taki warunek:

  1. if ( ($row['last_clicked']+86400) < time())
  2. {
  3. // zezwalasz na kliknięcie bo od ostatniego kliknięcia mineło wiecej niz 24h
  4. // pamiętaj tez o aktualizacji pola z czasem na czas obecny
  5. }
  6. else
  7. {
  8. die('odczekaj 24h od ostatniego klikniecia'); // wysiwetlasz blad bo minelo mniej niz 24h
  9. }
by_ikar
Nie wiem szczerze jak to jest z autoryzacją i sesją rozwiązane w phpBB, ale generalnie jeżeli chcesz robić limit dla użytkownika, to musiałbyś zrobić osobną tabelę w bazie danych, i do tej tabeli musiałbyś wrzucać dane (insert) po każdym kliknięciu. A przed każdym wyświetleniem linku sprawdzać czy dla danego linku "kliknięcie" już istnieje w bazie. Więc dla linków również musiałbyś zrobić tabelkę. Nie pokaże ci jakby to mogło wyglądać w phpBB, mogę ci pokazać jak to będzie mogło wyglądać w sql, a twoim zadaniem będzie dostosowanie sobie tego.

Tabela links:

Kod
CREATE TABLE links (
  id int unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,
  day tinyint unsigned NOT NULL,
  link varchar(255) NOT NULL
);


tabela user_clicks:

Kod
CREATE TABLE user_clicks_as (
  id int unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,
  link_id int unsigned NOT NULL,
  user_id int unsigned NOT NULL,
  date timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
);


zapytanie które pobiera link na dzisiaj, zakładając że masz tylko 7 linków w tabeli (dlatego kolumna day, a nie timestamp):

Kod
SELECT l.* FROM links AS l JOIN user_clicks AS uc ON l.day=DAYOFWEEK(NOW()) WHERE CURDATE() = DATE(uc.date)


Takie zapytanie zwróci ci wynik tylko wtedy kiedy użytkownik kliknął danego dnia. Więc łatwo możesz na tej podstawie oszacować czy użytkownik kliknął w dany link z dnia tygodnia, danego dnia.

Najlepiej jakbyś całość umieścił w osobnym pliku. Wtedy przekierowanie miałbyś bezpośrednio w tym pliku, link mógłby być aktywny, ale przekierowywałbyś w przypadku kiedy ktoś już dzisiaj kliknął, na jakaś stronę z komunikatem. No generalnie można to rozwiązać na kilka sposobów, to jest jeden ze sposobów który przyszedł mi do głowy.

EDIT: musisz wziąć pod uwagę że DAYOFWEEK działa podobnie jak date('w'). Podobieństwo ogranicza się do dnia tygodnia od którego zaczyna się liczenie (od niedzieli do soboty), z tym że niedziela=1 a nie jak w przypadku date('w') gdzie niedziela to jest 0.
playdewu
Nie ma to jak pomoc od dwóch najlepszych wink.gif

Ad. 2 działa, natomiast jeżeli o ciasteczka chodzi nie mam pojęcia jak się do tego zabrać, nigdy się tym nie bawiłem.
Mimo, że poczytałem trochę na ich temat to nadal nie wiem jak je wykorzystać aby osiągnąć efekt.

Mógłbym prosić o jakąś prostą instrukcję?

@EDIT
Dałoby radę zrobić coś takiego na podstawie adresu IP? Tzn, że użytkownik będzie mógł wejść w link 1 raz dziennie.
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.