Ć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.

Podobne dokumenty