Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL] referer zabezpieczenie przed...
Forum PHP.pl > Forum > Przedszkole
bl4ck_b0x
Witam.

Mam problem ponieważ tworzę coś w stylu "linków polecających" które będą dodawać pkt dla usera po którego linku (polecajacym) ktoś trafi na stronę ale aby zabezpieczyć to przed "nabijaniem" takich punktów chciałem stworzyć dość proste zabezpieczenie (ip, data).

Struktura bazy:

Kod
+referer
-ip
-data (YYYY-MM-DD)


Oto kod całego pliku referer.php:

  1. <?
  2. include('config.php');
  3. if(isset($_GET['p']))
  4. {
  5. $ip=$_SERVER['REMOTE_ADDR'];
  6. $data=date('Y:m:d');
  7. $p=intval($_GET['p']);
  8. $pkt=10;
  9. $query=mysql_query('SELECT r.ip, r.data, u.pkt FROM referer r, uzytkownicy u');
  10. while($result=mysql_fetch_array($query))
  11. {
  12. if(($ip==$result['ip'])&&($data==$result['data']))
  13. {
  14. echo 'Dzisiaj już pomogłeś temu użytkownikowi.';
  15. }
  16. elseif(($ip==$result['ip'])&&($data!==$result['data']))
  17. {
  18. $wynik=$result['pkt']+$pkt;
  19. mysql_query('UPDATE uzytkownicy SET pkt='.$wynik.'');
  20. mysql_query('INSERT INTO referer(ip,data) VALUES("'.$ip.'","'.$data.'")');
  21. echo 'Dodano punkty.';
  22. }
  23. else
  24. {
  25. $wynik=$result['pkt']+$pkt;
  26. mysql_query('UPDATE uzytkownicy SET pkt='.$wynik.'');
  27. mysql_query('INSERT INTO referer(ip,data) VALUES("'.$ip.'","'.$data.'")');
  28. echo 'Dodano punkty.';
  29. }
  30. }
  31. }
  32. else
  33. {
  34. echo 'Brak poleconego.';
  35. }
  36. ?>


Bardzo proszę o pomoc bo nic sie nie wyświetla, ciągle jest biała strona. mysql_error(); także nic nie wyświetlił.
potreb
Może dodaj do zapytania or die(mysql_error());
  1. <?php
  2. &&($data!==$result['data']))
  3. ?>


Powinno byc:

  1. <?php
  2. &&($data!=$result['data']))
  3. ?>


Zresztą nie wiem do czego ci ten warunek else if, skoro stworzyłeś już if-a, który sprawdza czy dany user nie głosował już.
bl4ck_b0x
Hmm co najdziwniejsze nic nie umieszcza w bazie... w ogóle zrobiłem w while echo 'a'; żeby sprawdzić czy działa w ogóle while i niestety nie działa :/
erix
Ale po co tak komplikować...?

  1. <?php
  2. $data=date('Y:m:d');
  3. $p=intval($_GET['p']);
  4. $pkt=10;
  5. $query=mysql_query('SELECT r.ip, r.data, u.pkt FROM referer r, uzytkownicy u');
  6. ?>


Nie możesz zrobić zapytania, które bezpośrednio wyciąga konkretnego użytkownika, tylko przerabiasz całą tabelę...?

Dorzuć WHERE na sprawdzaniu adresu IP gościa.

Potem sprawdzasz, czy są rekordy, jeśli są - sprawdzasz datę i ifem, jeśli się zgadza - komunikat, że było, w przeciwnym wypadku - dodaj do bazy.

  1. <?php
  2. elseif(($ip==$result['ip'])&&($data!==$result['data']))
  3. {
  4. $wynik=$result['pkt']+$pkt;
  5. mysql_query('UPDATE uzytkownicy SET pkt='.$wynik.'');
  6. mysql_query('INSERT INTO referer(ip,data) VALUES("'.$ip.'","'.$data.'")');
  7. echo 'Dodano punkty.';
  8. }
  9. else
  10. {
  11. $wynik=$result['pkt']+$pkt;
  12. mysql_query('UPDATE uzytkownicy SET pkt='.$wynik.'');
  13. mysql_query('INSERT INTO referer(ip,data) VALUES("'.$ip.'","'.$data.'")');
  14. echo 'Dodano punkty.';
  15. }
  16. ?>


Po co Ci dwa razy ten sam kawałek kodu w różnych warunkach, skoro równie dobrze wystarczy Ci samo else...?
bl4ck_b0x
właśnie chodzi o to, że z tabeli użytkownicy wyciągam tylko ilość pkt a punkty będą dodawane przez gości dlatego chce żeby było to zapisywane na bazie (data,ip) nastepnie sprawdzanie czy istnieje takie ip, nastepnie jesli istnieje ale punkty dodawal 24 godziny temu (czyli dzien wczesniej) to powinno sie dodac, jesli nie to wyswietla ze juz zostaly dodane punkty.

p.s.
sprawdze to co napisales (przerobie to pod ten skrypt)
erix
No, ja rozumiem, ale po co przeskakujesz wszystkie rekordy via PHP za każdym razem, skoro możesz skonstruować odpowiednie zapytanie...?
bl4ck_b0x
ok mam takie zapytanie

  1. <?php
  2. $query=mysql_query('SELECT r.ip, r.data, u.pkt FROM referer r, uzytkownicy u WHERE r.ip="'.$ip.'"');
  3. ?>


ale nadal nie dziala.. ;/ cholera nie wiem co jest nie tak...
erix
Cytat
ale nadal nie dziala.. ;/

Nie siedzę przed Twoim komputerem i nie wiem, w jaki sposób "nie działa"...

Zwraca jakiekolwiek rekordy? Wysypuje system? Zawiesza interpreter, nic nie robi, może wysypał fusy po Twojej kawie? tongue.gif
bl4ck_b0x
dobra bez jaj haha.gif po prostu jest cała biała strona, tak jakby while w ogóle nie działało...
potreb
Wklej swój poprawiony kod. Daj na początku skryptu error_reporting(E_ALL);
bl4ck_b0x
kodzik:

  1. <?
  2. include('config.php');
  3. if(isset($_GET['p']))
  4. {
  5. $ip=$_SERVER['REMOTE_ADDR'];
  6. $data=date('Y:m:d');
  7. $p=intval($_GET['p']);
  8. $pkt=10;
  9. $query = mysql_query('SELECT r.ip, r.data, u.pkt FROM referer r, uzytkownicy u') or die (mysql_error());
  10. while($result=mysql_fetch_array($query))
  11. {
  12. if(($ip==$result['ip'])&&($data==$result['data']))
  13. {
  14. echo 'Dzisiaj już pomogłeś temu użytkownikowi.';
  15. }
  16. else
  17. {
  18. $wynik=$result['pkt']+$pkt;
  19. mysql_query('UPDATE uzytkownicy SET pkt='.$wynik.'');
  20. mysql_query('INSERT INTO referer(ip,data) VALUES("'.$ip.'","'.$data.'")');
  21. echo 'Dodano punkty.';
  22. }
  23. }
  24. }
  25. else
  26. {
  27. echo 'Brak poleconego.';
  28. }
  29. ?>



p.s.
jesli jest w zapytaniu WHERE r.ip="'.$ip.'" to i tak nie działa...
erix
Ok, trywialne pytanie, ale jak Ty ten skrypt wywołujesz?

Daj
  1. <?php
  2. ?>
dla $query po:
  1. <?php
  2. $query = mysql_query('SELECT r.ip, r.data, u.pkt FROM referer r, uzytkownicy u') or die (mysql_error());
  3. ?>
bl4ck_b0x
var_dump wywalił mi coś takiego:

resource(4) of type (mysql result)

A skrypt wywołuje normlanie na localhost: http://localhost/~sklepik/referer.php?p=1

p <- p jest potrzebne jako określenie id uzytkownika bo chce dodawać PKT do konkretnego uzytkownika (sugerujac sie id)
erix
Ja nie mogę, dopiero teraz wpadłem...

Uwzględnij w nazwach kolumn ($result) nazwy tabel, np:

  1. <?php
  2. //zamiast:
  3. $wynik=$result['pkt']+$pkt;
  4. //to:
  5. $wynik=$result['u.pkt']+$pkt;
  6. ?>
bl4ck_b0x
dalej to samo ;/ juz nie mam sil do tego skryptu..
erix
A zmieniłeś analogicznie w pozostałych miejscach skryptu?

Jak tak, to
  1. <?php
  2. ?>
na $result w pętli...
bl4ck_b0x
zobacz:

  1. <?
  2. include('config.php');
  3. if(isset($_GET['p']))
  4. {
  5. $ip=$_SERVER['REMOTE_ADDR'];
  6. $data=date('Y:m:d');
  7. $p=intval($_GET['p']);
  8. $pkt=10;
  9. $query = mysql_query('SELECT r.ip, r.data, u.id_uzytkownika, u.pkt FROM referer r, uzytkownicy u') or die (mysql_error());
  10. while($result=mysql_fetch_array($query))
  11. {
  12. var_dump($result);
  13. if(($ip==$result['ip'])&&($data==$result['data']))
  14. {
  15. echo 'Dzisiaj już pomogłeś temu użytkownikowi.';
  16. }
  17. else
  18. {
  19. $wynik=$result['u.pkt']+$pkt;
  20. mysql_query('UPDATE uzytkownicy u SET u.pkt='.$wynik.' WHERE u.id_uzytkownika="'.$p.'"');
  21. mysql_query('INSERT INTO referer(ip,data) VALUES("'.$ip.'","'.$data.'")');
  22. echo 'Dodano punkty.';
  23. }
  24. }
  25. }
  26. else
  27. {
  28. echo 'Brak poleconego.';
  29. }
  30. ?>


ciagle biala strona...
mike
Ustawienie:
  1. <?php
  2. ?>
nie załatwia sprawy. Warto sobie uświadomić, że dzięki temu błędy będą raportowane a to nie znaczy wyświetlane. Raportować można na wiele sposobów.
Aby błędy wyświetliły się na stronie należy dodać:
  1. <?php
  2. ini_set('display_errors', 1);
  3. ?>


To tak OT :-)

Poza tym funkcja mysql_fetch_array() wyrzuci błąd jeśli zapytanie nie zwróci żadnych wyników.
Zanim przekażesz uchwyt do wyników do tej funkcji sprawdź czy są wyniki: mysql_num_rows()
bl4ck_b0x
mysql_num_rows wywala mi 0. a co do tego ini_set('display_errors', 1); to nic sie niewyswietla...
mike
Cytat(bl4ck_b0x @ 21.05.2008, 10:32:04 ) *
mysql_num_rows wywala mi 0.
No to po sprawie. Jeśli jest zero to przeskakujesz pętlę while a jeśli więcej niż zero to do niej wchodzisz. Nie możesz korzystać z mysql_fetch_* jeśli jest zero wyników.

Cytat(bl4ck_b0x @ 21.05.2008, 10:32:04 ) *
a co do tego ini_set('display_errors', 1); to nic sie niewyswietla...
No to masz coś nie tak z ustawieniami serwera. Napisanie na początku:
  1. <?php
  2. ini_set('display_errors', 1);
  3. ?>
zwyczajowo wystarcza żeby zobaczyć błędy.
bl4ck_b0x
no wlasnie nic nie wyswietla winksmiley.jpg a co do ustawień serwera to jest to localhost... zawsze wszystko działało poprawnie (wczoraj był format).
nospor
Cytat
mysql_num_rows wywala mi 0
nie masz wiec rekordow. Omijasz wiec wszystkie echo jakie miales w petli wiec nic ci sie nie wyswietla. Oczywiste.

Cytat
No to masz coś nie tak z ustawieniami serwera. Napisanie na początku:
Jesli nie ma zadnego bledu to i raczej nic sie nie wyswietli winksmiley.jpg ustawienia serwera tu na nic.
bl4ck_b0x
no wlasnie wiec jak to inaczej napisac aby mi to sprawnie działało?
mike
Cytat(bl4ck_b0x @ 21.05.2008, 10:44:46 ) *
no wlasnie wiec jak to inaczej napisac aby mi to sprawnie działało?
A czy mi piszemy po chińsku że jeszcze nie wiesz jak to napisać?
Uwaga tłumaczę:

Jeśli nie jest zero wyników, to wejdź do pętli w przeciwnym wypadku wyświetl, że jest zero wyników.
nospor
Przeczytalem temat od poczatku. Przeciez tu jest taki blad logiczny ze glowa mala.

Wkladasz referera tylko i wylacznie w petli. Petla leci po rekordach. Ale na samym poczatku rekordow nie ma wogole wiec nigdy nie wejdziesz do petli i nigdy nic nie dodasz i kolko sie zamyka. Gdzie tu jakas logika?
bl4ck_b0x
fakt...... :/ nie pomyślałem o tym.....ehhhhh
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.