[php/mysql] Licznik on-line



Pobieranie 99,74 Kb.
Data03.04.2018
Rozmiar99,74 Kb.

[php/mysql] Licznik on-line


Chyba każdy webmaster zauważył, że na stronach coraz częściej pojawiają się liczniki gości aktualnie oglądających stronę - jest to ciekawy "bajer". Jeśli ktoś próbował ściągać gotowe skrypty, to pewnie zauważył, że one bardzo często nie działają, a niektóre podają losową liczbę - to raczej kiepskie rozwiązanie, a kiedyś pisałem w PHP stronę szkolną i postanowiłem napisać licznik gości on-line, skrypt wyszedł bardzo dobrze, bo to tylko jedna krótka funkcja, która zwraca wynik. Oto kod wraz z komentarzami:

if (!session_is_registered('count')) {

session_start();

session_register('count');

$count = 0;

}

else {



$count++;

}

/* Rozpocząłem sesje i zarejestrowałem zmienną $count. */



?>

$conn = mysql_connect("localhost", "user", "password");

mysql_select_db("baza", $conn);

// to było połączenie się z MySQL

function stats($mojeip)// argumentem jest tutaj IP, ale możesz zmienić na identyfikator sesji

{

global $conn;



global $count;

// globalizacja zmiennych, aby ich wartość była dostępna w funkcji

$teraz = time();

// pobiera czas

if ($count == 0) // sprawdza, czy ma wstawić nowy rekord do tabeli

{

$res = mysql_query("INSERT INTO temp VALUES ('$mojeip', '$teraz')", $conn);



// wstawienie nowego rekordu

}

$res = mysql_query("UPDATE `temp` SET `czas` = '".$teraz."' WHERE `ip` = '".$mojeip."' LIMIT 1'", $conn);



// a teraz uaktualnienie naszego rekordu

$res = mysql_query("SELECT * FROM temp", $conn);

// wybieramy wszystko z tabeli temp

for ($i=0; $myrow=mysql_fetch_assoc($res); $i++)

{

$ip = $myrow['ip'];



$czass= $myrow['czas'];

if ($czass < ($teraz - 600))

{

$pyt=mysql_query("DELETE from temp where ip='$ip'", $conn);



$i--;

}

/* W pętli sprawdziliśmy, czy czasy użytkowników są mniejsze niż 10 min (600 sek), jeśli nie to kasujemy go z tabeli */



}

if ($i==0)

{

$res = mysql_query("INSERT INTO temp VALUES ('$mojeip', '$teraz')", $conn);



// jeśli ktoś nas skasował, to musimy się dodać, bo liczba userów nie może być równa 0!

$i++;


}

return $i;

// zwracamy wartość

}

?>



Aby wywołać tą funkcje wstaw na stronie ten kod:

echo(stats($REMOTE_ADDR));

?>

lub:


echo(stats(SID));

?>

W obydwu przypadkach powinno działać. To już koniec, tego skryptu możecie używać do woli oczywiście


[php/mysql] Sesje (ang. session) w PHP ile użytkownik spędził już czasu na naszej stronie


Pewnie każdy wie czym są sesje, ale dla pewności pozwolę sobie zacytować wstęp z manuala na temat sesji:

"Obsługa sesji w PHP ma na celu zapewnienie sposobu na zachowanie pewnych danych w trakcie następujących po sobie wywołań strony. Pozwala to na budowanie bardziej spersonalizowanych aplikacji i zwiększenie atrakcyjności twojej strony internetowej."

W poradzie tej przedstawię obsługę sesji (raczej wstęp do sesji) na podstawie skryptu, który będzie informował użytkownika ile spędził już czasu na naszej stronie.

Na początku stwórzmy plik czas.php i wprowadźmy do niego taki kod:



session_start();

if (!isset($_SESSION['czas']))

{

$_SESSION['czas'] = strtotime ("now");



$ile = 0;

}

else



{

$ile = (strtotime("now") - $_SESSION['czas']) / 60;

settype($ile, "int");

}

?>



Funkcja session_start() uruchamia sesje lub je wznawia, musi się ona poprzedzać używanie zmiennych sesyjnych($_SESSION).

Następnie sprawdzamy czy zmienna sesyjna o kluczu "czas"; istnieje. Jeśli nie to tworzymy ją i przypisujemy jej aktualny czas w formie uniksowego znacznika czasu (ilość sekund od daty 1 stycznia 1970r.) - strtotime ("now").

W przeciwnym wypadku sprawdzamy ile czasu upłynęło w sekundach od wejścia użytkownika na naszą stronę i zmieniamy typ zmiennej $ile. Zmiana typu jest potrzebna, aby pozbyć się wartości po przecinku podczas dzielenia przez 60 (ilość sekund w minucie).

Teraz musimy zaincludować na początku wszystkich naszych podstron serwisu plik czas.php i w miejscu gdzie chcemy, aby był wyświetlany tekst o czasie przebywanie powinniśmy umieścić kod:



Rozumiem, że jest to troszkę mało... ale sądzę że jest to dobre wprowadzenie :)


[php/mysql] Zabezpieczenie strony hasłem


Aby if ((!isset($_SERVER['PHP_AUTH_USER'])) OR (!isset($_SERVER['PHP_AUTH_PW'])))

{

header('WWW-Authenticate: Basic realm="Private"');



header('HTTP/1.0 401 Unauthorized');

exit;


} else {

if (($_SERVER['PHP_AUTH_USER'] == "webmaster") AND ($_SERVER['PHP_AUTH_PW'] == "webmade")) {

echo "Autoryzacja zakończyła sie powodzeniem";

/* miejsce, w którym ma znaleźć się treść strony zabezpieczona hasłem */

} else {

echo "Autoryzacja zakończyła sie niepowodzeniem";

/* miejsce, w którym ma znaleźć się treść strony widoczna po błędnym wprowadzeniu danych */

}

}



?>

zabezpieczyć stronę hasłem możemy skorzystać z poniższego skryptu

Pierwszy warunek odpowiada za sprawdzenie czy zmienne $_SERVER['PHP_AUTH_USER'] oraz $_SERVER['PHP_AUTH_PW'] istnieją. Jeśli nie to są wysyłane nagłówki do przeglądarki za pomocą funkcji header(), które zainicjują monit z informacjo o padniu login'u i hasła. Należy pamiętać ze funkja header() musi zostać wywołana przed jakimikolwiek informacjami wysyłanymi do przeglądarki.

Dane podane w monicie są przechowywane w zmiennych $_SERVER['PHP_AUTH_USER'], (login) i $_SERVER['PHP_AUTH_PW'] (hasło). Ostatni warunek to sprawdzenie czy wpisane dane są poprawne.


[php/mysql] Biblioteka GD


GD jest biblioteką graficzną służącą do dynamicznej manipulacji obrazami. Jej głównym twórcą jest Thomas Boutell. Dzięki niej można tworzyć obrazy w formatach GIF, JPEG, PNG i BMP. GD obsługuje m.in. takie języki programowania jak C, PHP, Perl, OCaml, Tcl, Pascal czy REXX.

Biblioteka jest udostępniana na zasadach Open Source,a jej oficjalna strona znajduje się pod adresem http://www.boutell.com/gd/ (źródło wikipedia.pl)

Aby sprawdzić czy biblioteka GD jest załadowana użyjemy funkcji extension_loaded(), która zwraca dwie wartości, TRUE - gdy jest załadowana oraz FASLE - w innym przypadku. Jej argumentem jest nazwa biblioteki.

Możemy również spróbować załadować GD za pomocą funkcji dl(), której argumentem jest nazwa pliku biblioteki. Należy jednak pamiętać o tym, że w zależności od platformy jej nazwa może się różnić.

Poniżej znajduje się skrypt, który sprawdza czy biblioteka GD jest załadowana. Jeśli tak nie jest spróbuje ja załadować.

if (!extension_loaded('gd'))

if (!dl('gd.so')

echo "Nie mogę odnaleźć bibioteki GD!";

?>

W celu zgromadzenie większej ilości informacji na temat biblioteki załadowanej na serwerze skorzystamy z funkcji gd_info().



print_r(pg_info());

?>

Niestety nie jest ona zbyt czytelna. Dlatego wykorzystamy krótki skrypt, który nam to wszystko rozjaśni:



$gd = gd_info();

foreach($gd as $klucz => $wartosc) {

if ($wartosc == '1') $wartosc = 'tak';

elseif ($wartosc == '0') $wartosc = 'nie';

else $wartosc = ''.$wartosc.'';

echo $klucz.': '.$wartosc.'
';

}

?>



To wszystko. Zapraszam również do przeglądania porad dotyczących pracy z biblioteką GD.

[php/mysql] Lista plików


Przypuśćmy, że w lokalizacji której mamy plik z kodem php znajduje się folder 'gfx' w którym mamy zbór grafik. Chcemy stworzyć listę tych plików – sprawa nie jest dość skomplikowana:

$folder = dir('gfx');

echo '

    ';

    while($plik = $folder->read()) echo '

  • ' .$plik. '
  • ';

    echo '

';

$folder->close();

?>

My jednak spróbujemy czegoś trudniejszego - podzielić je według typu... kod takiego skryptu może(jest zapewne dużo innych rozwiązań tego problemu) wyglądać tak:



$folder = dir('gfx');

while($plik = $folder->read()) {

if (($plik != '.') AND ($plik != '..')) {

$nazwa = pathinfo($plik);

$pliki[$nazwa['basename']] = $nazwa['extension'];

$dodaj = true;

for($i=0;$i

if ($typ[$i] == $nazwa['extension']) $dodaj = false;

if ($dodaj == true) $typ[] = $nazwa['extension'];

}

}

$folder->close();



for($i=0;$i

echo '

    '.$typ[$i];

    foreach($pliki as $klucz => $wartosc)

    if ($wartosc == $typ[$i]) echo '

  • ' .$klucz. '
  • ';

    echo '

';

}

?>



Pierwsza cześć nie wiele różni się od wcześniejszego. Otwieramy wybrany folder i go przeszukujemy z pomocą pętli while. Dalsza część to już inna bajka...

if (($plik != '.') AND ($plik != '..')) {

[...]

}

Warunek ten pomija 'linki' do folderów wyżej.



$nazwa = pathinfo($plik);

$pliki[$nazwa['basename']] = $nazwa['extension'];

Funkcja pathinfo() tworzy tablicę o trzech kluczach


  • $path_parts['dirname'] – scieżka do pliku (bez nazwy)

  • $path_parts['basename'] – nazwa pliku

  • $path_parts['extension'] – rozszerzenie

Korzystając z tej funkcji tworzymy własna tablicę $pliki o kluczu 'nazwa pliku' i wartościach 'rozszerzenie'.

$dodaj = true;

for($i=0;$i

if ($typ[$i] == $nazwa['extension']) $dodaj = false;

if ($dodaj == true) $typ[] = $nazwa['extension'];

W tablicy $typ przechowujemy nazwy rozszerzeń. Powyższy kod sprawdza czy dany typ znajduje się w tablicy. Jeśli tak nie jest zostaje on dopisany do tablicy.

Po zamknięciu folderu wyświetlamy dane za pomocą pętli for i konstrukcji foreach.

for($i=0;$i

echo '

    '.$typ[$i];

    foreach($pliki as $klucz => $wartosc)

    if ($wartosc == $typ[$i]) echo '

  • ' .$klucz. '
  • ';

    echo '

';

}

Dzięki pętli for przeglądamy tablicę $typ, zaś konstrukcja foreach przychodzi nam z pomocą przy pobieraniu kluczy i wartości tablicy $pliki.


[php/mysql] Upload plików


Upload plików za pomocą PHP jest dość prostą operacją, ale potrafi sprawić dużo kłopotów początkującym programistą. Spróbuję w jasny sposób przedstawić to zagadnienie.

Stwórzmy plik form.php, gdzie będzie się znajdował nasz formularz przez który będą wysyłane pliki na serwer.

[...]



/* maksymalna wielkość pliku w bajtach */

Plik do wysłania:





[...]


Atrybut action odpowiada za lokalizację pliku do którego mają zostać wysłane dane na temat pliku. W naszym przypadku jest to plik w tym samym folderze - upload.php, do którego wprowadzamy kod:

$location = 'c:/usr/krasnal/www/upload/' . basename($_FILES['userfile']['name']);

if (move_uploaded_file($_FILES['userfile']['tmp_name'], $location)) {

echo "Plik został załadowany poprawnie...";

} else {

echo "Plik nie został załadowany...";

}

?>

Funckja move_uploaded_file(), przenosi plik z jednej lokalizacji ($_FILES['userfile']['tmp_name']) do drugiej ($adres) sprawdzając przy tym czy przenoszony plik został upload'owany przez formularz. W przeciwnym wypadku zwraca false.



Może teraz trochę na temat zmiennych $_FILES, jak można się domyśleć dotyczą one upload'owanych plików i tak:

  • $_FILES['userfile']['name'] - orginala nazwa(lokalizaja) pliku na komputerze użytkownika

  • $_FILES['userfile']['type'] - typ mine pliku

  • $_FILES['userfile']['size'] - rozmiar pliku

  • $_FILES['userfile']['tmp_name'] - nazwa(lokalizacja) pliku przechowywanego w temp'ie

  • $_FILES['userfile']['error'] - zwraca kod błędu

Przystańmy na chwilę przy zmiennej $location, zawiera ona adres do którego ma zostać przeniesiony plik oraz jego nazwę. W naszym przypadku nazwa pliku jest pobierana ze zmiennej $_FILES['userfile'][ name'], przy pomocy funkcji basename(), która 'ucina' adres pliku i pozostawia samą nazwę. Bardzo często w tym miejscu jest popełniany błąd podczas ustalania lokalizacji dla pliku. Warto skorzystać z funkcji $_SERVER['SCRIPT_FILENAME'], która poinformuje o aktualnej lokalizacji skryptu i wprowadzić do zmiennej adres bezwzględny.

Na koniec chcę wspomnieć o częstym przeoczeniu ustalenia praw dostępu dla folderu do którego dopisuje się pliki - chmod, który ma mieć wartość 777.


[php/mysql] Podpisywanie obrazów


By móc pracować z obrazami w PHP musimy skorzystać z biblioteki GD (ang. Graphics Draw) , która zazwyczaj jest dostarczana z nowszymi wersjami PHP. W przeciwnym wypadku można ją pobrać ze strony http://www.boutell.com/gd/.

Aby zapoznać się z podstawowymi informacjami na temat zainstalowanej biblioteki GD na naszym serwerze wystarczy skorzystać z funkcji gd_info().



gd_info();

?>

Po upewnieniu się, że nasz serwer obsługuje bibliotekę GD możemy przejść do tematu porady. Na serwerze posiadamy plik grafika.jpg i chcemy dodać do niego napis informujący z jakiej strony pochodzi obraz.



Tworzymy plik text.php, do którego będziemy wprowadzać nasz kod. W pierwszej kolejności pobierzemy obraz z pliku grafka.jpg.

$img = imagecreatefromjpeg("grafika.jpg");

?>

Teraz możemy dodać nasz tekst "http://webmae.org" do obrazu o czcionce verdana, rozmiarze 12 (pikseli - GD1, punktów - GD2), odległy od lewej krawędzi o 30px i górnej o 20px w kolorze czarnym – 0.



imagettftext($img, 12, 0, 30, 20, 0, "verdana.ttf", "http://webmade.org");

?>

Na koniec obraz zapiszemy do pliku o nazwie grafika_text.jpg i zwolnimy zajętą pamięć.



imagejpeg($img, "grafika_text.jpg", 80);

imagedestroy($img);

?>

Ostatni parametr w funkcji imagejpeg() informuje z jaką jakością ma zostać zapisany plik - najmniejsza wartość to 0, a największa to 100.


[php/mysql] Tworzenie miniaturek


By móc pracować z obrazami w PHP musimy skorzystać z biblioteki GD (ang. Graphics Draw) , która zazwyczaj jest dostarczana z nowszymi wersjami PHP. W przeciwnym wypadku można ją pobrać ze strony http://www.boutell.com/gd/.

Aby zapoznać się z podstawowymi informacjami na temat zainstalowanej biblioteki GD na naszym serwerze wystarczy skorzystać z funkcji gd_info().



gd_info();

?>

Po upewnieniu się, że nasz serwer obsługuje bibliotekę GD możemy przejść do tematu porady. Załóżmy że na serwerze znajduje się plik grafika.jpg i chcemy poprzez skrypt PHP stworzyć dla niego miniaturkę o nazwie grafika._mini.jpg.



Tworzymy plik mini.php w tej samej lokalizacji co grafika.jpg i wprowadzamy do niego kod, który zmiennej $img przypisze obraz z pliku grafika.jpg i pobierze jego wymiary.

$img = imagecreatefromjpeg("grafika.jpg");

$width = imagesx($img);

$height = imagesy($img);

?>

Następnie stworzymy "pusty"obraz($img_mini) 10 razy mniejszy niż $img.



$width_mini = $width * 0.1;

$height_mini = $height * 0.1;

$img_mini = imagecreatetruecolor($width_mini, $height_mini);

?>

Po tych operacjach możemy skopiować obraz ze zmienej $img do $img_mini



imagecopyresampled($img_mini, $img, 0, 0, 0, 0, $width_mini , $height_mini, $width , $height);

?>

Zostało nam jedynie zapisać obraz do pliku i zwolnić zajętą pamięć.



imagejpeg($img_mini, "grafika_mini.jpg", 80);

imagedestroy($img);

imagedestroy($img_mini);

?>

Ostatni parametr w funkcji imagejpeg() informuje z jaką jakością ma zostać zapisany plik -najmniejsza wartość to 0, a największa to 100.


[php/mysql] Ucinanie tekstu do odpowiedniej długości


Czasem spotykamy się z sytuacją, gdy chcemy w jakimś wąskim miejscu na stronie, umieścić link - jednak w taki sposób, by nie rozwalał nam całej strony, ani też nie przenosił się do następnej linijki. Rozwiązaniem może być ucinanie ciągu znaków do określonej długości. W tym celu stworzymy funkcję, która będzie robiła to za nas.

Po pierwsze musimy nazwać naszą funkcję. W tym przypadku jest to utnij($tekst,$ile) gdzie obie zmienne będą ustalane przez nas.

function utnij($tekst,$ile) {

Pierwszym zadaniem, które będzie wykonywać funkcja jest liczenie długości naszej zmiennej $tekst, która będzie przechowywać dany tekst do skrócenia. W tym celu piszemy:

$licz = strlen($tekst);

W kolejnym kroku, nasza funkcja będzie sprawdzać czy liczba znaków z naszego tekstu do skrócenia jest większa, lub równa liczbie znaków, po których nasz $tekst ma zostać ucięty (jest to zmienna $ile)...

if ($licz>=$ile) {

...i jeśli zapytanie zostaje spełnione, tekst zostaje skrócony do odpowiedniej ilości znaków, oraz na końcu dodawany jest wielokropek.

$tnij = substr($tekst,0,$ile);
$uciete = $tnij."...";
}

Jeżeli jednak liczba znaków z naszego tekstu jest mniejsza od maksymalnej jej wartości, wtedy tekst zostaje poprostu przepisany bez zmian.

else {
$uciete = $tekst;
}

Musimy jeszcze dopisać linijkę, która będzie pokazywać tekst już po obróbce.

return $uciete;
}

Na końcu pozostaje nam sprawdzenie funkcji. Pierwszą wartością jest zmienna $tekst, która musi być określona przed wywołaniem funkcji, druga wartość jest to pole, które odnosi się do zmiennej $ile i może być ustawione na dowolną ilość znaków. W naszym przypadku wynosi 20:

echo utnij($tekst,20);

Cały kod wygląda następująco:



function utnij($tekst,$ile) {
$licz = strlen($tekst);
if ($licz>=$ile) {
$tnij = substr($tekst,0,$ile);
$uciete = $tnij."...";
}
else {
$uciete = $tekst;
}
return $uciete;
}
$tekst = "Jakiś tam tekst, który ma ma ponad 20 znaków.";
echo utnij($tekst,20); // przykład zastosowania






©operacji.org 2017
wyślij wiadomość

    Strona główna