Laboratorium z przedmiotu Aplikacje klient-serwer - zestaw 05 Cel zajęć. Celem zajęć jest zapoznanie się z realizacją aplikacji posiadających dostęp do danych. Wprowadzenie teoretyczne. Rozważana w ramach niniejszych zajęć tematyka stanowi wprowadzenie do tworzenia aplikacji w języku ASP.NET, które to posiadają dostęp do bazy danych MSSQL Server 2008. Aby ze zrozumieniem zrealizować zadania, przewidziane do wykonania w ramach zajęć laboratoryjnych, należy zapoznać się z następującymi zagadnieniami: kontrolka GridView, kontrolka DataList, kontrolka DetailsView, klasa DataSet, klasa DataTable i klasa DataRow. Kontrolkę jaką używamy w celu otrzymania źródeł danych korzystamy z SqlDataSource. 1. Kontrolka GridView Posiadając kontrolkę która dostarcza nam danych pierwszym zadaniem jest ich wyświetlenie. Do tego celu między innymi służy kontrolka GridView. Jest ona traktowana jako podstawowa kontrolka wyświetlająca dane otrzymane ze źródła danych. Wywodzi się z klasy BaseDataBoundControl, ale posiada wiele właściwości nie dziedziczonych po tejże klasie. Najważniejsze przedstawia tabela: AllowPaging AllowSorting Określa, czy zostaje włączone stronicowanie, domyślnie false. Określa, czy zostaje włączone sortowanie, domyślnie false. AutoGenerateColumns Dla wartości true(domyślnie) zostaje automatycznie utworzone pole dla każdego pola w źródle danych. AutoGenerate[DeleteButton/EditButton/SelectButton] Caption CellPadding Columns DataKeys DataSource EditIndex EmptyDataRowStyle EmptyDataText FooterRow GirdLines Domyślnie false dla każdego przycisku. Jeżeli jest true, dla każdego pola zostanie automatycznie dodany przycisk(usuwania, edycji bądź wyboru). Teks wygenerowany jako element nagłówka HTML. Liczba pikseli między zawartością komórki a jej krawędzią. Zwraca zbiór obiektów DataControlField. Zbiór wartości klucza każdego rekordu. Określa źródło danych kontrolki. Rozpoczynający się od zera indeks wierszy do edycji. Domyślna -1 wskazuje, że nie ma wierszy do edycji. Wywodzi się z klasy WebControls.Style. Własność stylu pustego wiersza danych. Tekst, który zostanie wyświetlony, gdy kontrolka dołączona do źródła danych nie zawiera żadnych rekordów. Zwraca wiersz stopki jako obiekt GridViewRow. Określa, które linie siatki zostaną wyświetlone, 1
domyślnie None. HorizontalAlign Określa poziome wyrównanie elementów wewnątrz pojemnika takiego jak komórka. Wartością domyślną jest NotSet. PageCount PageIndex PageSize Wymagana liczba stron do wyświetlenia danych. Rozpoczynający się od zera indeks bieżącej strony. Liczba rekordów, które mają zostać wyświetlone na stronie. Rows Zwraca zbiór GridRowView, składający się z danych w kontrolce. SelectedDataKey SelectedIndex SelectedValue SortDirection SortExpression TopPaperRow Zwraca wartość DataKey wraz z wartością klucza aktualnie zaznaczonego wiersza. Rozpoczynający się od zera indeks aktualnie zaznaczonych elementów. Jeżeli takich brak(nie zostały zaznaczone) to wartością zwróconą będzie -1. Zwraca wartość DataKey aktualnie zaznaczonego wiersza. Zwraca aktualny kierunek sortowania. Zwraca nazwę sortowanej kolumny. Zwraca górny wiersz stronicowania jako obiekt GridViewRow. 2. Kontrolka DataList Służy do tworzenia list danych na podstawie szablonów(wymienione niżej) Na podstawie niego jest jedną z tych, w której sterujemy kodem HTML użytym do wygenerowania listy przez zdefiniowanie szablonów: kodu HTML, opisującego sposób wyświetlania pojedynczego elementu listy. Szablony kontrolki DataList: AlternativeItemTemplate Określa zawartość i wygląd każdego innego elementu. Jeżeli nie zostanie zdefiniowany, dla każdego elementu w kontrolce DataList zostanie zastosowany ItemTemplate. EditItemTemplate FooterTemplate HeaderTemplate Określa zawartość i wygląd każdego elementu, który jest poddawany edycji w danej chwili. Domyślnie gdy nie zdefiniowany to ItemTemplate. Określa zawartość i wygląd stopki. Jeżeli się tego nie określi, DataList nie będzie jej posiadać. Określa zawartość i wygląd nagłówka, tak jak ze stopką, nie określenie tego parametru oznacza jego brak. 2
ItemTemplate SelectedItemTemplate Wymagany. Domyślna definicja dla zawartości i wyglądu każdego elementu. Określa zawartość i wygląd separatorów między elementami. Jeżeli nie zostanie zdefiniowany to ich nie będzie. Właściwości kontrolki DataList, nie dziedziczone z klasy WebControl: Caption Teks wygenerowany jako element nagłówka HTML. CellPading DataKeyField DataKeys DataMember DataSource EditItmeIndex EditItemStyle GridLines Items RepeatColumns Liczba pikseli między zawartością komórki a jej krawędzią. Określa pole klucza w źródle danych. Zbiór wartości kluczy każdego rekordu. Określa element danych w wieloelementowym źródle danych. Określa źródło danych komórki. Rozpoczynający się od zera indeks elementów aktualnie zaznaczonych w celu edycji. Jeżeli nie zostały zaznaczone żadne to wartość -1. Własność stylu(z WebControl.Style) dla aktualnie zaznaczonego w celu edycji elementu. Określa, które linie siatki zostaną wyświetlone, domyślnie None. Zbiór wszystkich elementów kontrolki. Określa liczbę wyświetlanych kolumn. RepeatDirection Dla wartości Horizontal elementy zostaną wyświetlone od lewej do prawej strony potem od góry do dołu. Dla wartości Veritical będzie to od góry do dołu do lewej do prawej(wartość domyślna). SelectedIndex Rozpoczynający się zera indeks aktualnie zaznaczonych elementów. Jeżeli ich brak to -1. SelectedItem SelectedValue Zwraca aktualnie zaznaczony element. Zwraca zaznaczony aktualnie element. 3. Kontrolka DetailsView Służy do wyświetlania danych podobnie jak DataList, przy czym tutaj wyświetlany jest jeden rekord w danym momencie. Wywodzi się z klasy BaseDataBoundControl i współpracuje z kontrolką GridView i ma wiele tych samych właściwości. 3
Niektóre właściwości kontrolki DetailsView: AllowPaging AutoGenerateDeleteButton AutoGenerateRows BottomPagerRow CellSpacing CurrentMode DataItem DataKey DataKeyNames DataSource EmptyDataText EnablePagingCallbacks Fields Określa, czy zostało włączone stronicowanie, domyślnie false. Jeżeli przyjmie wartość true, to do każdego wiersza zostanie dołączony przycisk Delete(domyślnie false). Dla wartości true, wyświetli automatycznie pola połączonych danych(domyślnie). Zwraca dolny wiersz stronicowania jako obiekt DetailsViewRow. Liczba pikseli między komórkami a siatką. Zwraca aktualny tryb edycji kontrolki. Dopóki nie zostanie ustawione inaczej za pomocą DefaultMode wartością domyślną jest ReadOnly. Zwraca odniesienie do aktualnie wyświetlanego elementu w komórce. Zwraca klucz podstawowy bieżącego elementu. Tablica pól podstawowych elementów. Określa źródło danych kontrolki. Tekst wyświetlany gdy kontrolka jest dołączona do źródła danych, które nie zawiera rekordów. Dla true, do stronicowania będą wykorzystywane wywołania zwrotne po stronie klienta domyślnie false. Zwraca zbiór wszystkich pól w kontrolce. GridLines Określa, które linie siatki zostaną wyświetlone domyślnie None. InsertRowStyle PageIndex PagerSettings SelectedValue TopPagerRow Wywodzące się z klasy WebControl.Style właściwości stylów dla umieszczanego wiersza. Rozpoczynający się od zera indeks bieżącej strony. Zwraca obiekt PagerSettings, który pozwala na przeprowadzenie konfiguracji przycisków stronicowania. Zwraca wartość klucza aktualnie zaznaczonego wiersza. Zwraca górny wiersz stronicowania jako obiekt DetailsViewRow. 4
4. Klasa DataSet Klasa DataSet stanowi bogaty podzbiór całej bazy danych. Jest buforowany w stanie sesji lub w pamieci komputera czyli bez ciągłego połączenia z bazą danych. Zbiór ten będzie okresowo nawiązywał połączenie ze swoją bazą danych w celu aktualizacji i wprowadzenia zmian do bazy. Ważne właściwości klasy DataSet(read only): DefaultViewManager HasErrors Relations Tables Zwraca podgląd danych w klasie DataSet, który pozwala na filtrowanie, wyszukiwanie i nawigowanie między nimi. Zwraca wartość true, jeżeli wystąpiły jakiekolwiek błędy w dowolnym rekordzie jakiejkolwiek tabeli. Zwraca zbiór obiektów DataRealtions. Zwraca zbiór obiektów DataTable. AcceptChanges Akceptuje wszystkie zmiany, które zostały wprowadzone od momentu wczytania lub poprzedniego wywołania metody AcceptChanges. Clear Usuwa dowolne dane ze zbioru danych. GetChanges Zwraca kopię zbioru danych zawierającego wszystkie zmiany wprowadzone od momentu wczytania poprzedniego wywołania lub wywołania metody AcceptChanges. GetXML GetXMLSchema Merge ReadXML RejectChanges WriteXML Zwraca reprezentację danych XML w zbiorze danych. Zwraca schemat XSD dla reprezentacji danych XML w zbiorze danych. Scala dane ze zbioru z innym zbiorem danych. Wczytuje schemat XML oraz dane do zbioru danych. Powoduje powrót do stanu ostatniej operacji AcceptChanges. Zapisuje schemat XML oraz dane ze zbioru danych. 5. Klasa DataTable Właściwość Tables obiektu DataSet zwraca zbiór DataTableCollection, który z kolei zawiera wszystkie obiekty DataTable ze zbioru danych. Najważniejsze właściwości i metody klasy DataTable przedstawia tabela: Ważne właściwości i metody klasy DataTable: ChildRelations Columns Constrains Zwraca zbiór relacji obiektów potomnych. Zwraca zbiór kolumn. Zwraca zbiór powiązań. 5
DefaultView PrimaryKey Zwraca widok tabeli z możliwością filtrowania. Tablica kolumn jako klucz podstawowy danej tabeli. AcceptChanges Akceptuje wszystkie zmiany, które zostały wprowadzone od momentu wczytania lub poprzedniego wywołania metody AcceptChanges. Clear GetChanges GetErrors ImportRow LoadDataRow Usuwa wszystkie dane z tabeli. Zwraca kopię obiektu DataTable, który zawiera wszystkie zmiany wprowadzone od momentu poprzedniego wywołania metody AcceptChanges. Zwraca tablice rekordów zawierających błędy. Kopiuje rekord do tabeli, włączając wszystkie wartości i ustawienia. Odnajduje i uaktualnia określony rekord. Jeżeli nie zostanie znaleziony pasujący rekord, wówczas metoda tworzy nowy. Merge Scala określony obiekt DataTable z bieżącym obiektem DataTable. NewRow Tworzy obiekt DataRow, zachowując ten sam schemat który jest w tabeli. 6. Klasa DataRow Zwraca zestaw rekordów dla podanej tabeli. Ten zbiór jest wykorzystywany do analizowania wyników zapytania względem bazy danych przechodząc przez rekordy i je odpowiednio analizując. Ważne właściwości i metodyklasy DataRow: Item Pobiera lub ustawia dane przechowywane w określonej kolumnie(w C# jest to indexer). HasErrors ItemArray Table Zwraca wartość true, jeżeli wystąpiły jakiekolwiek błędy w dowolnym rekordzie jakiejkolwiek tabeli. Pobiera lub ustawia wszystkie wartości rekordu, używając w tym celu tablicy. Pobiera tablicę, która posiada dany rekord. AcceptChanges Akceptuje wszystkie zmiany, które zostały wprowadzone od momentu wczytania lub poprzedniego wywołania metody AcceptChanges. BeginEdit Rozpoczyna operacje edycji. 6
CancelEdit Delete EndEdit GetChildRows GetParentRow RejectChanges Przerywa operacje edycji. Usuwa obiekt DataRow z DataTable. Kończy operacje edycji. Pobiera rekordy potomne danego rekordu. Pobiera rekord nadrzędny danego rekordu. Powoduje powrót do stanu ostatniej operacji AcceptChanges. Zadanie 1. Proszę zrealizować aplikację, która powinna odznaczać się następującymi cechami: Aplikacja ma łączyć się z bazą danych zawierającą informacje na temat studentów kierunku informatyka. Na stronie internetowej mają zostać wyświetlone pobrane z bazy rekordy. Strona ma umożliwiać edycję danych, usuwanie rekordów oraz dodawanie rekordów do bazy. Do realizacji aplikacji należy użyć kontrolek typu SqlDataSource oraz kontrolki GridView. Aby zrealizować zadanie należy wykonać następujące kroki: Proszę w swoim katalogu utworzyć projekt o nazwie Zadanie 5.1. UWAGA! Przy dodawaniu do strony kolejnych kontrolek proszę o używanie unikalnych ID kontrolek o nazwie związanej z ich przeznaczeniem, np. buttondodaj. Proszę o sprawdzenie, czy włączony został SQL Server. W tym celu proszę o wybranie z Menu Start opcji Programy > Microsoft SQL Server 2008 > Configuration Tools > SQL Server Configuration Manager. Po uruchomieniu okna menedżera konfiguracji proszę o wybór z lewego panelu opcji SQL Server 2005 Services. Pozycje po prawej stronie powinny posiadać stan Running, w przeciwnym wypadku proszę o ich zaznaczenie i naciśnięcie guzika oznaczonego zielonym trójkątem. Następnie proszę o przejście do Visual Studio oraz wybranie z menu opcji View > Server Explorer. W nowo otwartym panelu proszę o kliknięcie prawym przyciskiem myszy na opcję Data Connections, a następnie o wybranie opcji Create New SQL Server Database. W nowo otwartym oknie proszę o wybór nazwy serwera z listy, a następnie o podanie nazwy bazy AWWW. 7
Po wykonaniu powyższej operacji proszę o przejście do Server Explorer i rozwinięcie elementów nowo utworzonej bazy (znaczek plus). Następnie proszę o kliknięcie prawym przyciskiem myszy na element Tables oraz wybór opcji Add New Table. W nowo otwartej zakładce proszę o utworzenie tabeli Studenci, a następnie o jej zapis (CTRL + S). Tabela powinna być zgodna z poniższym schematem: Następnie proszę o powrót do okna Server Explorer, kliknięcie prawym przyciskiem myszy na utworzoną tabelę Studenci i wybranie opcji Show Table Data. W nowo otwartej zakładce proszę o dodanie do tabeli kilku przykładowych rekordów. Po wykonaniu powyższych czynności proszę o dodanie do strony kontrolki typu SqlDataSource. Następnie zgodnie z poniższym rysunkiem proszę o wybranie opcji Configure Data Source. Następnie proszę o wybór bazy AWWW z rozwijanej listy (proszę zwrócić uwagę na utworzony opis połączenia - connection string). Po wykonaniu tej czynności proszę o dwukrotne naciśnięcie przycisku Next. W widocznym oknie proszę o wybór opcji zgodnie z poniższym rysunkiem. 8
Następnie proszę o wybór przycisku Next. W aktywnym oknie proszę o przetestowanie połączenie (przycisk Test Query ), co powinno spowodować wyświetlenie dodanych wcześniej rekordów. Po wykonaniu tej operacji proszę o naciśnięcie przycisku Finish. Następnie proszę o umieszczenie na stronie kontrolki typu GridView i przyporządkowanie jej dodanej wcześniej kontrolki typu SqlDataSource jako źródło danych (właściwość DataSourceID). Po wykonaniu tej czynności proszę o zaznaczenie kontrolki typu GridView i wybór opcji Add New Column, co przedstawia poniższy rysunek. W nowo otwartym oknie proszę o podanie następujących danych: 9
Po wykonaniu tej operacji proszę o przetestowanie działania aplikacji. Aby móc zapisać edytowane dane, proszę dodać do strony kontrolkę typu Button służącą do zapisu. Proszę o przypisanie jej zdarzeniu OnClick następującego kodu (gdzie GridView1 należy zmienić na nazwę kontrolki typu GridView): Następnie proszę o przetestowanie próby zapisu zmian w dowolnym edytowanym rekordzie. Próba ta powinna spowodować błąd, ponieważ kontrolka typu SqlDataSource nie posiada zdefiniowanego polecenia typu Update. Aby zdefiniować polecenie, proszę o zaznaczenie tej kontrolki oraz o wybór z panelu właściwości znaku trzech kropek przy właściwości UpdateQuery. Po odpowiedniej edycji, okno powinno wyglądać następująco: Opcja Parameter Source danego parametru ustawiona jako Control świadczy o tym, że wartość wybranego parametru będą pobierane z kontrolki o nazwie ustalonej poprzez ControlID. Należy także do właściwości DataKeyNames kontrolki typu GridView dopisać nazwę klucza głównego tabeli. Po wykonaniu powyższych czynności proszę o przetestowanie edycji rekordów z poziomu aplikacji. Następnie proszę o dodanie do strony przycisku powodującego anulowanie edycji aktualnie wybranego rekordu. Proszę o implementację jego zdarzenia OnClick. Podpowiedź: należy zmienić wartość parametru EditIndex kontrolki typu GridView. Po wykonaniu powyższych czynności proszę o dodanie nowej kolumny do kontrolki GridView, zawierającej przycisk odpowiedzialny za usunięcie rekordu (przy dodawaniu przycisku właściwość CommandName musi być ustawiona jako Delete ). Następnie proszę o edycję właściwości DeleteQuery kontrolki typu SqlDataSource, w celu umożliwienia usunięcia rekordu przez naciśnięcie przycisku. Po wykonaniu powyższej czynności proszę o dodanie do strony następujących kontrolek: 10
Następnie proszę o dodanie funkcjonalności polegającej na dodaniu do bazy nowego rekordu po naciśnięciu przycisku Dodaj. Dane nowego rekordu mają być pobierane z powyższych kontrolek. Podpowiedź: zdarzenie OnClick przycisku wywołuje metodę insert kontrolki typu SqlDataSource. Należy uprzednio zdefiniować właściwość InsertQuery tej kontrolki. Przy ocenie zadania główny nacisk będzie kładziony na: Wykonanie wszystkich założeń ujętych w treści zadania. Prawidłowe nazewnictwo obiektów kontrolek. Rozmieszczenie kontrolek na stronie (użycie CSS). Sposób implementacji kasowania rekordu. Sposób implementacji dodawania rekordu do bazy. Zadanie 2. Proszę zrealizować aplikację, która powinna odznaczać się następującymi cechami: Aplikacja ma łączyć się z bazą danych zawierającą informacje na temat samochodów. Na stronie internetowej mają zostać wyświetlone pobrane z bazy rekordy. Strona ma umożliwiać dodanie nowych rekordów do bazy. Tabela Samochody ma zawierać następujące pola: NrRejestracyjny Marka RokProdukcji IloscPasazerow Strona ma zawierać listę z wszystkimi numerami rejestracyjnymi samochodów znajdujących się w bazie. Aplikacja nie może wykorzystywać kontrolki typu SqlDataSource. 11
Aby zrealizować zadanie należy wykonać następujące kroki: Proszę w swoim katalogu utworzyć projekt o nazwie Zadanie 5.2. UWAGA! Przy dodawaniu do strony kolejnych kontrolek proszę o używanie unikalnych ID kontrolek o nazwie związanej z ich przeznaczeniem, np. buttondodaj. Proszę o utworzenie tabeli Samochody zgodnie z założeniami zadania. Proszę o dodanie do projektu kontrolki typu GridView. Następnie proszę o zdefiniowanie w klasie Default pola connectionstring zgodnie z podanym schematem (zastępując fragment nazwa_hosta nazwą komputera): private string connectionstring = "Data Source='[nazwa_hosta]\\SQLEXPRESS';Integrated Security=True;Pooling=False;Initial Catalog='AWWW'"; Następnie proszę o implementację metody powodującej załadowanie danych tabeli samochody do kontrolki typu GridView: Po wykonaniu tej czynności proszę o wykorzystanie tej metody przy każdym załadowaniu strony. Następnie proszę o dodanie do strony kontrolek zgodnie z poniższym rysunkiem: Po wykonaniu tej czynności proszę o implementację metody UpdateDB, odpowiedzialnej za dokonywanie zmian w tabeli: 12
Następnie proszę o implementację obsługi zdarzenia OnClick przycisku Dodaj samochód (ma powodować dodanie samochodu o podanych danych do bazy), wykorzystując przy tym metodę UpdateDB. Następnie proszę o dodanie do strony kontrolki typu DropDownList, która docelowo ma przechowywać numery rejestracyjne samochodów. Następnie proszę o implementację metod, które będą odpowiedzialne za wyświetlenie w kontrolce typu DropDownList wymaganych informacji: Metoda LoadList ma być wywoływana każdorazowo przy ładowaniu aplikacji. Przy ocenie zadania główny nacisk będzie kładziony na: Wykonanie wszystkich założeń ujętych w treści zadania. Prawidłowe nazewnictwo obiektów kontrolek. Wygląd aplikacji. Sposób implementacji metod. 13
Zadanie do domu. Proszę zrealizować aplikację, która powinna odznaczać się następującymi cechami: Aplikacja ta ma stanowić rozszerzenie aplikacji z zadania drugiego. Aplikacja ma posiadać dostęp do tabeli Ubezpieczenia, która ma składać się z następujących pól: NrUbezpieczenia (klucz główny) NrRejestracyjny (klucz obcy powiązany z polem tabeli Samochody ) RodzajUbezpieczenia Kwota DataRozpoczecia DataZakonczenia Aplikacja ma umożliwiać wyświetlenie i edycję danych z tabeli ubezpieczenia. Aplikacja ma umożliwiać dodanie do tabeli nowego ubezpieczenia (nr rejestracyjny ubezpieczanego samochodu ma zostać wybrany z zaimplementowanej wcześniej listy). Zagadnienia, które należy uznać za przyswojone w trakcie zajęć. Po zajęciach będzie obowiązywać praktyczna znajomość: Znajomość języka zapytań SQL. Umiejętność zarządzania bazą danych z poziomu aplikacji ASP.NET. Znajomość ADO.NET. Znajomość SQL Server. Zagadnienia do samodzielnego zgłębienia dla dociekliwych. Osoby zainteresowane mogą dodatkowo zapoznać się z następującymi tematami: Technologia LINQ. Zagadnienia do powtórzenia na następne zajęcia. Przed kolejnymi zajęciami należy powtórzyć następujące zagadnienia: Tworzenie szablonu strony za pomocą Master Page. Kontrolki własne i kontrolki użytkownika. Wybrane aspekty dotyczące implementacji z wykorzystaniem języka PHP. Język darmowy często pojawia się w parze z darmową bazą danych MySQL. Baza ta posiada wiele różnych wersji rozwojowych od 4.x do 5.x, posiada też wiele typów licencyjnych niektórych płatnych innych mniej. Jest jedną trzecią z najbardziej znanych baz danych. Między innymi przez darmową licencję jest bardzo często spotykanym połączeniem z językiem PHP(ASP tez może z niej korzystać). Połączenie bazy z skryptem wygląda następująco: 14
W linii 3 zaprezentowano pierwszą z funkcji ta służy do połączenia się z bazą danych pierwszy parametr to adres serwera bazy danych, drugi i trzeci to odpowiednio login i hasło do konta na tym serwerze. Kolejną funkcją jest wybór bazy danych odpowiednio parametrem jest nazwa bazy. Przed funkcją można dodać znak @ uciszający komunikat o ewentualnym błędzie braku takiej bazy. Zabieg ten stosuje się w celu uchronienia klienta przez naocznym spostrzeżeniem parametrów logowania do bazy danych co może być poufne ;) Jak zastosować te dwie funkcje w praktyce oto przykład: W linii 2 sprawdzone zostaje połączenie z serwerem jeżeli nie istnieje zwrócony zostanie błąd. W linii 4 jest analogiczna sytuacja tutaj jeżeli taka nazwa bazy nie będzie istnieć. Widać na tym przykładzie automatycznie jak działają funkcje i co zwracają w razie niepowodzenia(prawdę lub fałsz). Kolejny kod prezentuje działanie pytania na istniejącą już bazę danych. Ciekawostką jest, że w ten sposób można wykonywać wszystkie najważniejsze polecenia SQL Selekt, Insert, Update oraz Delete. Linia 7 to pytanie SQL owe. Linia 8 to funkcja wywołująca zadane pytanie na zadanym połączeniu z serwerem. Drugi parametr jest opcjonalny ale czasem przydatny Funkcja mysql_query zwraca wartość różną od zera jeżeli pytanie zostało poprawnie przetworzone. 15
Pierwszym sposobem na wydobycie danych z zapytania SQL jest użycie funkcji mysql_fetch_row(). Różni się ona od kolejnej tylko i wyłączeni sposobem odczytu danych tu odpowiednio indeksowane. Widać na listingu wyżej różnice między trzema sposobami odczytu danych z pytania SQL. Proszę zwrócić na linię 23. Po każdej operacji odczytu, zapisu w bazie danych należy zamknąć połączenie. Nie zamknięcie powoduje memory leak i może znacząco spowolnić pracę serwera, a zamknięcie podwójne(np. dwa razy wywołanie tej metody pod rząd) powoduje również błąd. Metoda ta szczególnie dobrze pasuje do destruktora klasy obsługi połączenia z bazą danych. Posiadając kilka połączeni z różnymi serwerami należy zawsze na końcu dokonać rozłączenia czyli zamknąć połączenie. Ciekawostką i ważnym elementem jest obsługa wyjątków problemów z pytaniem SQL. W PHP istnieje pewna funkcja kończąca połączenie oraz zgłaszająca błąd: Jak widać jej nazwa jest adekwatna do pełniącej roli. 16