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ę wiedza z przedmiotu Bazy Danych
Nawiązanie połączenia Nawiązanie połączenia mysql_connect(adres_serwera, użytkownik, hasło) np.: $connection = mysql_connect('localhost','root','haslo') Wybór bazy danych mysql_select_db("nazwa_bazy",$connection) Należy także pamiętać o rozłączeniu z bazą mysql_close($connection)
Szybka powtórka z MySQL Uruchamianie serwera jako serwis (mysqld --install) jako niezależna aplikacja (mysqld --console) Użytkowanie mysql u root phaslo Wybór bazy i przesłanie zapytania use moja_baza select * from moja_tabela Obsługa bazy przez WWW myphpadmin
Zapytanie Wykonanie zapytania $res = mysql_query("select * from tablica",$connection) $res - obiekt typu resource z wynikiem Przeglądanie wyników (odczyt jednego wiersza z wyniku) mysql_fetch_row($res) Przegląd wszystkich wierszy while($row = mysql_fetch_row($res) {...}
Przykładowy kod <?php $cn = mysql_connect('localhost','root',''); mysql_select_db('test'); $result = mysql_query('select * from tab',$cn); while($row = mysql_fetch_row($result)) { echo $row[0]." ".$row[1]; echo '<br/>'; } mysql_close($cn);?>
Obsługa błędów Niektóre funkcje zwracają wartość True w przypadku powodzenia False w przypadku niepowodzenia Dla nich możliwe jest użycie operatora OR $connection = mysql_connect('localhost','root','haslo') or die("połączenie nieudane!") Die() uruchomi się gdy pierwsza funkcja zwróci False Die() powoduje natychmiastowe zakończenie skryptu Można przeczytać ostatni błąd za pomocą mysql_error() $connection = mysql_connect('localhost','root','haslo') or die("wystąpił błąd: ".mysql_error())
Obsługa błędów cd Operator kontroli błędów @ ukrywa komunikat o błędzie $connection = @mysql_connect('localhost','root','haslo') or die("wystąpił błąd: ".mysql_error()) Inny sposób na to samo: if(!$connection = @mysql_connect('localhost','root','haslo')) die("wystąpił błąd: ".mysql_error())
Odczytywanie błędów Zmienna globalna $php_errormsg Konieczne ustawienie parametru track_errors=on Zmienna zawiera wartość ostatniego błędu Przykład użycia: if(!$cn = mysql_connect('localhost','root','')) echo "Błąd: ".$php_errormsg;
Przetwarzanie rezultatów $res = mysql_query("select...", $connection) $res zmienna typu resource mysql_fetch_row($res) zwraca jeden wiersz jako tablicę (indeksy od 0) przechodzi do następnego jeśli nie ma już wierszy zwraca false mysql_fetch_asoc($res) zwraca tablicę asocjacyjną z nazwami pól jako kluczami mysql_fetch_array($res) zwraca jedno i drugie
Przykładowy kod z asoc <?php $cn = mysql_connect('localhost','root',''); mysql_select_db('test'); $result = mysql_query('select * from tab',$cn); while($row = mysql_fetch_asoc($result)) { echo $row["nr"]." ".$row["tekst"]; echo '<br/>'; } mysql_close($cn);?>
Analiza rezultatu (resource) mysql_num_fields($res) liczba kolumn mysql_num_rows($res) liczba wierszy w wyniku mysql_field_name($res,$i) nazwa kolumny o podanym numerze mysql_data_seek($res, $nr_wiersza) ustawienie kursora na podanym wierszu mysql_free_result($res) czyści pamięć zajętą przez ten rezultat
Polecenia na skróty mysql_create_db mysql_query("create DATABASE...") mysql_db_name mysql_query("select DATABASE()...") mysql_list_dbs mysql_query("show DATABASES") mysql_list_tables mysql_query("show TABLES")
Nawiązywanie połączenia Problem: to może trwać długo Rozwiązanie: zapamiętywanie połączenia Zamiast: mysql_connect Użyj: mysql_pconnect (od: persistent) pconnect sprawdza najpierw, czy istnieje już połączenie i używa go jeśli jest ono dostępne
Uniwersalny wyświetlacz $res = mysql_query("jakieś zapytanie",$cn); echo "<table><tr>"; $n = mysql_num_fields($res); // ile kolumn for($i=0; $i<$n; $i++) // wyświetl nagłówki echo "<th>".mysql_field_name($res,$i)."</th>"; echo "</tr>"; while($row = mysql_fetch_row($res)) { // wyświetl wiersze echo "<tr>"; for($i=0; $i<$n; $i++) // dla każdej kolumny echo "<td>".$row[$i]."</td>"; echo "</tr>"; } echo "</table>";
Inne serwery baz danych Dla każdego serwera inny zestaw funkcji z innym przedrostkiem Przykładowe funkcje połączeniowe: mssql_connect, ora_login, pg_connect, sybase_connect Pozostałe funkcje i ich sposób działania mogą się różnić! Można także połączyć się z dowolnym źródłem danych ODBC: odbc_connect, odbc_exec, odbc_fetch_row
Utrzymywanie połączenia Problem: protokół HTTP jest bezstanowy Każde połączenie użytkownika z serwerem WWW jest niezależne Jak więc przechować dane o użytkowniku podczas przeładowywania strony? Możliwości: ukryte pola formularza ciasteczka sesja
Ukryte pola formularza Serwer otrzymuje od użytkownika wypełnioną formatkę 1 i wysyła mu następną stronę z formatką 2 Dane z formatki 1, które powinny zostać zapamiętane umieszczane są na formatce 2 w polach hidden <input type=hidden name="login" value="pawel"> Użytkownik wypełnia formatkę 2 (pola widoczne) i przesyła ją na serwer Serwer otrzymuje dane wraz z wartościami w polach ukrytych i dzięki temu ma wszystkie informacje Podstawowe wady rozwiązania: duże formatki, łatwość podejrzenia i zmiany wartości ukrytych
Ciasteczka (cookies) Cookie mały plik zapisywany przez serwer na komputerze klienta Zapis cookie: setcookie("nazwa", "wartość", "czas wygaśnięcia") Funkcja musi być wywołana przed znacznikiem <html>! Odczyt cookie: $_COOKIE["nazwa"] Uwaga! Przeglądarka może mieć wyłączoną obsługę ciasteczek
Przykład ciasteczka if(!isset($_cookie["imie"])) { echo "ustawiam cookie"; setcookie("imie","paweł", time()+60); } else echo "cookie=".$_cookie["imie"];
Tworzenie sesji Sesja zbiór parametrów przechowywanych po stronie serwera Użytkownik przy pierwszym połączeniu otrzymuje identyfikator sesji Przy każdym następnym połączeniu jego dane pobierane są z jego sesji Skąd wiadomo, która sesja jest "jego"? ciasteczko url (np. www.strona.pl?sid=73fd909)
Przykład sesji session_start(); if(!isset($_session["imie"])) { echo "ustawiam parametr w sesji"; $_SESSION["imie"]="paweł"; } else echo "imie=".$_session["imie"];
Ciasteczka a sesje Sesje przechowywane są na serwerze a ciasteczka na komputerze klienta klient nie ma dostępu do wszystkich danych o sobie W sesjach przechowywać można duże obiekty, w ciasteczkach jest to trudniejsze klient może ograniczyć ilość miejsca na ciasteczka Sesje żyją krótko, ciasteczka mogą długo następnego dnia można użyć ciasteczka, sesja wygasa po zakończeniu pracy przez klienta