Biblioteka PDO - Bazy Danych - Podstawy PHP
|
|
- Judyta Marciniak
- 9 lat temu
- Przeglądów:
Transkrypt
1 Artykuł pobrano ze strony eioba.pl Biblioteka PDO - Bazy Danych - Podstawy PHP Biblioteka PDO Jeszcze rok temu programiści pragnący komunikować się z bazą danych poprzez PHP musieli zmagać się z wieloma problemami. Każdy serwer DB udostępniał inne API do komunikacji, które zostały na nasze nieszczęście wiernie odtworzone w interpreterze. Jeżeli ktoś chciał napisać elastyczny projekt do uruchamiania na kilku bazach, musiał pisać samodzielnie odpowiednie nakładki, które wybiorą odpowiednią funkcję w zależności od tego, czym się łączymy. Pozostawały też różne gotowe skrypty robiące to zadanie za nas. PDO to skrót od PHP Data Objects. Jest to zupełnie nowy interfejs języka PHP przeznaczony do komunikacji z bazami danych, po raz pierwszy napisany wyłącznie w OOP. Jego najważniejszą zaletą jest to, że możemy za jego pomocą łączyć się zarówno z bazą danych MySQL, jak i z bazą danych PosgreSQL (o innych systemach DB nie wspominając), nie zmieniając ani linijki kodu. Wersji beta PDO można było używać już w PHP 5.0, natomiast stabilna wersja pojawiła się wraz z PHP 5.1. Gorąco zachęcamy do jego stosowania, gdyż nie tylko jest wygodniejszy od starych rozwiązań, ale też szybszy i bezpieczniejszy - do tego zagadnienia niedługo wrócimy. Nawiązywanie połączenia Aby nie być gołosłownym, przejdźmy od słów do czynów. Połączymy się z naszą bazą utworzoną podczas wcześniejszych lekcji: $pdo = new PDO('mysql:host=localhost;dbname=produkty', 'root', 'root'); echo 'Połączenie nawiązane!'; echo 'Połączenie nie mogło zostać utworzone: '. $e->getmessage(); Nawiązywanie połączenia polega po prostu na utworzeniu obiektu klasy PDO. Jako parame startowe podajemy: DSN - specjalny ciąg znaków identyfikujący rodzaj serwera DB (np. mysql), host na jakim jest ona uruchomiona (dla nas localhost) oraz nazwę bazy, z którą chcemy się połączyć. Opcjonalnie można dodać także parametr port. Inne serwery DB mogą wymagać innych parametrów połączeń; po szczegóły odsyłamy do dokumentacji PHP. nazwa użytkownika hasło użytkownika Host, nazwę użytkownika i hasło powinieneś dostać od swojego hostingu, kiedy będziesz chciał umieścić swoją stronę. Jeżeli podczas nawiązywania połączenia wystąpi błąd, zostanie on zgłoszony jako wyjątek PDOException, który musimy przechwycić (to ważne - jeśli wyjątek nie zostanie przechwycony, domyślny komunikat o błędzie wygenerowany przez PHP ujawni nazwę użytkownika i hasło!). Pobieranie danych Pobieranie danych w sterownikach baz danych realizuje się w następujący sposób: najpierw wysyłamy zapytanie i uzyskujemy od serwera zbiór wyników. Przelatując po nim pętlą, otrzymujemy kolejne rekordy w postaci tablic. W bibliotece PDO zbiorem wyniku jest obiekt klasy PDOStatement. Naraz możemy mieć otwarty tylko jeden zbiór wyników. Zabezpiecza to przed próbami tworzenia zapytań rekurencyjnych oraz wynika ze specyfiki pracy bibliotek
2 komunikujących się z serwerem. W starszych bibliotekach ograniczenia takiego nie było dzięki emulacji, która jednak zmniejszała wydajność. Przyjrzyjmy się, jak możemy pobrać zawartość tabeli produkty: $pdo = new PDO('mysql:host=localhost;dbname=produkty', 'root', 'root'); $pdo -> setattribute(pdo::attr_errmode, PDO::ERRMODE_EXCEPTION); $stmt = $pdo -> query('select id, nazwa, opis FROM produkty'); echo '<ul>'; foreach($stmt as $row) echo '<li>'.$row['nazwa'].': '.$row['opis'].'</li>'; echo '</ul>'; echo 'Połączenie nie mogło zostać utworzone: '. $e->getmessage(); Metoda query() zwraca obiekt zbioru wyników odpowiadający wykonanemu zapytaniu (zauważ, że w tym przypadku nie kończymy go średnikiem!). Jedną z technik uzyskania kolejnych rekordów jest przepuszczenie tego obiektu przez pętlę foreach. Kolejne rekordy zostaną zapisane do tablicy asocjacyjnej $row, z której możemy pobrać wyniki. Po zakończeniu pobierania niezbędne jest zamknięcie zbioru wyników poleceniem closecursor() - inaczej nie będziemy w stanie wysłać następnego zapytania. Zauważ, że zaraz po połączeniu się z bazą danych korzystamy z metody setattribute(). Pozwala ona skonfigurować niektóre aspekty pracy z biblioteką PDO - w tym przypadku żądamy, aby ewentualne błędy w zapytaniach raportowane były jako wyjątki. Powyższy przykład można zapisać także w inny sposób: $pdo = new PDO('mysql:host=localhost;dbname=produkty', 'root', 'root'); $pdo -> setattribute(pdo::attr_errmode, PDO::ERRMODE_EXCEPTION); $stmt = $pdo -> query('select id, nazwa, opis FROM produkty'); echo '<ul>'; while($row = $stmt -> fetch()) echo '<li>'.$row['nazwa'].': '.$row['opis'].'</li>'; echo '</ul>'; echo 'Połączenie nie mogło zostać utworzone: '. $e->getmessage();
3 W tym wypadku wykorzystaliśmy pętlę while i jawnie zażądaliśmy zwrócenia rekordu metodą fetch(). Jest ona, wbrew pozorom bardzo użyteczna - można ją wywołać wszędzie, np. w instrukcji if (sytuacja, gdy zawsze pobieramy jeden rekord), a także ustawić b pobierania. Uwaga! PHP Data Objects ma czasem problemy z działaniem z MySQL 4.1. Aby uniknąć problemów na tej wersji (sporo firm hostingowych wciąż ją oferuje), musisz pamiętać o tym, aby po zamknięciu zbioru wyników metodą closecursor() dodatkowo ręcznie skasować obiekt $stmt: unset($stmt); Inaczej próba przypisania do niej nowego zbioru wyników spowoduje wygenerowanie przez MySQL komunikatu General Error Aktualizacja danych Zapytania typu INSERT czy UPDATE służące do modyfikacji zawartości bazy lub inne, niezwracające zbioru wyników, wysyła się za pomocą metody exec(). Wynikiem jej działania jest liczba określająca ilość zmodyfikowanych rekordów. W poniższym przykładzie zakodujemy dodawanie pewnego konkretnego produktu do naszej listy produktów: $pdo = new PDO('mysql:host=localhost;dbname=produkty;port=3305', 'root', 'root'); $pdo -> setattribute(pdo::attr_errmode, PDO::ERRMODE_EXCEPTION); $ilosc = $pdo -> exec('insert INTO `produkty` (`nazwa`, `opis`, `ilosc`, `cena`, `jakosc`) VALUES( \'Miotacz ognia na dezodorant\', \'Rewelacyjny miotacz ognia dla kazdej domowej gospodyni! Nie martw sie o paliwo - wystarczy zwykly dezodorant!\', \'54\', \'40.99\', \'5\')'); if($ilosc > 0) echo 'Dodano: '.$ilosc.' rekordow'; echo 'Wystąpił błąd podczas dodawania rekordów!'; echo 'Wystąpił błąd biblioteki PDO: '. $e->getmessage(); Podpinanie Rzadko kiedy zdarza się, aby wszystkie informacje potrzebne do zmodyfikowania bazy były na sztywno zakodowane w zapytaniu tak, jak to zrobiliśmy w powyższym przykładzie. W codziennej praktyce modyfikujemy dane za pomocą formularzy, ikonek podpowiadających, co trzeba zmienić i jak. Rozwiązanie jest pozornie banalne: składamy zapytanie z predefiniowanych części, którymi opakowujemy dane z formularza, a później wysyłamy ten miks do bazy. Ilustruje to kolejny przykład, który udostępnia prosty formularz do dodawania nowych produktów:
4 if($_server['request_method'] == 'POST') $pdo = new PDO('mysql:host=localhost;dbname=produkty;port=3305', 'root', 'root'); $ilosc = $pdo -> exec('insert INTO `produkty` (`nazwa`, `opis`, `ilosc`, `cena`, `jakosc`) VALUES( \''.$_POST['nazwa'].'\', \''.$_POST['opis'].'\', \''.$_POST['ilosc'].'\', \''.$_POST['cena'].'\', \''.$_POST['jakosc'].'\')'); if($ilosc > 0) echo 'Dodano: '.$ilosc.' rekordow'; echo 'Wystąpił błąd podczas dodawania rekordów!'; <form method="post" action="pdo_5.php"> <p>nazwa: <input type="text" name="nazwa"/></p> <p>opis: <input type="text" name="opis"/></p> <p>ilosc: <input type="text" name="ilosc"/></p> <p>cena: <input type="text" name="cena"/></p> <p>jakosc: <select name="jakosc"> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> <option value="4">4</option> <option value="5">5</option> <option value="6">6</option> </select></p> <p><input type="submit" value="dodaj"/></p> </form> echo 'Wystapil blad biblioteki PDO: '. $e->getmessage(); Kiedy został nadesłany formularz (metoda POST), nawiązywane jest połączenie z bazą. W szkielet zapytania wstawiamy wprowadzone przez użytkownika dane, wykorzystując zwyczajny operator łączenia ciągów. Później metoda exec() umieszcza nam nowy rekord w bazie. Na pierwszy rzut oka wszystko wygląda wspaniale - mamy formularz, redaktorzy mogą dodawać produkty, a internauci je oglądać. Lecz pewnego dnia jeden z redaktorów zgłasza problem: nie może wpisać do opisu produktu apostrofy, gdyż skrypt generuje wtedy jakieś tajemnicze błędy. Co jest grane? Testujemy kopię skryptu na lokalnym komputerze i działa, ale na właściwym serwerze WWW już nie. Przyczyną problemu jest złamanie dwóch podstawowych zasad obsługi formularzy: Nigdy nie ufaj danym zewnętrznym
5 Nigdy nie ufaj magic quotes Efekt jest taki, że stworzyliśmy aplikację podatną na włamania typu SQL Injection, które polegają na wykorzystaniu dziur w kontroli danych z formularzy. Zauważ, jak bezbronny jest nasz formularz: baza danych wymaga, aby ilość była liczbą. Gdzie to sprawdzamy w skrypcie? Nigdzie. Gdy jakiś inteligent wpisze nam zamiast ilości "miecio jest niepoważny", skrypt beztrosko umieści to w zapytaniu nie patrząc na sens tego, co robi. Co więcej, zwróć uwagę na pewną rzecz: w języku SQL znak apostrofu jest czymś więcej, niż tylko znakiem - kończy on lub zaczyna sekwencję ciągu tekstowego. Dlatego wprowadzając jakikolwiek tekst, który ma zawierać apostrofy, musimy poddać je zabiegowi escapingu, czyli mówiąc po polsku - poprzedzić znakiem backslash, aby MySQL wiedział, że są one integralną częścią tekstu i nie kończą wprowadzanej sekwencji. Kiedy PHP był jeszcze niewielkim projektem, ktoś wpadł na pomysł wspomożenia programistów i wymyślił tzw. magic quotes. Opcja ta, jeżeli jest włączona, powoduje, że we wszystkich danych z tablic $_GET, $_POST oraz $_COOKIE apostrofy są automatycznie poprzedzane backslashem, dzięki czemu nie trzeba się tym zajmować samodzielnie. Brzmi ciekawie? Niezupełnie! Zwróćmy uwagę, że nie tylko baza danych może służyć do przechowywania informacji. Niektóre z nich ktoś zechce umieścić w pliku i wtedy z kolei musi się sam tych niepotrzebnych backslashów pozbywać. Kolejną kontrowersyjną rzeczą dotyczącą magic quotes jest fakt, że nie wszystkie serwery miały tę opcję włączoną, tak samo nie wszyscy programiści wiedzieli, że coś takiego w ogóle istnieje. Czy widziałeś w sieci serwisy, gdzie apostrofy w artykułach poprzedzane były setkami backslashów? To właśnie efekt tego - programista miał u siebie w domu wyłączoną opcję magic quotes, więc ręcznie dodawał sobie backslashe przy danych umieszczanych w zapytaniach SQL. Później wrzucił skrypt na serwer, gdzie magic quotes dla odmiany było włączone, przez co backslashe doklejane były dwa razy - jeden z nich faktycznie escape'ował apostrofy, ale drugi był uznawany przez MySQL za integralną część tekstu. Z drugiej strony, jeśli ktoś miał w domu serwer lokalny z włączonymi magicznymi apostrofami, a później wrzucił swoja stronę WWW na serwer bez nich, stawał się łatwym celem dla hackerów, którzy bez trudu mogą włamać się atakiem SQL Injection. Atak ten polega na tym, że skoro apostrof nie jest escape'owany, to jego wprowadzenie tak naprawdę powoduje, że dalsza część ciągu jest uznawana za fragment zapytania! Możemy więc sobie zupełnie legalnie dopisać własne warunki. Wyobraźmy sobie teraz, że ktoś manipuluje w ten sposób zapytaniami związanymi z bezpieczeństwem za pomocą formularza logowania. To nie fikcja: do wyobraźni powinien przemówić film (j. ang). Ostatecznie sami twórcy PHP doszli do wniosku, że magic quotes jest rozwiązaniem bezsensownym. W tworzonym właśnie PHP 6 tej opcji już nie ma i należy samodzielnie escape'ować wszystkie dane. Jednak póki co pracujemy na PHP choć w tym podręczniku podczas instalacji zalecaliśmy wyłączenie magic quotes, nie mamy pewności, że serwer docelowy dla naszych stron WWW posiada identyczne ustawienia. Jeśli korzystamy z PDO i mechanizmu podpinania, problem nas nie dotyczy, ponieważ biblioteka automatycznie dostosuje się wtedy do ustawień, lecz w każdym innym przypadku powinniśmy zastosować specjalny filtr, który zniweluje nam efekt niewłaściwych ustawień i nada danym pożądaną przez nasz skrypt postać. if(version_compare(phpversion(), '6.0.0-dev', '<')) // Dla PHP 5 i wcześniejszych wyłączmy magic quotes function removeslashes(&$value) if(is_array($value)) return array_map('removeslashes', $value); return stripslashes($value); // end rmgpc(); set_magic_quotes_runtime(0); if(get_magic_quotes_gpc()) $_POST = array_map('removeslashes', $_POST);
6 $_GET = array_map('removeslashes', $_GET); $_COOKIE = array_map('removeslashes', $_COOKIE); Przejdźmy teraz do właściwego tematu niniejszej sekcji. Skoro magic quotes jest wyłączone, rozsądek podpowiada, że dane musimy sami escape'ować. W starych rozszerzeniach do komunikacji z bazą danych służyły do tego specjalne funkcje udostępniane przez sterownik, przez które musieliśmy przepuścić wszystkie dane - nadal jednak konieczne było samodzielne spajanie tego z zapytaniem. PDO promuje filozofię przeniesienia tego zadania na bazę danych, co udostępniają najnowsze biblioteki komunikacji z serwerami DB. W języku polskim proces ten doczekał się niezbyt szczęśliwej nazwy bindowanie od angielskiego określenia data binding, jednak w tym podręczniku będziemy konsekwentnie stosować termin podpinanie, naszym zdaniem znacznie lepiej oddający jego charakter. Podpinanie polega na przeniesieniu spajania danych z zapytaniem z języka programowania na serwer DB. Do bazy wysyłamy tutaj tak naprawdę szkielet zapytania ze specjalnymi wstawkami, do których później podpinamy interesujące nas dane za pomocą specjalnej metody, gdzie możemy dodatkowo określić ich typ (tekst, liczba itd.). Zobaczmy, jak wygląda podany na początku przykład przepisany z wykorzystaniem podpinania: if($_server['request_method'] == 'POST') $pdo = new PDO('mysql:host=localhost;dbname=produkty;port=3305', 'root', 'root'); $pdo -> setattribute(pdo::attr_errmode, PDO::ERRMODE_EXCEPTION); $stmt = $pdo -> prepare('insert INTO `produkty` (`nazwa`, `opis`, `ilosc`, `cena`, `jakosc`) VALUES( :nazwa, :opis, :ilosc, :cena, :jakosc)'); // 1 $stmt -> bindvalue(':nazwa', $_POST['nazwa'], PDO::PARAM_STR); // 2 $stmt -> bindvalue(':opis', $_POST['opis'], PDO::PARAM_STR); $stmt -> bindvalue(':ilosc', $_POST['ilosc'], PDO::PARAM_INT); $stmt -> bindvalue(':cena', (float)$_post['cena'], PDO::PARAM_STR); $stmt -> bindvalue(':jakosc', $_POST['jakosc'], PDO::PARAM_INT); $ilosc = $stmt -> execute(); // 3 if($ilosc > 0) echo 'Dodano: '.$ilosc.' rekordow'; echo 'Wystapil blad podczas dodawania rekordow!'; <form method="post" action="pdo_6.php"> <p>nazwa: <input type="text" name="nazwa"/></p>
7 <p>opis: <input type="text" name="opis"/></p> <p>ilosc: <input type="text" name="ilosc"/></p> <p>cena: <input type="text" name="cena"/></p> <p>jakosc: <select name="jakosc"> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> <option value="4">4</option> <option value="5">5</option> <option value="6">6</option> </select></p> <p><input type="submit" value="dodaj"/></p> </form> echo 'Wystapil blad biblioteki PDO: '. $e->getmessage(); Opis: 1. Na początek wysyłamy do bazy danych szkielet zapytania, wykorzystując metodę prepare(). Zamiast danych, umieszczamy w ich miejscu wstawki, np. :nazwa, :opis. Jako rezultat otrzymujemy obiekt klasy PDOStatement, który wykorzystamy do podpięcia danych. 2. Tutaj podpinamy dane z formularza pod konkretne wstawki metodą bindvalue() obiektu PDOStatement. Określamy także ich typ: stała PDO::PARAM_STR określa podpinanie danych tekstowych, PDO::PARAM_INT - liczb całkowitych. 3. Właściwe wykonanie zapytania metodą execute(). Podpinanie jest odporne na ataki SQL Injection. MySQL ma jasno określone, co jest danymi, a co zapytaniem i ściśle się tego trzyma. Ponadto jest także wydajniejsze, niż samodzielne spinanie wszystkiego po stronie PHP. Szczególnie ciekawa właściwość podpinania polega na możliwości podpięcia kilku zestawów danych do tego samego szkieletu zapytania, dzięki czemu wydajność wzrasta jeszcze bardziej. Zademonstruje to poniższy przykład, w którym rozszerzyliśmy nasz formularz tak, aby naraz można nim było wprowadzać kilka produktów. Gdy zostanie on wysłany, połączymy się z MySQL'em, przekazując szkielet naszego zapytania. Następnie będziemy podpinali do niego dane kolejnych produktów i wykonywali. if($_server['request_method'] == 'POST') $pdo = new PDO('mysql:host=localhost;dbname=produkty;port=3305', 'root', 'root'); $pdo -> setattribute(pdo::attr_errmode, PDO::ERRMODE_EXCEPTION); $stmt = $pdo -> prepare('insert INTO `produkty` (`nazwa`, `opis`, `ilosc`, `cena`, `jakosc`) VALUES( :nazwa, :opis, :ilosc, :cena, :jakosc)'); // 1 $ilosc = 0;
8 foreach($_post['produkty'] as $produkt) if(strlen($produkt['nazwa']) > 0) $stmt -> bindvalue(':nazwa', $produkt['nazwa'], PDO::PARAM_STR); // 2 $stmt -> bindvalue(':opis', $produkt['opis'], PDO::PARAM_STR); $stmt -> bindvalue(':ilosc', $produkt['ilosc'], PDO::PARAM_INT); $stmt -> bindvalue(':cena', (float)$produkt['cena'], PDO::PARAM_STR); $stmt -> bindvalue(':jakosc', $produkt['jakosc'], PDO::PARAM_INT); $ilosc += $stmt -> execute(); // 3 if($ilosc > 0) echo 'Dodano: '.$ilosc.' rekordow'; echo 'Wystapil blad podczas dodawania rekordow!'; echo '<form method="post" action="pdo_7.php">'; for($i = 1; $i <= 4; $i++) echo '<hr/> <p>nazwa: <input type="text" name="produkty['.$i.'][nazwa]"/></p> <p>opis: <input type="text" name="produkty['.$i.'][opis]"/></p> <p>ilosc: <input type="text" name="produkty['.$i.'][ilosc]"/></p> <p>cena: <input type="text" name="produkty['.$i.'][cena]"/></p> <p>jakosc: <select name="produkty['.$i.'][jakosc]"> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> <option value="4">4</option> <option value="5">5</option> <option value="6">6</option> </select></p>'; echo '<p><input type="submit" value="dodaj"/></p></form>'; echo 'Wystapil blad biblioteki PDO: '. $e->getmessage(); Opis: Szkielet zapytania wysyłany tylko raz. Zestawy danych ładowane są w pętli. W pętli wykonujemy też metodę execute(). Podpinanie nie ogranicza się tylko do zapytań typu INSERT. Z powodzeniem można stosować je także przy SELECT.
9 Napiszemy teraz skrypt wyświetlający listę produktów oraz umożliwiający nam zobaczenie szczegółów każdego z nich. Dlatego do drugiego zapytania, pobierającego szczegółowe informacje, musimy podpiąć ID produktu, który chcemy obejrzeć. $pdo = new PDO('mysql:host=localhost;dbname=produkty;port=3305', 'root', 'root'); $pdo -> setattribute(pdo::attr_errmode, PDO::ERRMODE_EXCEPTION); $stmt = $pdo -> query('select id, nazwa FROM produkty ORDER BY id'); echo '<ul>'; while($row = $stmt -> fetch()) echo '<li><a href="pdo_8.php?id='.$row['id'].'">'.$row['nazwa'].'</a></li>'; echo '</ul>'; if(isset($_get['id'])) // 1 $stmt = $pdo -> prepare('select `nazwa`, `opis`, `ilosc`, `cena`, `jakosc` FROM `produkty` WHERE `id` = :id'); // 2 $stmt -> bindvalue(':id', $_GET['id'], PDO::PARAM_INT); $stmt -> execute(); // 3 if($details = $stmt -> fetch()) // 4 echo '<hr/> <p><b>nazwa:</b> '.$details['nazwa'].'</p> <p><b>opis:</b> '.$details['opis'].'</p> <p><b>ilosc:</b> '.$details['ilosc'].'</p> <p><b>cena:</b> '.$details['cena'].'</p> <p><b>jakosc:</b> '.$details['jakosc'].'</p>'; echo '<hr/><p>przepraszamy, podany rekord nie istnieje!</p>'; echo 'Wystapil blad biblioteki PDO: '. $e->getmessage(); Opis: Oczywiście wyświetlanie szczegółów przeprowadzamy tylko, jeśli podaliśmy ID. Przygotowujemy szkielet zapytania SELECT. 3. Wykonujemy zapytanie metodą execute(). Zauważmy, że obiektem $stmt dysponujemy już od momentu wywołania metody prepare(), dlatego execute() nam już nic tu nie zwraca. 4. Dalej postępujemy już tradycyjnie, po prostu pobierając kolejne rekordy (w tym wypadku tylko jeden) i zamykając kursor.
10 Jedyną wadą podpinania jest wydłużenie kodu PHP. Jeśli dotychczas wysyłaliśmy zapytanie DELETE zwyczajnie wykonując metodę exec(), teraz musimy to rozpisać na kilka linijek. Jednak jeszcze w tym rozdziale poznamy nakładkę na PDO zwaną Open Power Driver, dzięki której kod z powrotem stanie się krótki i czytelny. Uwaga! Biblioteka PDO działa nieco inaczej na wersjach MySQL 5.0 i 4.1 także w przypadku podpinania. Wersja 5.0 jest bardziej elastyczna, jeśli chodzi o konwersję typów i nic jej nie zaszkodzi, kiedy spróbujemy wstawić do pola TINYINT(1) wartość oznaczoną w skrypcie jako PDO::PARAM_BOOL. Na MySQL 4.1 takie zapytanie nie zostanie wykonane, a ponadto serwer DB nie wygeneruje żadnego ostrzeżenia czy komunikatu. Ćwiczenie: Zaprogramować formularz do edycji danych produktów z wykorzystaniem podpinania. Skrypt musi wczytywać do formularza dane edytowanego produktu oraz po jego wysłaniu, zmodyfikować wskazany rekord zapytaniem UPDATE. Pamiętaj: wraz z wysłanym formularzem musisz przesłać także ID rekordu, który modyfikujesz! Obsługa relacji Potrafimy już pobierać wyniki pojedynczego zapytania, potrafimy też wewnątrz jednego zapytania tworzyć relacje. Przejdźmy się jednak do naszej bazy danych księgarni i załóżmy, że chcemy wyświetlić listę kategorii oraz znajdujące się w każdej z nich książki. Sporo początkujących programistów podchodziło do tego zadania z marszu: wysyłali zapytanie żądające pobrania listy kategorii, a następnie w pętli kolejne, które dla aktualnej kategorii pobierało książki. Od razu przestrzegamy przed takim sposobem myślenia! Łamie on podstawową zasadę pracy z bazami danych mówiącą, że generalnie im mniej zapytań, tym lepiej. Ilość wysyłanych zapytań musi być względnie stała i poważnym błędem jest dopuszczenie do sytuacji, gdy zależy ona wprost proporcjonalnie od ilości pobieranych danych. PHP Data Objects niejako wymusza rezygnację z tej techniki, ponieważ wspominaliśmy, że nie można wysłać innego zapytania, kiedy nie skończyliśmy pobierać wyników jednego i nie zamknęliśmy jego kursora. Jak więc zatem poradzić sobie z tym zadaniem? Jest to bardzo proste - nasz skrypt będzie bez względu na ilość kategorii wykonywać dwa zapytania, których wynik będzie ładowany do tablicy. Dopiero z niej będzie wyświetlany kod HTML. $pdo = new PDO('mysql:host=localhost;dbname=produkty;port=3305', 'root', 'root'); $pdo -> setattribute(pdo::attr_errmode, PDO::ERRMODE_EXCEPTION); $stmt = $pdo -> query('select id, nazwa FROM kategorie ORDER BY id'); $wynik = array(); while($row = $stmt -> fetch()) $wynik[$row['id']] = array( // 1 'nazwa' => $row['nazwa'], 'ksiazki' => array() // 2 ); $stmt = $pdo -> query('select nazwa, wydawnictwo, kategoria_id FROM ksiazki ORDER BY kategoria_id, id'); // 3 while($row = $stmt -> fetch()) $wynik[$row['kategoria_id']]['ksiazki'][] = array( // 4 'nazwa' => $row['nazwa'], 'wydawnictwo' => $row['wydawnictwo'] );
11 // 5 foreach($wynik as &$kategoria) echo '<h3>'.$kategoria['nazwa'].'</h3>'; foreach($kategoria['ksiazki'] as &$ksiazka) echo '<p><i>'.$ksiazka['nazwa'].'</i> (Wyd. '.$ksiazka['wydawnictwo'].')</p>'; echo 'Wystapil blad biblioteki PDO: '. $e->getmessage(); Sztuczka jest tu bardzo prosta - wykorzysujemy ID kategorii jako indeks tablicy (1). Ładujemy do niej nazwę kategorii oraz tworzymy pustą tablicę ksiazki (2) - tutaj będą trafiały książki należące do tej kategorii. Następnie wysyłamy zapytanie służące do pobrania wszystkich książek (3). Zauważmy, że sortujemy je najpierw według ID kategorii, a ponadto tenże ID pobieramy. Wykorzystany zostaje jako klucz dostępu, dzięki czemu jesteśmy w stanie ulokować daną książkę w odpowiedniej kategorii (4). Na końcu dwoma zagnieżdżonymi pętlami wyświetlamy wszystko. Sposób opiera się na wcześniejszym zbuforowaniu danych. W praktyce programiści bardzo często tworzą takie bufory, ponieważ pozwalają one na dodatkową obróbkę pobranych danych, a w przypadku korzystania z systemu szablonów są nawet niezbędne. Ćwiczenie: Zmodyfikować powyższy skrypt tak, aby przy nazwie książki wymienieni byli również wszyscy jej autorzy, tłumacze, itd. Skrypt może wysyłać najwyżej cztery zapytania. Open Power Driver PHP Data Objects jest tylko jednolitym interfejsem komunikacji i brak mu części funkcjonalności oferowanej przez prawdziwe kombajny zwane warstwami bazy danych (np. ADODb czy Creole). Nadaje się on jednak bardzo łatwo do rozbudowy. Zapoznamy się teraz z polską biblioteką Open Power Driver będącą nakładką na PDO. Zachowuje ona niemal w całości oryginału, dlatego wszystko, co do tej pory powiedzieliśmy sobie o PDO, będzie miało zastosowanie także do OPD. Biblioteka ta udostępnia jednak kilka dodatkowych możliwości oraz upraszcza wykonywanie niektórych czynności. Open Power Driver napisany jest w PHP 5 i jest częścią projektu Open Power Board, w skład którego wchodzi już m.in. potężny system szablonów oraz system obsługi formularzy. Aby móc go używać, należy wejść na stronę WWW projektu: [1] i pobrać archiwum z najnowszą wersją. Archiwum zawiera, oprócz przykładów i dokumentacji opisującej różnice między biblioteką, a PDO, kod źródłowy umieszczony w katalogu lib. Kopiujemy jego zawartość do katalogu z naszymi skryptami i właściwie to wszystko. Przyjrzyjmy się uważniej jednemu z pierwszych przykładów tego rozdziału przepisanemu z użyciem OPD: define('opd_dir', './opd/'); require(opd_dir.'opd.class.php'); // 1 $pdo = opdclass::create(array( // 2 'dsn' => 'mysql:host=localhost;dbname=produkty;port=3305', 'user' => 'root',
12 'password' => 'root', 'debugconsole' => true )); // 2a $stmt = $pdo -> query('select nazwa FROM produkty ORDER BY id'); // 3 echo '<ul>'; while($row = $stmt -> fetch()) echo '<li>'.$row['nazwa'].'</li>'; echo '</ul>'; opderrorhandler($e); // 4 Opis: 1. OPD pisany jest w PHP, dlatego najpierw musimy dołączyć kod źródłowy biblioteki. Wcześniej musimy też ustawić stałą OPD_DIR wskazującą na katalog ze źródłami. 2. OPD posiada nieco więcej opcji konfiguracyjnych, dlatego też nawiązywanie połączenia wygląda nieco inaczej. Konfiguracja może być czytana z tablicy (jak w naszym przypadku) lub z pliku INI. Należy także dodać, że OPD automatycznie przełącza się w b raportowania błędów za pomocą wyjątków i my już nie musimy tego robić. 3. Pozostała część kodu jest już taka sama, jak dla PDO. 4. Open Power Driver posiada też funkcję elegancko formatującą komunikaty błędów, której możemy użyć, jeśli nie mamy ochoty pisać własnej. Po uruchomieniu skryptu zauważymy, że nasza przeglądarka chce wyświetlić okienko pop-up. To tak zwana konsola debugowa, którą uruchomiliśmy dyrektywą debugconsole (2a). Konsola zawiera użyteczne informacje przeznaczone dla programisty. Pokazuje ona: Konfigurację OPD Łączny czas wykonywania wszystkich zapytań Informacje dotyczące przeprowadzanych transakcji Listę wszystkich wykonanych zapytań wraz z informacjami o tym, czy były one cache'owane oraz jak długo je wykonywano. Kiedy popracujesz trochę z bazami danych, zauważysz, że niektóre zapytania pobierają w kółko te same informacje, niepotrzebnie obciążając serwer DB. Open Power Driver pozwala cache'ować wyniki zapytań, jeśli te stosunkowo rzadko ulegają zmianom. Cache'owanie polega na zrzuceniu zbioru wyników do zwykłego pliku. Jeśli przy następnym odświeżeniu strony OPD stwierdzi, że plik cache istnieje, w ogóle nie wysyła do bazy żadnego zapytania, tylko odczytuje dane z tego właśnie pliku, co jest znacznie szybsze. Napiszemy teraz skrypt wyświetlający listę produktów - ponieważ nie zmienia się ona co sekundę, możemy wyniki zapytania SELECT scache'ować. Zaczniemy od stworzenia w katalogu z naszym skryptem folderu cache/opd/, w którym OPD będzie mógł sobie trzymać pliki z wynikami zapytań. Katalog ten musimy określić podczas tworzenia obiektu dyrektywą cache - inaczej OPD zignoruje wszystkie żądania cache'owania: define('opd_dir', './opd/'); require(opd_dir.'opd.class.php'); $pdo = opdclass::create(array(
13 'dsn' => 'mysql:host=localhost;dbname=produkty;port=3305', 'user' => 'root', 'password' => 'root', 'cache' => './cache/opd/', // 1 'debugconsole' => true )); $pdo -> setcacheexpire(60, 'lista_produktow'); // 2 $stmt = $pdo -> query('select nazwa FROM produkty ORDER BY id'); echo '<ul>'; while($row = $stmt -> fetch()) echo '<li>'.$row['nazwa'].'</li>'; echo '</ul>'; echo '<p>wykonanych zapytan: '.$pdo -> getcounter().'</p>'; // 3 opderrorhandler($e); Opis: 1. Określamy katalog dla systemu cache. 2. Aby scache'ować wynik określonego zapytania, wywołujemy tuż przed nim metodę setcacheexpire(). Określa ona, że jego zbiór wyników dostanie identyfikator lista_produktow oraz że jego ważność to 60 sekund. Po tym czasie plik cache będzie ponownie aktualizowany. 3. Pokazujemy, ile zapytań SQL wykonał OPD. Odśwież skrypt kilka razy. Zauważysz, że przy pierwszym uruchomieniu zostało wysłane jedno zapytanie, lecz przy następnych już zero. Dane są czytane z pliku cache. Po upływie 60 sekund znowu wykona się jedno zapytanie, a później żadne itd. Open Power Driver dodatkowo optymalizuje wszystko w pewien ciekawy sposób: otóż połączenie z bazą nie jest nawiązywane tak naprawdę w momencie wykonania metody opdclass::create(), lecz w momencie fizycznego wysłania pierwszego zapytania. Tak więc jeśli nasz skrypt wysyła zero zapytań, tak naprawdę nie nawiązuje też żadnego połączenia z serwerem DB (bo w sumie po co?). Open Power Driver posiada znacznie większe możliwości, jeśli chodzi o cache: Cache'owanie bezterminowe - w przypadku modyfikacji danych musimy samodzielnie usunąć plik cache, ale za to cache jest aktualizowany tylko wtedy, gdy faktycznie dane te ulegają zmianie. Opcja bardzo przydatna dla stron o niewielkim ruchu. Cache'owanie zapytań wykorzystujących podpinanie. Szczegółowy monitoring cache'owanych zapytań w konsoli debugowej. Więcej szczegółów dostępnych jest w dokumentacji. Wspomnieliśmy wcześniej, że korzystanie z podpinania wydłuża kod wielu operacji. Open Power Driver pozwala go z powrotem zredukować do normalnych rozmiarów w niektórych przypadkach dzięki istnieniu kilku metodułatwiaczy, automatyzujących pewne czynności. Przykładowo, metoda exec() może przyjmować drugi parametr - jeśli podamy za jego pomocą jakąś wartość, zostanie ona automatycznie podpięta do wstawki :id. Poniższy przykład służy do zwiększania o 1 ilości wybranego produktu. define('opd_dir', './opd/'); require(opd_dir.'opd.class.php');
14 $pdo = opdclass::create(array( 'dsn' => 'mysql:host=localhost;dbname=produkty;port=3305', 'user' => 'root', 'password' => 'root', 'cache' => './cache/opd/', 'debugconsole' => true )); $pdo -> setcacheexpire(60, 'lista_produktow_2'); $stmt = $pdo -> query('select id, nazwa FROM produkty ORDER BY id'); echo '<ul>'; while($row = $stmt -> fetch()) echo '<li><a href="pdo_12.php?id='.$row['id'].'">'.$row['nazwa'].'</a></li>'; echo '</ul>'; if(isset($_get['id'])) $pdo -> exec('update `produkty` SET `ilosc` = (`ilosc` + 1) WHERE id = :id', $_GET['id']); // 1 echo '<p>ilość prawidłowo zwiększona.</p>'; echo '<p>wykonanych zapytan: '.$pdo -> getcounter().'</p>'; echo 'Wystapil blad biblioteki PDO: '. $e->getmessage(); Zauważmy: gdybyśmy korzystali z oryginalnego PDO, musielibyśmy zapytanie UPDATE rozpisać na trzy linijki z wykorzystaniem metod prepare(), bindvalue() oraz execute() tylko dlatego, że chcemy określić ID, którego ta operacja dotyczy. W OPD wystarczy podać tenże ID jako drugi parametr metody exec() - zostanie on automatycznie podpięty do wstawki :id, elegancko skracając kod. Zakończenie Nareszcie umiemy komunikować się z bazami danych z poziomu PHP, wykorzystując do tego celu bibliotekę PHP Data Objects. Nasze skrypty mogą dzięki temu w pełni czerpać z oferowanych przez bazy danych możliwości. Jednak temat baz danych nie został jeszcze zamknięty. Ponieważ PDO jest relatywnie nową biblioteką, wiele skryptów wciąż korzysta ze starych technik wywodzących się jeszcze z prehistorycznych czasów PHP 2.0/FI - dlatego też następny z rozdziałów poświęcony zostanie krótkiemu powrotowi do przeszłości. Treść pochodzi ze strony WikiBooks i jest udostępniana na licencji GNU FDL Autor: WikiBooks Artykuł pobrano ze strony eioba.pl
Aby nie być gołosłownym, przejdźmy od słów do czynów. Połączymy się z naszą bazą utworzoną podczas wcześniejszych lekcji:
PHP/Biblioteka PDO 1 PHP/Biblioteka PDO Biblioteka PDO Jeszcze rok temu programiści pragnący komunikować się z bazą danych poprzez PHP musieli zmagać się z wieloma problemami. Każdy serwer DB udostępniał
PHP: bazy danych, SQL, AJAX i JSON
1 PHP: bazy danych, SQL, AJAX i JSON SYSTEMY SIECIOWE Michał Simiński 2 Bazy danych Co to jest MySQL? Jak się połączyć z bazą danych MySQL? Podstawowe operacje na bazie danych Kilka dodatkowych operacji
Podstawy programowania III WYKŁAD 2
Podstawy programowania III WYKŁAD 2 Jan Kazimirski 1 Komunikacja z bazami danych 2 PHP i bazy danych PHP zapewnia dostęp do wielu popularnych baz danych. Kilka poziomów abstrakcji: Funkcje obsługujące
Wprowadzenie do Doctrine ORM
Wprowadzenie do Doctrine ORM Przygotowanie środowiska Do wykonania ćwiczenia konieczne będzie zainstalowanie narzędzia Composer i odpowiednie skonfigurowanie Netbeans (Tools->Options->Framework & Tools->Composer,
Autor: Joanna Karwowska
Autor: Joanna Karwowska Wygodniejszym i wydajniejszym sposobem przechowywania i korzystania z dużej ilości danych zapisanych na serwerze jest współpraca z relacyjną bazą danych. 2 1. Utworzyć bazę danych.
CREATE USER
Temat: Administrowanie użytkownikami bazy danych. Po instalacji serwera MYSQL dostępne jest konto o nazwie root. Domyślnie nie ma ono przypisanego hasła, aczkolwiek podczas procesu konfiguracji jest możliwość
ZAAWANSOWANE BAZY DANYCH I HURTOWNIE DANYCH MySQL, PHP
ZAAWANSOWANE BAZY DANYCH I HURTOWNIE DANYCH MySQL, PHP Zad. 1 Dla każdego zamówienia wyznaczyć jego wartość. Należy podać numer zamówienia oraz wartość. select z.id_zamowienia, sum(ilosc*cena) as wartosc
6. Bezpieczeństwo przy współpracy z bazami danych
6. Bezpieczeństwo przy współpracy z bazami danych 6.1. Idea ataku SQL injection Atak znany jako SQL injection jest możliwy wtedy, gdy użytkownik ma bezpośredni wpływ na postać zapytania wysyłanego do bazy
PHP może zostać rozszerzony o mechanizmy dostępu do różnych baz danych:
PHP może zostać rozszerzony o mechanizmy dostępu do różnych baz danych: MySQL moduł mysql albo jego nowsza wersja mysqli (moduł mysqli ma dwa interfejsy: proceduralny i obiektowy) PostgreSQL Oracle MS
Baza danych do przechowywania użytkowników
System logowania i rejestracji jest bardzo przydatną funkcjonalnością na każdej stronie. Umożliwia sprawną identyfikację i zarządzanie użytkownikami. Strona ze skryptem logowania nabiera dużej wartości.
Aplikacje WWW - laboratorium
Aplikacje WWW - laboratorium PHP + bazy danych Celem ćwiczenia jest przygotowanie prostej aplikacji internetowej wykorzystującej technologię PHP. Aplikacja pokazuje takie aspekty, współpraca PHP z bazami
Dostęp do baz danych z serwisu www - PHP. Wydział Fizyki i Informatyki Stosowanej Joanna Paszkowska, 4 rok FK
Dostęp do baz danych z serwisu www - PHP Wydział Fizyki i Informatyki Stosowanej Joanna Paszkowska, 4 rok FK Bazy Danych I, 8 Grudzień 2009 Plan Trochę teorii Uwagi techniczne Ćwiczenia Pytania Trójwarstwowy
Sesje, ciasteczka, wyjątki. Ciasteczka w PHP. Zastosowanie cookies. Sprawdzanie obecności ciasteczka
Sesje, ciasteczka, wyjątki Nie sposób wyobrazić sobie bez nich takich podstawowych zastosowań, jak logowanie użytkowników czy funkcjonowanie koszyka na zakupy. Oprócz tego dowiesz się, czym są wyjątki,
Wprowadzenie. Rozdział 23 PDO. Podstawowe kroki aplikacji. Źródło danych
Wprowadzenie Rozdział 23 PDO Wprowadzanie do PDO, kursory zwykłe, kursory przewijane, obsługa błędów, przetwarzanie transakcyjne PDO PHP Data Objects, obiektowo-zorientowany interfejs programistyczny dostępu
PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL IV TI 6 godziny tygodniowo (6x15 tygodni =90 godzin ),
PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH KL IV TI 6 godziny tygodniowo (6x15 tygodni =90 godzin ), Program 351203 Opracowanie: Grzegorz Majda Tematyka zajęć 2. Przygotowanie środowiska pracy
Aplikacje WWW - laboratorium
Aplikacje WWW - laboratorium PHP + bazy danych Celem ćwiczenia jest przygotowanie prostej aplikacji internetowej wykorzystującej technologię PHP. Aplikacja pokazuje takie aspekty, współpraca PHP z bazami
znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.
Część XVI C++ Funkcje Jeśli nasz program rozrósł się już do kilkudziesięciu linijek, warto pomyśleć o jego podziale na mniejsze części. Poznajmy więc funkcje. Szybko się przekonamy, że funkcja to bardzo
WINDOWS Instalacja serwera WWW na systemie Windows XP, 7, 8.
WINDOWS Instalacja serwera WWW na systemie Windows XP, 7, 8. Gdy już posiadamy serwer i zainstalowany na nim system Windows XP, 7 lub 8 postawienie na nim serwera stron WWW jest bardzo proste. Wystarczy
Wykład 5: PHP: praca z bazą danych MySQL
Wykład 5: PHP: praca z bazą danych MySQL Architektura WWW Podstawowa: dwuwarstwowa - klient (przeglądarka) i serwer WWW Rozszerzona: trzywarstwowa - klient (przeglądarka), serwer WWW, serwer bazy danych
Aplikacje WWW - laboratorium
Aplikacje WWW - laboratorium PHP. Celem ćwiczenia jest przygotowanie prostej aplikacji internetowej wykorzystującej technologię PHP. Aplikacja pokazuje takie aspekty, obsługa formularzy oraz zmiennych
Backend Administratora
Backend Administratora mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011 W tym celu korzystając z konsoli wydajemy polecenie: symfony generate:app backend Wówczas zostanie stworzona
Laboratorium 7 Blog: dodawanie i edycja wpisów
Laboratorium 7 Blog: dodawanie i edycja wpisów Dodawanie nowych wpisów Tworzenie formularza Za obsługę formularzy odpowiada klasa Zend_Form. Dla każdego formularza w projekcie tworzymy klasę dziedziczącą
Pawel@Kasprowski.pl Języki skryptowe - PHP. PHP i bazy danych. Paweł Kasprowski. pawel@kasprowski.pl. vl07
PHP i bazy danych Paweł Kasprowski pawel@kasprowski.pl Użycie baz danych Bazy danych używane są w 90% aplikacji PHP Najczęściej jest to MySQL Funkcje dotyczące baz danych używają języka SQL Przydaje się
Wydział Elektrotechniki, Informatyki i Telekomunikacji Instytut Informatyki i Elektroniki
Wydział Elektrotechniki, Informatyki i Telekomunikacji Instytut Informatyki i Elektroniki Instrukcja do zajęć laboratoryjnych Przetwarzanie i organizowanie danych : bazy danych Nr ćwiczenia 10 Temat Aplikacje
Aplikacje internetowe - laboratorium
Aplikacje internetowe - laboratorium PHP Celem ćwiczenia jest przygotowanie prostej aplikacji internetowej opartej o język PHP. Aplikacja ilustruje takie mechanizmy jak: obsługa formularzy oraz obsługa
Języki programowania wysokiego poziomu. PHP cz.4. Bazy danych
Języki programowania wysokiego poziomu PHP cz.4. Bazy danych PHP i bazy danych PHP może zostać rozszerzony o mechanizmy dostępu do różnych baz danych: MySQL moduł mysql albo jego nowsza wersja mysqli (moduł
IIIIIIIIIIIIIIIMMIMMIII
IIIIIIIIIIIIIIIMMIMMIII O programie Program Itelix itender Manager przeznaczony jest do zarządzania zapytaniami ofertowymi przesyłanymi za pomocą poczty elektronicznej przez firmy korzystające z systemu
Utworzenie pliku. Dowiesz się:
Dowiesz się: 1. Jak rozpocząć pisanie programu 2. Jak wygląda szkielet programu, co to są biblioteki i funkcja main() 3. Jak wyświetlić ciąg znaków w programie 4. Jak uruchamiać (kompilować) napisany program
Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody
Obiektowy PHP Czym jest obiekt? W programowaniu obiektem można nazwać każdy abstrakcyjny byt, który programista utworzy w pamięci komputera. Jeszcze bardziej upraszczając to zagadnienie, można powiedzieć,
instrukcja INSTALACJI www.piersa.pl APi_proxy
instrukcja INSTALACJI 1 1. Instalacja Proces instalacji jest prosty wgrywamy pliki na serwer nadajemy prawa chmod 777 lub 755 dla katalogu w którym znajduje się aplikacja przeważnie będzie to katalog public_html
Bazy danych i strony WWW
Bazy danych i strony WWW Obsługa baz danych poprzez strony WWW Niezbędne narzędzia: serwer baz danych np. MySQL serwer stron WWW np. Apache przeglądarka stron WWW interpretująca język HTML język skryptowy
Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.
Część XXII C++ w Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie. Ćwiczenie 1 1. Utwórz nowy projekt w Dev C++ i zapisz go na
Wyrażenie include(sciezka_do_pliku) pozwala na załadowanie (wnętrza) pliku do skryptu php. Plik ten może zawierać wszystko, co może się znaleźć w
Wyrażenie include(sciezka_do_pliku) pozwala na załadowanie (wnętrza) pliku do skryptu php. Plik ten może zawierać wszystko, co może się znaleźć w obrębie skryptu. Wyrażenia include() i require() są niemal
5.4. Tworzymy formularze
5.4. Tworzymy formularze Zastosowanie formularzy Formularz to obiekt bazy danych, który daje możliwość tworzenia i modyfikacji danych w tabeli lub kwerendzie. Jego wielką zaletą jest umiejętność zautomatyzowania
Pomoc dla systemu WordPress
Pomoc dla systemu WordPress Ten plik pomocy przeznaczony jest dla pluginu stat24 w wersji 0.2. W tym pluginie porzucono wsparcie dla starszych wersji WordPress (niższych niż 1.5) oraz zrezygnowano z opcji
Dokumentacja smsapi wersja 1.4
Dokumentacja smsapi wersja 1.4 1. Wprowadzenie Platforma smsapi została skierowana do użytkowników chcących rozbudować swoje aplikacje o system wysyłania smsów. Aplikacja ta w prosty sposób umożliwia integrację
Temat: Ułatwienia wynikające z zastosowania Frameworku CakePHP podczas budowania stron internetowych
PAŃSTWOWA WYŻSZA SZKOŁA ZAWODOWA W ELBLĄGU INSTYTUT INFORMATYKI STOSOWANEJ Sprawozdanie z Seminarium Dyplomowego Temat: Ułatwienia wynikające z zastosowania Frameworku CakePHP podczas budowania stron internetowych
SZYBKI START. Tworzenie nowego połączenia w celu zaszyfrowania/odszyfrowania danych lub tekstu 2. Szyfrowanie/odszyfrowanie danych 4
SZYBKI START Tworzenie nowego połączenia w celu zaszyfrowania/odszyfrowania danych lub tekstu 2 Szyfrowanie/odszyfrowanie danych 4 Szyfrowanie/odszyfrowanie tekstu 6 Tworzenie nowego połączenia w celu
Budowa aplikacji ASP.NET współpracującej z bazą dany do obsługi przesyłania wiadomości
Budowa aplikacji ASP.NET współpracującej z bazą dany do obsługi przesyłania wiadomości Rozpoczniemy od zaprojektowania bazy danych w programie SYBASE/PowerDesigner umieszczamy dwie Encje (tabele) prawym
MySQL. Æwiczenia praktyczne
IDZ DO PRZYK ADOWY ROZDZIA SPIS TRE CI KATALOG KSI EK KATALOG ONLINE ZAMÓW DRUKOWANY KATALOG MySQL. Æwiczenia praktyczne Autor: Marek Nowakowski ISBN: 83-7197-884-7 Format: B5, stron: 114 TWÓJ KOSZYK DODAJ
Dokumentacja systemu NTP rekrut. Autor: Sławomir Miller
Dokumentacja systemu NTP rekrut Autor: Sławomir Miller 1 Spis treści: 1. Wstęp 1.1 Wprowadzenie 1.2 Zakres dokumentu 2. Instalacja 2.1 Wymagania systemowe 2.2 Początek 2.3 Prawa dostępu 2.4 Etapy instalacji
14. POZOSTAŁE CIEKAWE FUNKCJE
14. POZOSTAŁE CIEKAWE FUNKCJE Funkcji jest cała masa, których nie poruszono w tym kursie. Bardziej ciekawe postaram się właśnie w tej lekcji omówić. Na pewno wielu z Was, czeka z niecierpliwością na funkcję
Instrukcja do programu Przypominacz 1.5
Instrukcja do programu Przypominacz 1.5 Program Przypominacz 1.5 pozwala w prosty sposób wykorzystać dane z systemu sprzedaży Subiekt GT do prowadzenia tzw. miękkiej windykacji poprzez wysyłanie kontrahentom
Instrukcja do programu Przypominacz 1.6
Instrukcja do programu Przypominacz 1.6 Program Przypominacz 1.6 pozwala w prosty sposób wykorzystać dane z systemu sprzedaży Subiekt GT do prowadzenia tzw. miękkiej windykacji poprzez wysyłanie kontrahentom
Laboratorium nr 4. Temat: SQL część II. Polecenia DML
Laboratorium nr 4 Temat: SQL część II Polecenia DML DML DML (Data Manipulation Language) słuŝy do wykonywania operacji na danych do ich umieszczania w bazie, kasowania, przeglądania, zmiany. NajwaŜniejsze
Instalacja SQL Server Express. Logowanie na stronie Microsoftu
Instalacja SQL Server Express Logowanie na stronie Microsoftu Wybór wersji do pobrania Pobieranie startuje, przechodzimy do strony z poradami. Wypakowujemy pobrany plik. Otwiera się okno instalacji. Wybieramy
Sprawdzenie czy połączenie przebiegło poprawnie if (mysqli_connect_errno()) { echo Błąd; Połączenie z bazą danych nie powiodło się.
Za operacje na bazie odpowiada biblioteka mysqli (i jak improved). Posiada ona interfejs obiektowy jak i proceduralny. Podłączenie do bazy (obiektowo) mysqli:: construct() ([ string $host [, string $username
Bazy danych w PHP. PHPMyAdmin
Bazy danych w PHP PHPMyAdmin PHPMyAdmin jest aplikacją internetową służącą do łatwej obsługi bazy danych MySQL. Po zalogowaniu się do aplikacji w lewej części panelu wylistowane są wszystkie bazy danych.
Odczyty 2.0 Spis treści
Opracowanie i skład: MMSoft s.c Copyright MMSoft s.c. Wszelkie prawa zastrzeżone. All Rights Reserved Powielanie w jakiejkolwiek formie całości lub fragmentów podręcznika bez pisemnej zgody firmy MMSoft
E-commerce. Genialnie proste tworzenie serwisów w PHP i MySQL.
E-commerce. Genialnie proste tworzenie serwisów w PHP i MySQL. Autor: Larry Ullman Poznaj zasady wirtualnego handlu i zarabiaj prawdziwe pieniądze Jak stworzyć doskonałą witrynę sklepu internetowego? Jak
Programowanie w Sieci Internet Python - c. d. Kraków, 28 listopada 2014 r. mgr Piotr Rytko Wydział Matematyki i Informatyki
Programowanie w Sieci Internet Python - c. d. Kraków, 28 listopada 2014 r. mgr Piotr Rytko Wydział Matematyki i Informatyki Co dziś będziemy robić Uwierzytelnianie użytkowników, Obiekt session, Silniki
Aplikacje webowe w obliczu ataków internetowych na przykładzie CodeIgniter Framework
Uniwersytet Zielonogórski Wydział Elektrotechniki, Informatyki i Telekomunikacji Aplikacje webowe w obliczu ataków internetowych na przykładzie CodeIgniter Framework mgr inż. Łukasz Stefanowicz dr inż.
Bezpieczeństwo systemów komputerowych
Bezpieczeństwo systemów komputerowych Zagrożenia dla aplikacji internetowych Aleksy Schubert (Marcin Peczarski) Instytut Informatyki Uniwersytetu Warszawskiego 15 grudnia 2015 Lista zagadnień Wstrzykiwanie
PHP: bloki kodu, tablice, obiekty i formularze
1 PHP: bloki kodu, tablice, obiekty i formularze SYSTEMY SIECIOWE Michał Simiński 2 Bloki kodu Blok if-else Switch Pętle Funkcje Blok if-else 3 W PHP blok if i blok if-else wyglądają tak samo i funkcjonują
JQuery. $('#pierwszy').css('color','red').hide('slow').show(3000); $(document).ready(function() { //... tutaj nasze skrypty jquery //...
JQuery jquery (jquery.com) to jedna z najbardziej popularnych bibliotek/frameworków do javascript. Jej popularność oczywiście znikąd się nie bierze. Dzięki tej bibliotece jesteśmy w stanie o wiele szybciej
Być może jesteś doświadczonym programistą, biegle programujesz w Javie,
Kompendium PHP 01 Być może jesteś doświadczonym programistą, biegle programujesz w Javie, C++, Pythonie lub jakimś innym języku programowania, których jak myślę, powstało już tyle, że chyba nie ma osoby,
Po instalacji serwera MYSQL dostępne jest konto o nazwie root. Domyślnie nie ma ono przypisanego hasła, aczkolwiek podczas procesu konfiguracji jest
Autor: J. Karwowska Po instalacji serwera MYSQL dostępne jest konto o nazwie root. Domyślnie nie ma ono przypisanego hasła, aczkolwiek podczas procesu konfiguracji jest możliwość nadania go. Użytkownik
15. Funkcje i procedury składowane PL/SQL
15. Funkcje i procedury składowane PLSQL 15.1. SQL i PLSQL (Structured Query Language - SQL) Język zapytań strukturalnych SQL jest zbiorem poleceń, za pomocą których programy i uŝytkownicy uzyskują dostęp
Zajęcia 13 wykorzystanie MySQL w PHP cz. 2
Zajęcia 13 wykorzystanie MySQL w PHP cz. 2 Przykład 1 wyświetlanie danych [ Plik wyswietlanie.php ] $polaczenie = mysql_connect("localhost", "root", "") or die("nie mozna polaczyc z baza!"); mysql_select_db("test",
PCSHEMATIC AUTOMATION Instalacja aktualizacji baz aparatury
PCSHEMATIC AUTOMATION Instalacja aktualizacji baz aparatury W jaki sposób zainstalować aktualizacje baz aparatury w programie PCSCHEMATIC Automation. 07-2017 Kopiowanie tego podręcznika bez zgody firmy
Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie
Część X C++ Typ znakowy służy do reprezentacji pojedynczych znaków ASCII, czyli liter, cyfr, znaków przestankowych i innych specjalnych znaków widocznych na naszej klawiaturze (oraz wielu innych, których
koledzy, Jan, Nowak, ul. Niecała 8/23, , Wrocław, , ,
Celem ćwiczeń jest zaprojektowanie oraz utworzenie na serwerze bazy danych przechowującej informacje na temat danych kontaktowych. Celem jest również zapoznanie z podstawowymi zapytaniami języka SQL służącymi
Kontrola sesji w PHP HTTP jest protokołem bezstanowym (ang. stateless) nie utrzymuje stanu między dwoma transakcjami. Kontrola sesji służy do
Sesje i ciasteczka Kontrola sesji w PHP HTTP jest protokołem bezstanowym (ang. stateless) nie utrzymuje stanu między dwoma transakcjami. Kontrola sesji służy do śledzenia użytkownika podczas jednej sesji
Podstawy technologii WWW
Podstawy technologii WWW Ćwiczenie 11 PHP, MySQL: więcej, więcej!, więcej!!. tabel i funkcjonalności. Na dzisiejszych zajęciach zdefiniujemy w naszej bazie kilka tabel powiązanych kluczem obcym i zobaczymy,
Zagadnienia. Konstrukcja bibliotek mysql i mysqli w PHP. Dynamiczne generowanie stron. Połączenie, zapytanie i sesja
Zagadnienia Konstrukcja bibliotek mysql i mysqli w PHP Dynamiczne generowanie stron Połączenie, zapytanie i sesja Podstawowe opakowanie dla zapytań SQL w PHP Zarządzania uŝytkownikami Włamania do mysql
Instalacja systemu zarządzania treścią (CMS): Joomla
Instalacja systemu zarządzania treścią (CMS): Joomla Na stronie http://www.cba.pl/ zarejestruj nowe konto klikając na przycisk:, następnie wybierz nazwę domeny (Rys. 1a) oraz wypełnij obowiązkowe pola
KOMPUTEROWY SYSTEM WSPOMAGANIA OBSŁUGI JEDNOSTEK SŁUŻBY ZDROWIA KS-SOMED INSTRUKCJA OBSŁUGI
KOMPUTEROWY SYSTEM WSPOMAGANIA OBSŁUGI JEDNOSTEK SŁUŻBY ZDROWIA KS-SOMED INSTRUKCJA OBSŁUGI INTEGRACJA KS-SOMED Z PPS w zakresie rozliczeń z NFZ 2014 Spis treści 1. Konfiguracja systemów KS-SOMED i KS-PPS...
Currenda EPO Instrukcja Konfiguracji. Wersja dokumentu: 1.3
Currenda EPO Instrukcja Konfiguracji Wersja dokumentu: 1.3 Currenda EPO Instrukcja Konfiguracji - wersja dokumentu 1.3-19.08.2014 Spis treści 1 Wstęp... 4 1.1 Cel dokumentu... 4 1.2 Powiązane dokumenty...
www.kwp.edu.pl Instrukcja obsługi/instalacji platformy Krok w Przedsiębiorczość Administrator platformy
www.kwp.edu.pl Instrukcja obsługi/instalacji platformy Krok w Przedsiębiorczość Administrator platformy Wersja: 4_23/07/2012 1 Spis treści 1. Wymagania... 3 2. Konfiguracja serwera... 3 3. Parametry konfiguracyjne
MVC w praktyce tworzymy system artykułów. cz. 2
MVC w praktyce tworzymy system artykułów. cz. 2 W drugiej części artykułu o wzorcu MVC stworzymy część skryptu, odpowiedzialną za obsługę kategorii. Tworzymy kontroler kategorii Na początek stwórzmy plik
Zakres tematyczny dotyczący kursu PHP i MySQL - Podstawy pracy z dynamicznymi stronami internetowymi
Zakres tematyczny dotyczący kursu PHP i MySQL - Podstawy pracy z dynamicznymi stronami internetowymi 1 Rozdział 1 Wprowadzenie do PHP i MySQL Opis: W tym rozdziale kursanci poznają szczegółową charakterystykę
Administracja i programowanie pod Microsoft SQL Server 2000
Administracja i programowanie pod Paweł Rajba pawel@ii.uni.wroc.pl http://www.kursy24.eu/ Zawartość modułu 5 Kursory w SQL Serverze Wprowadzenie Modele kursorów Używanie kursorów Rodzaje kursorów Praca
Dokumentacja serwisu internetowego Zespołu Szkół Technicznych w Radomiu.
Dokumentacja serwisu internetowego Zespołu Szkół Technicznych w Radomiu. Wykonanie: Radom Maj 2008 1 Serwis WWW szkoły w Internecie to obecnie najszybszy i najtańszy sposób dotarcia do największego kręgu
BACKUP BAZ DANYCH FIREBIRD
BACKUP BAZ DANYCH FIREBIRD SPIS TREŚCI Informacje ogólne... 2 Tworzenie projektu... 2 Krok 1: Informacje podstawowe... 2 Krok 2: Dane... 3 Backup bazy umieszczonej na serwerze... 3 Bezpośredni backup pliku
5. Współpraca z bazą danych MySQL
5. Współpraca z bazą danych MySQL 5.1. Informacje ogólne Język PHP posiada obsługę wielu relacyjnych baz danych, jedną z najpopularniejszych jest baza MySQL. PHP pozwala na pełną współpracę z bazą. Praca
Ćwiczenie: JavaScript Cookies (3x45 minut)
Ćwiczenie: JavaScript Cookies (3x45 minut) Cookies niewielkie porcje danych tekstowych, które mogą być przesyłane między serwerem a przeglądarką. Przeglądarka przechowuje te dane przez określony czas.
Instalacja (GM) AMXBans #1.5.1/ #1.6.1 na serwerze gry/stronie WWW. Wymagania
Instalacja (GM) AMXBans #1.5.1/ #1.6.1 na serwerze gry/stronie WWW Wymagania Aby poprawnie zainstalować (GM) AMXBans # 1.5.1/ # 1.6.1, potrzebujemy; * Najnowsze wydanie MetaModa * Najnowsza wersja AMXMod
Oracle Application Express
Oracle Application Express Dla Oracle Application Express 4.2.2 Część 5. Walidacja operacji W niniejszej części ćwiczenia uzupełnimy wcześniej zbudowane strony o możliwość weryfikacji poprawności wykonywanych
Podstawy technologii WWW
Podstawy technologii WWW Ćwiczenie 8 PHP, czyli poczatki nowej, dynamicznej znajomosci Na dzisiejszych zajęciach rozpoczniemy programowanie po stronie serwera w języku PHP. Po otrzymaniu żądania serwer
Modele danych walidacja widoki zorientowane na model
Modele danych walidacja widoki zorientowane na model 1. Wprowadzenie Modele danych Modele danych w ASP.NET MVC to klasy znajdujące się w katalogu Models. Ich zadaniem jest mapowanie danych przesyłanych
Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska
Instytut Mechaniki i Inżynierii Obliczeniowej www.imio.polsl.pl fb.com/imiopolsl @imiopolsl Wydział Mechaniczny Technologiczny Politechnika Śląska Laboratorium 1 Wprowadzenie, podstawowe informacje o obsłudze
Wysyłanie pliku na serwer. Plik na serwerze.
Wysyłanie pliku na serwer Dzięki PHP możemy w łatwy i przyjemny sposób obsłużyć pliki uploadowane na serwer. Jednak, by prawidłowo wysłać plik, niezbędny będzie odpowiedni formularz HTML. Poniżej przedstawię
Uruchamianie bazy PostgreSQL
Uruchamianie bazy PostgreSQL PostgreSQL i PostGIS Ten przewodnik może zostać pobrany jako PostgreSQL_pl.odt lub PostgreSQL_pl.pdf Przejrzano 10.09.2016 W tym rozdziale zobaczymy, jak uruchomić PostgreSQL
ASP.NET MVC. Podstawy. Zaawansowane programowanie internetowe Instrukcja nr 3
3 ASP.NET MVC Podstawy 1 1. Cel zajęć Celem zajęć jest zapoznanie się z podstawami ASP.NET MVC 2.0 Framework. 2. Zadanie Proszę zbudować prostą aplikację WWW przy zastosowaniu framework a ASP.NET MVC 2.0
Pracownia internetowa w każdej szkole (edycja Jesień 2007)
Instrukcja numer D1/05_03/Z Pracownia internetowa w każdej szkole (edycja Jesień 2007) Opiekun pracowni internetowej cz. 1 Ręczne zakładanie kont użytkowników (D1) Jak ręcznie założyć konto w systemie
Kalipso wywiady środowiskowe
Kalipso wywiady środowiskowe Instrukcja obsługi INFO-R Spółka Jawna - 2017 43-430 Pogórze, ul. Baziowa 29, tel. (33) 479 93 29, (33) 479 93 89 fax: (33) 853 04 06 e-mail: admin@ops.strefa.pl Spis treści:
Trigger jest obiektem związanym z tablicą, który aktywuje się gdy do tablicy następuje odpowiednie zapytanie.
Temat: Wyzwalacze (triggery). Trigger jest obiektem związanym z tablicą, który aktywuje się gdy do tablicy następuje odpowiednie zapytanie. W poniższym przykładzie definiujemy tablicę a następnie trigger
KatMPBSoft marekbilski@katmpbsoft.pl - 1 -
Przedstawiona dokumentacja UML jest ściśle chroniona prawami autorskimi. Jej celem jest jedynie pokazanie w jaki sposób firma KatMPBSoft, takie dokumentacje przygotowuje. Dokumentacja UML nie może być
Aplikacje WWW - laboratorium
Aplikacje WWW - laboratorium Serwlety Celem ćwiczenia jest przygotowanie kilku prostych serwletów ilustrujących możliwości tej technologii. Poszczególne ćwiczenia prezentują sposób przygotowania środowiska,
Hosting WWW Bezpieczeństwo hostingu WWW. Dr Michał Tanaś (http://www.amu.edu.pl/~mtanas)
Hosting WWW Bezpieczeństwo hostingu WWW Dr Michał Tanaś (http://www.amu.edu.pl/~mtanas) Najgroźniejsze ataki na serwer WWW Najgroźniejsze ataki na serwer WWW Cross-site scripting (XSS) SQL injection Denial
Czym są właściwości. Poprawne projektowanie klas
Z akcesorów get i set korzysta każdy kto programuje w C#. Stanowią one duże udogodnienie w programowaniu obiektowym. Zapewniają wygodę, bezpieczeństwo i znacząco skracają kod. Akcesory są ściśle związane
SQL injection. Metody włamań do systemów komputerowych p. 1/13. Bogusław Kluge, Karina Łuksza, Ewa Makosa
Metody włamań do systemów komputerowych SQL injection Bogusław Kluge, Karina Łuksza, Ewa Makosa b.kluge@zodiac.mimuw.edu.pl, k.luksza@zodiac.mimuw.edu.pl, e.makosa@zodiac.mimuw.edu.pl Metody włamań do
dziennik Instrukcja obsługi
Ham Radio Deluxe dziennik Instrukcja obsługi Wg. Simon Brown, HB9DRV Tłumaczenie SP4JEU grudzień 22, 2008 Zawartość 3 Wprowadzenie 5 Po co... 5 Główne cechy... 5 baza danych 7 ODBC... 7 Który produkt
Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;
Klasy w C++ są bardzo ważnym narzędziem w rękach programisty. Klasy są fundamentem programowania obiektowego. Z pomocą klas będziesz mógł tworzyć lepszy kod, a co najważniejsze będzie on bardzo dobrze
Platforma.NET laboratorium 4 Aktualizacja: 15/11/2013. Visual Basic.NET dostęp do bazy danych. Baza Microsoft SQL Server Compact
Platforma.NET laboratorium 4 Aktualizacja: 15/11/2013 Prowadzący: mgr inż. Tomasz Jaworski Strona WWW: http://tjaworski.kis.p.lodz.pl/ Visual Basic.NET dostęp do bazy danych Baza Microsoft SQL Server Compact
Data modyfikacji: 2013-08-14
Data modyfikacji: 2013-08-14 Co zawiera ten dokument: Ten dokument przedstawia, w jaki sposób zainstalować program Kancelaris PLUS 4 za pomocą standardowego instalatora na serwerze MySQL w wersji 5.0 i
Ćwiczenia laboratoryjne nr 11 Bazy danych i SQL.
Prezentacja Danych i Multimedia II r Socjologia Ćwiczenia laboratoryjne nr 11 Bazy danych i SQL. Celem ćwiczeń jest poznanie zasad tworzenia baz danych i zastosowania komend SQL. Ćwiczenie I. Logowanie
Bazy Danych. Ćwiczenie 1: Przygotowanie środowiska pracy dla bazy MySQL z wykorzystaniem XAMPP Portable Lite oraz MySQL-Front
Instytut Sterowania i Systemów Informatycznych Uniwersytet Zielonogórski Bazy Danych Ćwiczenie 1: Przygotowanie środowiska pracy dla bazy MySQL z wykorzystaniem XAMPP Portable Lite oraz MySQL-Front opracował:
Budowa aplikacji ASP.NET współpracującej z bazą danych do obsługi przesyłania wiadomości
Budowa aplikacji ASP.NET współpracującej z bazą danych do obsługi przesyłania wiadomości Rozpoczniemy od zaprojektowania bazy danych w programie SYBASE/PowerDesigner umieszczamy dwie Encje (tabele) prawym