Obsługa bazy MySQL w PHP Funkcje połączenia i przetwarzania zapytań w bazie danych. Połączenie z bazą danych w PHP odbywa sięga pomocą funkcji mysql_connect(), która przyjmuje trzy parametry i jako wynik zwraca identyfikator połączenia: $polaczenie = mysql_connect(host, użytkownik, hasło) Funkcja mysql_connect() zwraca identyfikator połączenia, który jest drugim parametrem wywołania funkcji wybierającej odpowiednią bazę danych mysql_select_db() mysql_select_db(nazwa_bazy, $polaczenie) Wykonywanie zapytań do bazy realizuje się za pomocą funkcji mysql_query() $wynik = mysql_query(zapytanie_sql) mysql_query() zwraca identyfikator wyniku (lub FALSE w przypadku niepowodzenia) jedynie dla zapytań typu SELECT, SHOW, EXPLAIN i DESCRIBE. Dla innych zapytań SQL mysql_query() zwraca TRUE lub FALSE informując czy zapytanie zakończyło się sukcesem czy też nie. Jeśli nie została zwrócona wartość FALSE to znaczy, że zapytanie było prawidłowe i może być wykonane przez serwer. Nie mówi natomiast nic o liczbie przetworzonych lub zwróconych wierszy. Jest również możliwe, że zapytanie zostanie wykonane poprawnie, nie przetwarzając lub zwracając żadnych wierszy. Zwrócone wiersze można odczytać przy pomocy funkcji: $wiersz = mysql_fetch_row($wynik) lub $wiersz = mysql_fetch_assoc($wynik) lub $wiersz = mysql_fetch_array($wynik) Funcja mysql_fetch_row() zwraca wynik w postaci tablicy numerycznej, gdzie $wiersz[0] oznacza 1 zwrócone pole. Funkcja mysql_fetch_assoc() zwraca wiersz w postaci tablicy asocjacyjnej, w której klucze są nazwami pól w bazie np.: wiersz[‘pesel’]. W przypadku funkcji mysql_fetch_array(), która jest najbardziej uniwersalna zwrócona tabela może być typu numerycznego, asocjacyjnego bądź obiema jednocześnie (domyślnie). Można zastosować opcjonalny drugi argument, który jest stałą i może przyjmować następujące wartości: MYSQL_ASSOC, MYSQL_NUM i MYSQL_BOTH. Wartością domyślną jest MYSQL_BOTH.W przypadku gdy zapytanie zwraca kilka wierszy funkcje należy wywoływać w pętli dopóki zmienna wiersz przyjmuje wartość inną niż FALSE. Do zamknięcia połączenia z bazą służy funkcja mysql_close($polaczenie) Uwaga: w celu zbadania poprawności wykonania funkcji bazodanowych często korzysta się z konstrukcji or die() występującej zaraz po niej, która w przypadku niepowodzenia (zwrócenia wyniku FASLE) wypisze stosowny komunikat i zatrzyma wykonywanie skryptu. Wyświetlanie danych z bazy Poniższy przykład wyświetla zawartość tabeli „osoby” z bazy na lokalnym serwerze (nazwa użytkownika i hasło są domyślnymi ustawieniami mysql dla easyphp i xampp) Przykład 1. <?php $polaczenie=mysql_connect("localhost", "root", "") or die("Brak połączenia z serwerem MySQL"); mysql_select_db("baza", $polaczenie) or die ("Błąd wyboru bazy danych"); $wynik=mysql_query("SELECT * FROM osoby") or die("Błąd zapytania"); while($wiersz = mysql_fetch_assoc($wynik)) { print "Imie: " . $wiersz['imie'] . "<br>"; print "Nazwisko: " . $wiersz['nazwisko'] . "<br>"; print "Pesel: " . $wiersz['pesel'] . "<hr>"; } mysql_close($polaczenie); ?> Dodawanie danych do bazy Utwórzmy prosty formularz oraz skrypt PHP przetwarzający go w tej samej podstronie: Przykład 2. Formularz i skrypt obsługujący dodawanie danych do bazy <h1>Dodaj rekord </h1> <form method="POST"> Imię: <input type="text" id="imie" name="imie"/><br/> Nazwisko: <input type="text" id="nazwisko" name="nazwisko"/><br/> Pesel: <input type="text" id="pesel" name="pesel"/><br/> <input type="submit" value="dodaj" /> </form> <?php if($_SERVER['REQUEST_METHOD'] == 'POST') { $imie = $_POST['imie']; $nazwisko = $_POST['nazwisko']; $pesel = $_POST['pesel']; $polaczenie = mysql_connect("localhost", "root", "") or die("Błąd połączenia z bazą!"); mysql_select_db("baza") or die("Nie można wybrać bazy!"); $query = "INSERT INTO osoby(imie, nazwisko, pesel) VALUES ('$imie', '$nazwisko', '$pesel')"; $wynik = mysql_query($query) or die("Błąd zapytania SQL!"); if($wynik) echo "Rekord dodany poprawnie"; mysql_close($polaczenie); } ?> Sprawdzanie poprawności wprowadzonych danych Do sprawdzenia poprawności wprowadzonych danych można zastosować skrypt po stronie klienta, który zapobiegnie wysłania formularza z błędnymi danymi. Oczywiście to samo da się osiągnąć po stronie serwera jednak będzie to wymagało przesłania formularza i powrotu do niego oraz konieczności ponownego wpisywania danych. Żeby sprawdzić dane po stronie klienta wystarczy dodać zdarzenie onsubmit="return sprawdz();" w znaczniku form i napisać odpowiednią funkcję sprawdz(). Funkcja powinna zwrócić wynik true jeśli walidacja przebiegnie pomyślnie i false w przeciwnym przypadku, co zapobiegnie wysłaniu formularza. Przykład 3. Skrypt sprawdzający poprawność wprowadzonych danych (JS) <script> function sprawdz() { imie = document.getElementById('imie').value; nazwisko = document.getElementById('nazwisko').value; pesel = document.getElementById('pesel').value; if(imie.length<3 || nazwisko.length<3 || pesel.length !=11 || isNaN(pesel)) { alert("Błędne dane: Imie i Nazwisko muszą mieć min. 3 znaki, pesel musi być liczbą 11 cyfrową!"); return false; } return true; } </script> Usuwanie danych z bazy Przykład 4. Formularz i skrypt obsługujący usuwanie rekordu z bazy o danym numerze pesel <h1>Usuń rekord</h1> <form method="POST" > <p>Pesel: <input type="text" name="pesel" /> </p> <input type="submit" value="Usuń" /> </form> <?php if($_SERVER['REQUEST_METHOD'] == 'POST') { $polaczenie= mysql_connect("localhost", "root", "") or die("Błąd połączenia z bazą!"); mysql_select_db("baza") or die("Nie można wybrać bazy!"); $pesel = $_POST['pesel']; $query = "DELETE FROM osoby WHERE pesel='$pesel'"; $wynik = mysql_query($query) or die("Błąd zapytania SQL!"); if ($wynik && mysql_affected_rows()) echo "Rekord usunięty poprawnie"; else echo "Błąd operacji"; mysql_close($polaczenie); } ?> Ćwiczenia i zadania Zadanie 1. Napisz skrypt który wyświetli dane z tabeli osoby w bloku treści w postaci listy imion i nazwisk oraz liczbę rekordów w stopce. Rozwiązanie: (Dla przejrzystości pominięto sprawdzanie poprawności za pomocą konstrukcji or die()) <body> <?php $polaczenie=mysql_connect("localhost", "root", ""); mysql_select_db("baza", $polaczenie); ?> <div id="baner"> </div> <div id="menu"> </div> <div id="tresc"> <ol> <?php $wynik=mysql_query("SELECT imie, nazwisko FROM osoby"); while($wiersz = mysql_fetch_array($wynik)) { echo '<li>' . $wiersz['imie'] . ' ' . $wiersz['nazwisko'] . '</li>'; } ?> </ol> </div> <div id="stopka"> Liczba rekordow: <?php $wynik=mysql_query("SELECT count(*) FROM osoby"); $wiersz = mysql_fetch_array($wynik); echo $wiersz[0]; ?> </div> <?php mysql_close($polaczenie); ?> </body>