Ćwiczenie 7
Transkrypt
Ćwiczenie 7
Systemy teleinformatyczne Ćwiczenie 7 - PHP (3) Formularze – komunikacja międzyplikowa, upload plików Przykład: Utworzyć poniższy formularz i wyświetlać przy pomocy pliku PHP wszystkie poniższe dane: Wykorzystać np. FrontPage z pakietu Office lub napisać „ręcznie” plik index.htm typu: <FORM action='plik.php' method='post'> <INPUT type='text' name='nazwisko'/> itd.. znaczniki innych typów pól poznać we własnym zakresie <INPUT type='submit' value="Wyślij" name="Wyslij"/> </FORM> Następnie napisać plik.php, a w nim: <?php echo $_POST['nazwisko']; ?> $_POST jest tablicą, w której PHP przechowuje na serwerze dane przekazywane metodą POST, indeksy tablicy są nazwami name pól formularza. Ćwiczenie 1. Wyświetlić datę przekazaną z formularza z osobnymi rozwijanymi listami typu SELECT (wewnętrzne znaczniki OPTION zbudować odpowiednimi pętlami, np. dni do wyboru z listy od 1 do 31, miesiące od 1 do 12, lata od 1950 do 2010). Postać pętli: for ($x=1; $x<=31; $x++) { echo "<OPTION>". $x ; } Wykorzystać formę zapisu: echo date('d-m-Y',mktime(0,0,0, $_POST['miesiac'], $_POST['dzien'], $_POST['rok'])); 2. Wykonać skrypt, który po wpisaniu do formularza dwóch dat (w odpowiedniej formie – np. 2 razy po 3 pola tekstowe) obliczy liczbę dni dzielących te dwie daty. Obsługa plików w PHP W języku PHP istnieje kilkanaście funkcji do obsługi operacji na plikach. Dla potrzeb tego ćwiczenia utworzymy plik o nazwie plik.txt. Jako jego zawartość wpisujemy: 2 wiersz l wiersz 2 wiersz 3 Podstawowe znaczenie dla obsługi plików ma funkcja fopen. Przy jej pomocy możemy otworzyć istniejący lub utworzyć nowy plik na dysku serwera. Przykład $plik=fopen('plik.txt', 'r'); • • jako pierwszy parametr - ścieżka wraz z nazwą pliku jako drugi parametr - jedna z poniższych opcji: r - otwiera plik tylko do odczytu i ustawia wskaźnik na początku pliku r+ - otwiera plik do odczytu i zapisu i ustawia wskaźnik na początku pliku w - otwiera plik tylko do zapisu i jeżeli plik nie jest pusty, opróżnia go; jeżeli taki plik nie istnieje, zostanie utworzony a - otwiera plik tylko do odczytu i ustawia wskaźnik na końcu pliku a+ - otwiera plik do odczytu i zapisu oraz ustawia wskaźnik na końcu pliku. Jeśli nie podamy tego parametru, plik będzie otwarty tylko do odczytu. Aby odczytać lub zapisać do pliku treść, musimy po uprzednim otwarciu pliku przy użyciu funkcji fopen skorzystać z jednej z poniższych funkcji: fgets - odczytuje z podanego pliku jeden wiersz nie dłuższy niż podana liczba znaków. Przykład $wiersz=fgets($plik, 4096); echo $wiersz; fputs - przy pomocy tej funkcji możemy zapisać do otwartego pliku ciąg znaków, pod warunkiem że plik nie jest otwarty tylko do odczytu. Wykonanie funkcji: fputs ($plik, "tekst"); spowoduje zapisanie tekstu „tekst" do otwartego pliku i odpowiednie przesunięcie się wskaźnika zapisu. Przykład <?php // otwieramy plik o nazwie plik.txt do odczytu i zapisu $plik=fopen ("plik.txt","r+"); fputs ($plik, "tekst"); // zapisujemy tekst do pliku ?> file - podobna do fopen. W odróżnieniu od fopen, wraz z otwarciem pliku odczytuje ona także całą jego zawartość i zwraca ją w formie tablicy, której każdy element odpowiada jednemu wierszowi pliku. Indeksy tablicy rozpoczynają się od 0. Aby dopisywać kolejne wiersze należy wysyłać znak końca wiersza \r\n fputs ($plik, "tekst"."\r\n"); Przykład Aby pobrać i wyświetlić na przykład drugi wiersz naszego pliku, możemy użyć następującego skryptu PHP: <?php // otwieramy plik o nazwie plik.txt i wstawiamy go do zmiennej $plik $plik=file("plik.txt"); $wiersz=$plik[1];//wstawiamy wiersz z pliku do zmiennej $wiersz echo $wiersz; // wyświetlamy zawartość wiersza 2 ?> readfile - wyświetla całą zawartość danego pliku na ekranie: Przykład <?php readfile("plik.txt"); // wyświetlamy na ekranie całą zawartość pliku plik.txt ?> Oprócz funkcji dotyczących operacji na treści plików, PHP zawiera jeszcze inne, które pomagają operować na całych plikach (kopiowanie, kasowanie, pobieranie informacji o plikach). Najczęściej stosowane. feof – funkcja logiczna, detekcja końca pliku, Przykład <?php $plik=fopen (‘dane.txt’,’r’); while ( !feof($plik) ) { $wiersz= fgets($plik, 255); echo $wiersz; } fclose($plik); ?> copy - funkcja służąca do kopiowania plików; podajemy nazwę źródłowego i docelowego pliku Przykład <?php // kopiujemy plik o nazwie „plik.txt" do pliku o nazwie „kopia_pliku.txt" copy("plik.txt", "kopia_pliku.txt"); ?> rename - funkcja umożliwia zmianę nazwy pliku Przykład <?php rename("plik.txt","ten_sam_plik.txt"); ?> file_exists - funkcja o wartości logicznej - sprawdza, czy podany plik istnieje na dysku Przykład <?php // sprawdzamy, czy plik o nazwie „plik.txt" istnieje if (file_exists("plik.txt")) { // jeśli tak, to wyświetlamy odp. napis echo ("plik o nazwie plik.txt istnieje"); else // w przeciwnym przypadku { echo ("plik o nazwie plik.txt nie istnieje"); } ?> filesize - funkcja sprawdza wielkość pliku Przykład <?php // pobieramy rozmiar do zmiennej $rozmiar_pliku $rozmiar_pliku=filesize("plik.txt"); // wyświetlamy rozmiar pliku na ekranie echo ("$rozmiar_pliku");?> Zadania 1. W pliku przechowywany jest login i hasło. Napisać plik php sprawdzający zgodność danych podawanych przy pomocy formularza i wyświetlający odpowiedni komunikat. 2. W pliku przechowywanych jest kilka par - login i hasło w postaci: login1 4 haslo1 login2 haslo2 Napisać plik php sprawdzający zgodność danych podawanych przy pomocy formularza i wyświetlający odpowiedni komunikat. Formularz wysyłki Tworzymy plik formularza z polem input typu file: <html> <head> <title>Upload plikow</title> </head> <body> <h1>Wysylka pliku na serwer ....</h1> <form enctype="multipart/form-data" action="upload.php" method=post> Wybierz plik z obrazkiem: <input name="obrazek1" type="file"> <input type="submit" value="Wyslij"> </form> </body> </html> Rezultatem akceptacji formularza będzie dwuwymiarowa tablica $_FILES zawierająca podstawowe dane o pliku (ew. plikach). Skrypt wysyłki Następnie należy utworzyć plik upload.php uruchamiany z formularza, którego zadaniem będzie wysyłka plików: <h1>Przesyłanie pliku na serwer...</h1> <?php echo "Rozmiar: ".$_FILES['obrazek1']['size']."<BR>"; echo "Nazwa: ".$_FILES[' obrazek1']['name']."<BR>"; echo "Typ pliku: ".$_FILES[' obrazek1']['type']."<BR>"; echo "Tymczasowa nazwa:".$_FILES[' obrazek1']['tmp_name']; $plik1=$_FILES[' obrazek1']['tmp_name']; $plik2="./zdjecia/".$_FILES[' obrazek1']['name']; // funkcja przenosząca plik tymczasowy do folderu zdjecia if(move_uploaded_file($plik1,$plik2)) echo "<br>Sukces<br><br>"; echo "<hr>"; ?> Sprawdzić działanie obu skryptów – wcześniej utworzyć podrzędny folder zdjecia. Znaleźć lokalizację pliku tymczasowego. Sprawdzić, czy po zapisie do foldera docelowego plik tymczasowy istnieje czy jest usuwany. Pierwsze wykonanie skryptu nie da zadawalających rezultatów - na serwerach unixowych folder docelowy powinien posiadać odpowiednie prawa zapisu (w TotalCommander wskazać folder zdjęcia i z menu FILES – Change attributes ustawić prawo zapisu write) Ograniczenia rozmiaru i typu pliku Możemy także wprowadzić dodatkowo ograniczenia dla typu przesyłanego pliku i jego rozmiaru: <h1>Przesyłanie pliku na serwer...</h1> <?php $nazwa= $_FILES['plik']['name']; $typ = substr($nazwa, -3, 3); //funkcja znajduje 3 ostatnie znaki nazwy $typy_dop = array("jpg" , "JPG"); //tablica typów $rozmiar=$_FILES['plik']['size']; echo "Rozmiar pliku: ".$rozmiar."<BR>"; echo "Nazwa pliku: ".$nazwa."<BR>"; echo "Typ pliku: ".$_FILES['plik']['type']."<BR>"; echo "Rozszerzenie nazwy pliku: ".$typ."<BR>"; echo "Tymczasowa nazwa:".$_FILES['plik']['tmp_name']; //sprawdzenie obecności typu w tablicy i czy // nazwa nie jest pusta if((!in_array($typ,$typy_dop))&&($nazwa!="")) { echo '<SCRIPT language="javascript">'; echo "alert('Typ obrazka musi być JPG ')"; echo "</SCRIPT>"; exit; } elseif ($_FILES['plik']['size']>51200) { echo '<SCRIPT language="javascript">'; echo "alert('Rozmiar obrazka max 50 kb')"; echo "</SCRIPT>"; exit; } $plik1=$_FILES['plik']['tmp_name']; $plik2="./zdjecia/".$nazwa; // głowna funkcja przesyłająca plik if (move_uploaded_file($plik1,$plik2)) echo "<br>Sukces<br><br>"; echo "<hr>"; ?> Sprawdzić skrypt i działanie funkcji JavaScript alert w przypadku błędnych danych (za duży plik, nieprawidłowy typ pliku). Dodatkowo: wprowadzić wykorzystanie funkcji file_exists ( string nazwa_pliku) do wyświetlenia odpowiedniego komunikatu o skuteczności wysyłki pliku. Wyświetlenie zawartości katalogu w postaci listy Wykorzystać poniższy skrypt do wyświetlenia listy wysłanych plików. <?php $nazwa_kat = './obrazki'; $kat = opendir($nazwa_kat); //otwarcie do czytania $lista_plikow = "<ul>"; //pocz listy while ($naz_pliku = readdir($kat)) //war. zakończenia if (($naz_pliku !=".")&&($naz_pliku !="..")) //filtr $lista_plikow .= "<li>$naz_pliku"; //dopisanie 6 $lista_plikow .= "</ul>"; //koniec listy closedir($kat); //zamkniecie ?> <P>Elementy w katalogu: <?php echo "$nazwa_kat"; ?> </P> <?php echo $lista_plikow; ?> Ćwiczenie 1. Wykonać formularz zawierający dwa lub trzy pola input, służący do wysyłki kilku plików (nadać polom różne nazwy) , przy czym zróżnicować dopuszczalne typy i rozmiary wysyłanych plików. Wyświetlić na stronie nazwy i rozmiary plików. 2. Znaleźć w manualu PHP (ze strony dydaktycznej) funkcję unlink, przeczytać o jej działaniu i zastosować sensownie w skrypcie. 3. Przetestować i zrozumieć działanie skryptów.