Narzędzia użytkownika

Narzędzia witryny


pl:paw:lab_paw_php_1

Laboratorium, PHP # 1

PHP jest skryptowym językiem programowania, wykonywanym po stronie serwera. Zatem jako użytkownicy strony napisanej w PHP nie mamy dostępu do samego kodu PHP, lecz jedynie do tego, co zostaje wygenerowane przy interpretacji kodu PHP.

Skrypty PHP najczęściej uruchamiane są poprzez serwer (np. Apache), który zazwyczaj skonfigurowany jest tak, aby pliki z rozszerzeniem .php kierować do przetwarzania przez PHP. Istnieje też możliwość uruchamiania skryptów PHP bezpośrednio z linii poleceń, przy pomocy tzw. PHP CLI (ang. Command Line Interface).

Na Laboratorium będą Państwo ćwiczyć PHP poprzez HTTP, a więc wykorzystywać go do generowania zawartości stron WWW. Interpreter PHP dostępny jest na serwerze student.agh.edu.pl. Szczegóły dotyczące uruchamiania skryptów PHP na tych serwerach podano w następnym ćwiczeniu. Do przesyłania plików na w/w serwery należy użyć protokołu ssh albo sftp. Jeżeli pracujesz pod systemem Linux wystarczy wpisać adres serwera poprzedzony sftp: w zarządcy plików. Jeżeli pracujesz pod systemem Windows skorzystaj z WinSCP, jeżeli pod MacOS X skorzystaj z CyberDuck.

Do tworzenia i edycji kodu w PHP można użyć dowolnego edytora tekstu. Warto jednak zwrócić uwagę na: Bluefish.

Ćwiczenie 1: Pierwszy skrypt PHP

Utwórz w swoim domowym katalogu na serwerze (student.agh.edu.pl) katalog o nazwie public_html, z prawami dostępu: dostęp i odczyt dla wszystkich.

Aby włączyć raportowanie błędów PHP umieść w katalogu z skryptem w PHP plik o nazwie .user.ini o zawartości jak poniżej. Jest to lokalna konfiguracja PHP, która powoduje, że błędy będą raportowane dla wszystkich skryptów w tym katalogu.

.user.ini
display_startup_errors = On
display_errors = On
error_reporting = E_ALL

Umieść w w/w katalogu (~/public_html, tylda (~) oznacza nazwę katalogu domowego użytkownika) plik licze.php z następującą zawartością (użyj wspomnianych we wstępie narzędzi do przesyłania plików za pomocą protokołu ssh/sftp):

p1.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl" lang="pl">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
	<title>Lab PHP</title>
</head>
<body>
	<?php echo 'Mogę policzyć 2+2='.(2+2); ?>
</body>
</html>

Upewnij się, że prawa dostępu dla w/w pliku to: odczyt i wykonywanie dla wszystkich.

Zobacz efekt działania w/w skryptu w przeglądarce pod adresem: http://student.agh.edu.pl/~login/licze.php (login zastąp swoją nazwą użytkownika na serwerze) oraz jej kod źródłowy (pod prawym klawiszem myszy Pokaż źródło).

TOP TIP
Dużo przydatnych informacji o konfiguracji serwera i PHP udostępnia funkcja phpinfo().
Aby z niej skorzystać, utwórz plik PHP zawierający tylko kod <?php phpinfo(); ?>,
a zostanie wygenerowana strona HTML pełna informacji :-)

Ćwiczenie 2: GET i POST

Istnieją dwie metody przesyłania danych przy pomocy protokołu HTTP: GET i POST. Dane przesyłane tymi metodami dostępne są odpowiednio w tablicach:

  • $_GET
  • $_POST

Proszę przygotować stronę HTML z dwoma formularzami (z atrybutem action="wynik.php"). Jeden powinien przesyłać dane metodą GET, a drugi metodą POST. Każdy z nich powinien zawierać przynajmniej jedno pole tekstowe i przycisk wyślij.

Proszę przygotować stronę PHP wynik.php następującej treści:

p2.php
<?php
        echo 'Zawartość _GET: ';
	print_r($_GET);
        echo 'Zawartość _POST: ';
	print_r($_POST);
?>

Sprawdź w Manualu do czego służy finkcja print_r().

Aby dostać się do poszczególnych zmiennych w tablicach należy użyć składni: $_NAZWA['pole']. Istnieje również tablica $_REQUEST, zawierająca sumę zbiorów reprezentowanych przez $_GET oraz $_POST.

UWAGA: powyższy kod PHP generuje stronę, która domyślnie interpretowana jest przez przeglądarkę jako strona XHTML. Oczywiście, nie zawiera ona niezbędnych elementów, więc jest zdecydowanie niezgodna ze standardem! Rozwiązaniem tego problemu byłoby dodanie przed i za blokiem <?php … ?> odpowiednich elementów (html, head, body…), lub poinformowanie przeglądarki, że jest to zwykły plik tekstowy. Można to uczynić wysyłając odpowiedni nagłówek HTTP przy pomocy funkcji header:

p3.php
<?php
  header('Content-type: text/plain');
...

Ćwiczenie 3: Słownik krzyżówkowy

Proszę napisać program wyszukujący w słowniku hasła do krzyżówek. Na stronie internetowej użytkownik wpisuje w formularzu wyraz/wzorzec, zastępując każdą brakującą literę znakiem podkreślenia dolnego ('_'). Jako wynik dostaje listę wyrazów, które pasują do podanego wzorca.

Hasła powinny być przechowywane w osobnym pliku tekstowym: każdy wyraz w osobnej linii.

Przykład:

  • Plik słownika:
    ala
    kot
    basia
    lala
    ela
    ola
    kasia
  • Wejście:
    _la
  • Wyjscie:
    ala
    ela
    ola

Przykładowy algorytm:

  1. odczytaj 1 wyraz z pliku,
  2. sprawdź czy pasuje do wzorca porónując każdą literę, jeżeli tak zwróć wyraz, idź do 1.

Uwaga na UTF8!

p4.php
$str='lód'; 
echo strlen($str);                                             // zwróci 4
echo mb_strlen($str);                                          // zwróci 3
echo $str[1];                                                  // nie zwróci "ó" :(
$str_array=preg_split('//u', $str, null, PREG_SPLIT_NO_EMPTY); // konwersja do tablicy zgodna z UTF8
$str_array=mb_str_split($str);                                 // alternatywa dla powyższego, bardziej czytelna
echo $str_array[1];                                            // zwróci "ó"

Uwaga: gets() odczytuje linie z pliku wraz z znakiem końca linii; przydatna funkcja: trim() - usuwa białe znaki (włączając w to znak końca linii) na końcu i na początku łańcucha znaków.

Informacje dodatkowe: Funkcje w PHP

Podstawową jednostką organizacji kodu w PHP, podobnie jak w wielu innych językach programowania, jest funkcja. W przeciwieństwie np. do języka C, definicja funkcji nie musi określać typu zwracanego - specyfikuje tylko listę paramterów.

p6.php
function witaj($imie) {
  return 'Cześć ' . $imie . '!';
}

Możliwe jest tworzenie funkcji ze zmienną liczbą argumentów, poprzez określenie dla niektórych z nich wartości domyślnych:

p7.php
function witaj($imie = 'Jasiu') {
  return 'Cześć ' . $imie . '!';
}

Można przetestować działanie funkcji przy różnych liczbach i typach argumentów.

Informacje dodatkowe: Operacje na plikach

Operacje na plikach w PHP wykonywane są w sposób podobny np. do języka C, ale z pewnymi udogodnieniami. Możemy np. w prosty sposób stworzyć skrypt wyświetlający zawartość pliku tekstowego dane.txt, znajdującego się w tym samym katalogu co sam skrypt.

p8.php
<?php
$plik = fopen('dane.txt', 'r');
while (!feof($plik)) {
  $s = fgets($plik); // odczyt pojedynczej linii w pliku tekstowym
  echo $s;
}
fclose($plik);
?>
TOP TIP
Zauważ, że funkcja fopen() nie tylko otwiera pliki w lokalnym systemie plików np.:
$handle1 = fopen("http://www.przyklad.com/", "r");
$handle2 = fopen("ftp://uzytkownik:haslo@przyklad.com/jakisplik.txt", "w"); 

Jeżeli plik jest nieduzych rozmiarów można go wczytać bezpośrednio do tablicy, gdzie każdy element jest kolejnym elementem tablicy:

p9.php
$t=file('dane.txt');

Informacje dodatkowe: Pliki ze strukturą

Powyższy przykład oparty jest o pliki tekstowe, nie zawierające żadnej struktury - no, może z wyjątkiem znaków nowych linii. W praktyce wygodnie jest przechowywać dane w plikach w sposób uporządkowany (coś w rodzaju najprostszej, kartotekowej bazy danych). Wygodny do tego jest format CSV (comma-separated values):

Nazwisko;Imię;Miasto;E-mail
Kowalski;Jan;Warszawa;kowalski@warszawa.pl
Wiszniewska;Anna;Kraków;wiszniewska@krakow.pl
Zieliński;Henryk;Wrocław;zielinski@wroclaw.pl 

Do obsługi plików CSV służą w PHP funkcje fgetcsv oraz fputcsv. Funkcja fgetcsv domyślnie zakłada, że pola w każdym rekordzie oddzielone są przecinkiem (,) i ograniczone cudzysłowami (). Aby poprawnie przetworzyć powyższy przykład, należy zmienić parametry określające te znaki zgodnie z definicją funkcji.

Dane wczytane przy pomocy fgetcsv umieszczane są w tablicy wyliczeniowej - takiej, jaką znamy np. z C (indeksowana 0, 1, 2, …). PHP udostępnia również tablice asocjacyjne, w który poszczególne elementy indeksowane są etykietami, np.:

p9.php
$zoo['pelikan'] = 'Ptak z dużym dziobem';
$zoo['jenot'] = 'Szop po tuningu';

Podobnie, fputcsv umożliwia serializację tablicy to pliku CSV.

Bardziej złożone struktury można oczywiście przechowywać np. w formatach:

  • XML - który poznamy w dalszej części kursu,
  • JSON - podzbiór notacji JavaScript, bardzo wygodny przy AJAX.
  • YAML - format umożliwiający definiowanie skomplikowanych struktur danych, a jednocześnie bardzo czytelny dla człowieka; dla PHP istnieje parser/generator spyc.

Z kolei mniej skomplikowane struktury danych można przetwarzać np. linia po linii (z użyciem fgets()) oraz:

Dodatkowe informacje

pl/paw/lab_paw_php_1.txt · ostatnio zmienione: 2023/12/10 14:58 przez wojnicki