[PHP][MySQL} Licznik wyświetleń

0

Witam,
Jak zrobić licznik wyświetleń strony (a konkretniej - licznik, zliczający ile ludzi kliknęło w hiperlinka) z użyiem PHP i MySQL'a? Wkleił bym jakiś kod, żeby nie było, że idę na łatwiznę, lecz żadnego nie napisałem :) Nie mam wcale pomysłów jak to zrobić, w google też nic nie znalazłem. Pomożecie?

0

Link kieruje do skryptu php, ktory wysyła przekierowanie zliczając jednocześnie kliknięcie.

0
$redirectTo = $_GET['id'];
if (!is_numeric($redirectTo)) exit('lol');
$przekierujDo = mysql_fetch_row($mysql->query('SELECT link FROM przekierowania WHERE id = ' . $redirectTo));
$przekierujDo = $przekierujDo[0];

$mysql->query('UPDATE przekierowania SET klikniecia = klikniecia + 1 WHERE id ' . $redirectTo);
header('Location: ' . $przekierujDo);
exit();

To jest pseudokod oczywiście. W skrócie:

  1. User wywołuje skrypt zlicz.php?id=23
  2. Skrypt w pierwszym zapytaniu pobiera z bazy link jaki jest ukryty pod tym numerkiem
  3. W drugim zapytaniu zwiększa dla tego linku kliknięcia o 1.
  4. Potem za pomocą nagłówka przekierowuje na adres pobrany w punkcie #2
0

Dzięki :) Mógłbyś tylko wytłumaczyć, o co chodzi z tym "zlicz.php?id=23"?

0

Taki skrypt. A parametr ID przekazany metodą GET tak jak w 1 linii mojego przykładu.

0

Tak, tylko że w takim razie jak nazwać plik php? Po prostu zlicz.php?id=23?

0

Plik PHP sie nazywa po prostu zlicz.php. Tylko w przeglądarce mu nadajesz argument metodą GET.

Jeśli napiszesz np.:
lol.php?nazwa=dupa8&ident=1234
To w skrypcie lol.php będziesz miał zapisane:

$_GET['nazwa'] //będzie wynosiło dupa8
$_GET['ident'] //będzie wynosiło 1234

Taka metoda podawania danych do skryptu

0

Zdecyduj się. MySQL i MySQLi to nie to samo.

$mysql_query

Tu niepotrzebnie znaczek dolara. No i MUSISZ do cholery przekazać ten identyfikator.
Jeśli masz w tabeli:

+-----------------------------+
|ID |Link          |Kliknięcia|
|1  |lol.php       |0         |
|2  |omfg.php      |12        |
+-----------------------------+

I chcesz przekierować docelowo do pliku omfg.php to musisz dać:

<a href="zlicz.php?id=2">Link</a>
0

W porządku, już rozumiem jak to działa. Poprawiłem też kod:

     $redirectTo = $_GET['id'];
     $zapytanie = mysql_query("SELECT Link FROM Przekierowania WHERE ID = ".$redirectTo);
     $przekierowanie = mysql_fetch_row($zapytanie);
     $przekierowanie = $przekierowanie[0];
     mysql_query("UPDATE Przekierowania SET Kliknięcia = Kliknięcia + 1 WHERE ID = ".$redirectTo);
     header('Location: '.$przekierowanie);
     exit();

Tylko że wyskakuje jeszcze 1 błąd: Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource in /home/***/public_html/zlicz.php on line 12.

Wpisałem takie samo zapytanie w phpMyAdmin i wszystko działało dobrze, więc czemu tu nie działa?

0

Jeszcze trzeba takiej magicznej funkcji mysql_connect() użyć.

0

Użyłem tej magicznej funkcji tylko jej nie wklejałem, żeby za dużo danych nie zdradzać (nie chciało mi się cenzurować :)). No ale proszę bardzo, oto pełny kod:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>Skrypt PHP</title>
</head>
<body>
<?php
     $baza = mysqli_connect('host', 'root', 'haslo', 'baza') or die ("Nie moglem sie polaczyc z serwerem");
     $redirectTo = $_GET['id'];
     $zapytanie = mysql_query("SELECT Link FROM Przekierowania WHERE ID = ".$redirectTo);
     $przekierowanie = mysql_fetch_row($zapytanie);
     $przekierowanie = $przekierowanie[0];
     mysql_query("UPDATE Przekierowania SET Kliknięcia = Kliknięcia + 1 WHERE ID = ".$redirectTo);
     header('Location: '.$przekierowanie);
     exit();
?>
</body>
</html>

Co jest nie tak jeszcze że się błąd pokazuje?

0

<font size="5">Zdecyduj się. MySQL i MySQLi to nie to samo.</span>

Polecam usunięcie "i" z nazw funkcji.

0

Sorki, tyle razy ten skrypt kopiowałem i zmieniałem, że mi się już pokręciło tutaj. W każdym razie chodzi mi o ten wynik z funkcją mysql_connect, wkleje kod jeszcze raz:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>Skrypt PHP</title>
</head>
<body>
<?php
     $baza = mysql_connect('host', 'root', 'haslo', 'baza') or die ("Nie moglem sie polaczyc z serwerem");
     $redirectTo = $_GET['id'];
     $zapytanie = mysql_query("SELECT Link FROM Przekierowania WHERE ID = ".$redirectTo);
     $przekierowanie = mysql_fetch_row($zapytanie);
     $przekierowanie = $przekierowanie[0];
     mysql_query("UPDATE Przekierowania SET Kliknięcia = Kliknięcia + 1 WHERE ID = ".$redirectTo);
     header('Location: '.$przekierowanie);
     exit();
?>
</body>
</html>
0

Hmm... Walnij jeszcze:

$zapytanie = mysql_query("SELECT Link FROM Przekierowania WHERE ID = ".$redirectTo) or die(mysql_error());

I jeszcze jedno: ten skrypt nie zadziała, z powodu tego że twoje cholerne zamiłowanie do opatrywania wszystkich skryptów PHP w ładne tagi HTMLa będzie tu tylko przeszkadzać. Po co stronie przekierowującej tytuł, head i treść w body? Nagłówek location można wysłać (tak jak każdy inny) tylko zanim wyślesz jakiekolwiek dane do użytkownika. Czyli wstawienie jakiegokolwiek tekstu przed wywołaniem funkcji header() spowoduje że owa funkcja nie zadziała.

Jeśli mimo zmiany w skrypcie dalej mysql_fetch_row() będzie zwracał błąd - to znaczy że twoje zapytanie nie dopasowało się do żadnego rekordu w bazie, tj. nie ma rekordu o takim ID jakie podałeś metodą GET w skrypcie. Dla przykładu jeszcze raz wyjaśnię, że jeśli wywołasz skrypt tak:
zlicz.php?id=2
To w skrypcie $_GET['id'] będzie wynosić 2. Tak więc $redirectTo przepisane z tej zmiennej też będzie wynosić 2. W każdym razie jeśli nic nie podałeś w GET to chyba oczywiste że takie zapytanie:
SELECT Link FROM Przekierowania WHERE ID =
Nie dopasuje sie do niczego, albo dopasuje sie od wszystkiego.

0

Myślałem, że bez tagów HTML-a nie będzie działać, a tu okazuje się, że jest na odwrót :P Usunąłem je już.

Jak dodałem tę linijkę to pokazał się komunikat "No database selected". Sprawdziłem wszystkie dane, ale wszystko było dobrze. Zmieniłem kod tak:

$baza = mysql_connect('host', 'root', 'haslo') or die ("Nie moglem sie polaczyc z serwerem");
     mysql_select_db('baza');

i pokazuje się komunikat: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1

0

Zmień mysql_query na echo i powiedz co się pokaże na ekranie.

0

SELECT Link FROM Przekierowania WHERE ID =

Ta, czyli coś jest nie tak ze zmienną id.

*Umieściłem hiperlinki w tagach <form method="get" action="zlicz.php"> i już się wyświetla SELECT Link FROM Przekierowania WHERE ID = 1

Nie wiem, czy o to ci właśnie chodziło, ale ten błąd pokazuje się nadal.

0

prostytutka, tyle razy pisałem.
<a href="zlicz.php?id=1">Link</a>
I bez żadnych formów masz przekazanie metodą GET. To jest właśnie potęga metody GET że nie trzeba używać formularzy i można podać argumenty w adresie.

0

Wszystko działa jak zamieniłem MySQL na MySQLi :) Dzisiaj się po prostu dowiedziałem, że te dwie rzeczy się od siebie różnią :P

W kolumnie link mam http://jakaśstrona.jakaśdomena.com/strona.html. Jak klikam w hiperlinka to pokazuje się komunikat w przeglądarce:

Nastąpiło przekierowanie pod adres . Aby tam przejść, proszę kliknąć ten odnośnik.

W preferencjach można włączyć automatyczne przekierowywanie.

Automatyczne przekierowywanie mam zaznaczone. To w Operze. W firefoxie nie pokazuje się komunikat, po prostu jest białe tło, nic się nie otwiera.

Wkleje nowy kod:

<?php
     $baza = mysqli_connect('host', 'root', 'haslo', 'baza') or die ("Nie moglem sie polaczyc z serwerem");
     $redirectTo = $_GET['id'];
     $zapytanie = mysqli_query($baza, "SELECT Link FROM Przekierowania WHERE ID = ".$redirectTo);
     $przekierowanie = mysqli_num_rows($zapytanie);
     $przekierowanie = $przekierowanie[0];
     mysqli_query($baza, "UPDATE Przekierowania SET Kliknięcia = Kliknięcia + 1 WHERE ID = ".$redirectTo);
     header('Location: '.$przekierowanie);
     exit();
?>
0

mysqli_num_rows

Shit...

Czy ja nie napisałem mysql_fetch_row()? To co innego.

0

Tia...no ale to nic nie zmieniło, nadal nie działa.

0

To przedebuguj skrypt. Sprawdź co jest nie tak. Zamienienie nazw funkcji na echo() albo dodanie warunków tam gdzie trzeba nie jest trudne.

0

Nie wiem jak to możliwe, ale skrypt zadziałał, jak zmieniłem go w ten sposób:

<?php
     $baza = mysqli_connect('host', 'root', 'haslo', 'baza') or die ("Nie moglem sie polaczyc z serwerem");
     $redirectTo = $_GET['id'];
     $zapytanie = mysqli_query($baza, "SELECT Link FROM Przekierowania WHERE ID = ".$redirectTo);
     echo "SELECT Link FROM Przekierowania WHERE ID = ".$redirectTo;
     $przekierowanie = mysqli_fetch_row($zapytanie);
     $przekierowanie = $przekierowanie[0];
     mysqli_query($baza, "UPDATE Przekierowania SET Kliknięcia = Kliknięcia + 1 WHERE ID = ".$redirectTo);
     header('Location: '.$przekierowanie);
     exit();
?>

Teraz usunąłem linijkę z echo i też działa. Coś musiałem chyba w plikach pokręcić.

Tylko że nie zlicza kliknięć. W bazie cały czas jest 1.

0

Kliknięcia

MySQL przypadkiem zezwala na pola o nazwach z polskimi znakami?

0

Hmm, nie :P Dzięki, teraz działa :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1