Laboratorium 6 ZAKŁAD SYSTEMÓW ROZPROSZONYCH LABORATORIUM Aplikacje internetowe PHP + MySQL + biblioteka GD 1. Sprawdź czy istnieją pliki z poprzedniego laboratorium: cw_2.php, cw_3.php i cw_4.php. Przypomnij sobie stworzoną ostatnio strukturę bazy danych MySQL i dane użytkowników w PhpMyAdmin. Plik cw_3.php powinien wyglądać następująco: <?php session_start(); $connection = @mysql_connect("localhost", "user", "pass") or die("brak polaczenia"); $db = @mysql_select_db('moja_baza', $connection) or die("wybor nieudany"); $sql = "SELECT id,nazwa,haslo FROM uzytkownik"; $id = ""; while ($row = mysql_fetch_array($result)) { if ($_POST["nazwa"] == $row['nazwa'] && $_POST["haslo"] == $row['haslo']) { $id = $row['id']; $nazwa = $row['nazwa']; $haslo = $row['haslo']; php?> <title>php - cwiczenie 3</title> Witaj<p> Otrzymano nastepujace dane:<br> Zakład Systemów Rozproszonych - 1 / 10
<?php echo "Nazwa: <b>". $nazwa."</b> <br>"; echo "Haslo: <b>". $haslo."</b> <br>"; if ($id<>'') { echo 'Logowanie poprawne <br> echo '<a href="cw_4.php">dalej</a> <br> $_SESSION['zalogowany'] = "tak"; $_SESSION['zalogowany_uzytkownik'] = $nazwa; else { echo 'Logowanie <b>nie</b> poprawne<br> echo '<a href="cw_2.php">sprobuj jeszcze raz</a> <br> unset($_session['zalogowany']); unset($_session['zalogowany_uzytkownik']); php?> 2. Zaimportuj do bazy danych w phpmyadmin plik baza_lab6.sql, w którym zawarty jest skrypt: ALTER TABLE uzytkownik ADD( email varchar(30) default NULL, login datetime default NULL, zdjecie varchar(50) default NULL ); UPDATE uzytkownik SET email = 'test@wp.pl', login = '2008-04-08 11:19:35' WHERE id=1; UPDATE uzytkownik SET email = 'czesiek@o2.pl', login = '2008-03-12 14:10:15' WHERE id=2; VALUES ('Wazniak', 'tajne', 'wazniak@smerfy.pl', '2007-12-17 11:29:47'); VALUES ('Smerfetka', 'osilek', 'smerfetka@smerfy.pl', '2007-12-18 16:09:12'); VALUES ('Lalus', 'lustereczko', 'lalus@smerfy.pl', '2007-12-18 16:43:31'); VALUES ('Maruda', 'niecierpiehasel', 'maruda@smerfy.pl', '2007-12-18 18:41:33'); VALUES ('Papa Smerf', 'J3,16', 'papa@smerfy.pl', '2007-12-19 14:24:00'); VALUES ('Osilek', 'smerfetka', 'lov_smerfetka@smerfy.pl', '2007-12-17 09:43:56'); Zakład Systemów Rozproszonych - 2 / 10
3. Zmień plik cw_4.php, tak aby zalogowany użytkownik przeglądał listę wszystkich rekordów z tabeli uzytkownik. <?php session_start(); if ($_SESSION['zalogowany'] == "tak") { $connection = @mysql_connect("localhost", "user", "pass") or die("brak polaczenia"); $db = @mysql_select_db('moja_baza', $connection) or die("wybor nieudany"); $sql = "SELECT id,nazwa,haslo,email,login FROM uzytkownik"; <title>php - cwiczenie 4</title> <h1>witaj <b>'. $_SESSION['zalogowany_uzytkownik'].' </b></h1> while ($row = mysql_fetch_array($result)) { $html.= '<p>'.$row['id'].' <b>'.$row['nazwa'].'</b> '.$row['haslo'].' '.$row['email'].' '.$row['login'].'</p> $html.= ' else { <title>php - cwiczenie 4</title> <meta http-equiv="refresh" content="1; url=cw_2.php"> Nie jesteś zalogowany. Zakład Systemów Rozproszonych - 3 / 10
echo $html; php?> 4. Zmień plik cw_4.php, tak, aby nazwa każdego użytkownika była linkiem do strony cw_5.php z id przesyłanym metodą get (dane w linku). $html.= '<p>'.$row['id'].' <a href= cw_5.php?id='. $row['id'].' >'.$row['nazwa'].'</a> '.$row['haslo'].' '. $row['email'].' '.$row['login'].'</p> 5. Utwórz nowy plik: cw_5.php, który dla zalogowanego użytkownika wyświetla formularz do zmiany danych o użytkowniku (haslo, email, zdjecie). Dane z formularza mają być przesyłane metodą post do pliku cw_6.php. <?php session_start(); if ($_SESSION['zalogowany'] == "tak") { $connection = @mysql_connect("localhost", "user", "pass") or die("brak polaczenia"); $db = @mysql_select_db('moja_baza', $connection) or die("wybor nieudany"); $id = ($_GET['id']!=''?$_GET['id']:0); $sql = "SELECT nazwa,email,zdjecie FROM uzytkownik where id=".$id; if ($id!=0 && mysql_num_rows($result)!=0) { $row = mysql_fetch_array($result); <title>php - cwiczenie 5</title> <p>uzytkownik o id '.$id.': <b>'. $row['nazwa'].'</b></p> <form name="change_form" action="cw_6.php" method="post"> <p> hasło: <input type="password" name="haslo" maxlength="20" size="20"/> </p> <p> Zakład Systemów Rozproszonych - 4 / 10
email:<input type="text" name="nazwa" maxlength="20" size="20" value="'.$row['email'].'"/> </p> <p> if ($row['zdjecie']!="") { $html.='<img src="img/'.$row['zdjecie'].'"> $html.=' zdjecie:<input type="file" name="zdjecie" maxlength="20" size="20"/> </p> <p> <input type="hidden" name="id" value="'. $id.'"/><input type="submit" name="zapisz" value="zapisz"/> </p> </form> else { <title>php - cwiczenie 5</title> <meta http-equiv="refresh" content="1; url=cw_4.php"> Nie istnieje taki użytkownik. else { <title>php - cwiczenie 5</title> <meta http-equiv="refresh" content="1; url=cw_2.php"> Nie jesteś zalogowany. echo $html; php?> Zakład Systemów Rozproszonych - 5 / 10
6. Utwórz plik cw_6.php, w którym będą zapisywane do bazy danych zmiany wysłane z pliku cw_5.php. Sprawdzaj, czy użytkownik jest zalogowany. W katalogu www utwórz podkatalog img, w którym będą zapisywane przesłane zdjęcia (nadaj uprawnienia do zapisywania plików!). Nazwa zdjęcia powinna zostać poprzedzona id użytkownika. Po zapisaniu danych, wyświetl komunikat i link do strony z użytkownikami. <?php session_start(); if ($_SESSION['zalogowany'] == "tak") { $connection = @mysql_connect("localhost", "user", "pass") or die("brak polaczenia"); $db = @mysql_select_db('moja_baza', $connection) or die("wybor nieudany"); $id = $_POST['id']!=''?$_POST['id']:0; $sql = "SELECT * FROM uzytkownik where id=".$id; if ($id!=0 && mysql_num_rows($result)!=0) { <title>php - cwiczenie 6</title> if ($_POST['haslo']!= "") { $sql = "UPDATE uzytkownik SET haslo = '". $_POST['haslo']."' WHERE id=".$id; $html.= '<p>haslo zmienione</p> if ($_POST['email']!= "") { $sql = "UPDATE uzytkownik SET email = '". $_POST['email']."' WHERE id=".$id; $html.= '<p>email zmieniony</p> if (is_uploaded_file($_files['zdjecie'])) { if($_files['zdjecie']['error']!= 0){ $html.= "<p>wystąpił błąd podczas przesyłania pliku!</p>"; if($_files['zdjecie']['type'] == "image/jpeg" $_FILES['zdjecie']['type'] == "image/png" $_FILES['zdjecie'] ['type'] == "image/gif"){ Zakład Systemów Rozproszonych - 6 / 10
if(move_uploaded_file($_files['zdjecie'] ['tmp_name'], "img\".$id.'_'.$_files['zdjecie']['name'])){ $sql = "UPDATE uzytkownik SET zdjecie = '".$id."_".$_files['zdjecie']['name']."' WHERE id=".$id; $result = @mysql_query($sql, $connection) $html.= "<p>zdjecie zapisane</p>"; else { $html.= "<p>wystąpił nieoczekiwany błąd podczas kopiowania!</p>"; else { $html.= "Możesz uploadować tylko obrazki!"; <p><a href="cw_4.php">wroc do uzytkownikow</a></p> else { <title>php - cwiczenie 6</title> <meta http-equiv="refresh" content="1; url=cw_4.php"> Nie istnieje taki użytkownik. else { <title>php - cwiczenie 6</title> <meta http-equiv="refresh" content="1; url=cw_2.php"> Nie jesteś zalogowany. echo $html; php?> Zakład Systemów Rozproszonych - 7 / 10
Uwagi: $_FILES tablica, która przechowuje dane o uploadowanych plikach $_FILES['plik'] informacje o pliku załadowanym w polu formularza o nazwie plik. $_FILES['plik']['name'] oryginalna nazwa pliku po stronie klienta $_FILES['plik']['type'] typ mime pliku np. image/gif $_FILES['plik']['tmp_name'] tymczasowa nazwa pliku na serwerze $_FILES['plik']['error'] ewentualne błędy, 0 brak błędów is_uploaded_file funkcja, która sprawdza, czy plik został rzeczywiście uploadowany move_uploaded_file(tmp,docel) funkcja, która przenosi plik z tymczasowej lokalizacji tmp do podanej docel Sprawdź działanie skryptu, załaduj obrazek dla jednego smerfa. Sprawdź czy obrazek istnieje w katalogu C:\www\img 7. Zmień plik cw_6.php, tak, żeby zapisywał hasło w formie zaszyfrowanej algorytmem md5. $id; $haslo = md5($_post['haslo']); $sql = "UPDATE uzytkownik SET haslo = '".$haslo."' WHERE id=". Uwagi: md5() funkcja szyfrująca md5, która zwraca łańcuch 32 znaków Teraz na hasło w bazie danych potrzeba 32 bajty, wobec tego zmień tablicę uzytkownik, aby mogła przechowywać 32 znaki: ALTER TABLE uzytkownik CHANGE haslo haslo VARCHAR( 32 ) NULL DEFAULT NULL Sprawdź działanie skryptu: zmień hasło jednemu z użytkowników (podglądnij w bazie danych), a następnie sprawdź jak wygląda teraz hasło w bazie danych. 8. Zmień hasła wszystkim użytkownikom, tak, żeby zostały zapisane w formie zaszyfrowanej, a następnie zmień plik logowania cw_3.php, żeby użytkownik mógł się teraz zalogować. if ($_POST["nazwa"] == $row['nazwa'] && md5($_post["haslo"]) == $row['haslo']) 9. Do skryptu z pliku cw_6.php dodaj funkcję, która przy użyciu biblioteki GD będzie tworzyła miniatury przesyłanych obrazków. Sprawdź wcześniej czy biblioteka GD jest włączona w PHP (cw_1.php lub php.ini). function miniatura($zdjecie,$mini,$roz_x,$roz_y){ $system=explode('.',$zdjecie); if (preg_match('/jpg jpeg/',$system[1])){ $src_img=imagecreatefromjpeg($zdjecie); Zakład Systemów Rozproszonych - 8 / 10
if (preg_match('/png/',$system[1])){ $src_img=imagecreatefrompng($zdjecie); $old_x=imagesx($src_img); $old_y=imagesy($src_img); if ($old_x > $old_y) { $thumb_w=$roz_x; $thumb_h=$old_y*($roz_y/$old_x); if ($old_x < $old_y) { $thumb_w=$old_x*($roz_x/$old_y); $thumb_h=$roz_y; if ($old_x == $old_y) { $thumb_w=$roz_x; $thumb_h=$roz_y; $dst_img=imagecreatetruecolor($thumb_w,$thumb_h); imagecopyresampled($dst_img,$src_img,0,0,0,0,$thumb_w,$thumb_h, $old_x,$old_y); if (preg_match("/png/",$system[1])){ imagepng($dst_img,$mini); else { imagejpeg($dst_img,$mini); imagedestroy($dst_img); imagedestroy($src_img); Uwagi: imagecreatefromjpeg() - tworzy kopie do pracy na pliku jpg imagecreatefrompng() - tworzy kopie do pracy na pliku png imagesx() - pobiera szerokość obrazka imagesy() - pobiera wysokość obrazka ImageCreateTrueColor() - tworzy nowy obiekt truecolour imagecopyresampled() - skaluje obraz imagejpeg() - tworzy nowy obrazek JPEG imagepng() - tworzy nowy obrazek PNG imagedestroy() - niszczy stare obiekty w pamięci Przed zapisaniem nazwy zdjęcia w bazie danych dodaj w pliku cw_6.php użycie funkcji miniatura. Miniatury twórz w katalogu www\img\mini (trzeba go wcześniej utworzyć) o maksymalnym rozmiarze 80px z przesyłanych obrazków. miniatura("img\".$id.'_'.$_files['zdjecie'] ['name'],"img\mini\".$id.'_'.$_files['zdjecie']['name'],80,80); 10.Dodaj w pliku cw_4.php wyświetlanie miniatur zdjęć użytkownika. Po kliknięciu na miniaturę powinno otworzyć się duże zdjęcie. Zakład Systemów Rozproszonych - 9 / 10
11.Zaproponuj poprawę skryptu cw_6.php, aby przed zapisaniem obrazka sprawdzał, czy istnieje już na serwerze obrazek danego użytkownika. Jeśli istnieje należy go wykasować, nie zapominając o miniaturze. Zakład Systemów Rozproszonych - 10 / 10