PHP i MySQL
Interfej serwera MySQL w PHP PHP zawiera dwa moduły do współpracy z MySQL:
Mysqli Poniżej znajdziesz kilka przykładowych skryptów pokazujących typowe metody odczytywania i przetwarzania danych. Dokładny opis modułu mysqli wraz z przykładami znajdziesz tutaj. Praca z bazą danych - metoda proceduralna <?php /* Nawiązanie połączenia z serwerem */ $link = mysqli_connect( 'localhost', /* serwer, na którym działa MySQL */ 'user', /* nazwa użytkownika */ 'password', /* hasło użytkownika */ 'baza'); /* wybrana baza danych */ if (!$link) { echo "Nie mogę połączyć się z serwerem MySQL. Kod błędu: " . mysqli_connect_error(); exit; } ?> Zmienna $link jest zasobem nawiązanego połączenia. Jeżeli jednak połączenia nie uda się ustanowić, to jej wartością będzie fałsz. Za pomocą warunku if sprawdzamy, czy udało się połączyć z serwerem, a jeżeli nie, to zwracamy kod błędu i przerywamy działanie skryptu. Po nawiązaniu połączenia możemy wykonywać dowolne instrukcje SQL, a ich wynik wykorzystać w skrypcie, np.: <?php /* Wykonujemy zapytanie */ if ($result = mysqli_query($link, 'SELECT nazwisko,imie FROM tabela ORDER BY nazwisko,imie')) { echo "Lista osób:<br />\n"; /* Przetwarzamy wiersze wyniku zapytania */ while( $row = mysqli_fetch_assoc($result) ) { echo $row['nazwisko'] . ' ' . $row['imie'] . '<br />'; } /* Usuwamy z pamięci wynik zapytania */ mysqli_free_result($result); } /* Zamykamy połączenie z bazą */ mysqli_close($link); ?> Kilka uwag do powyższego przykładu:
Ponieważ otwieranie połączeń z bazą wymaga sporo czasu, to warto raz nawiązać je na początku skryptu i zamknąć dopiero na jego końcu. Praca z bazą danych - metoda obiektowa Poniższy przykład jest odpowiednikiem poprzedniego, ale tym razem nawiązanie połączenia, wykonanie zapytania, przetworzenie wyników i zamknięcie połączenia realizowane jest obiektowo. <?php /* Łączymy się z serwerem */ $mysqli = new mysqli('localhost', 'user', 'password', 'baza'); if (mysqli_connect_errno()) { echo ""Nie mogę połączyć się z serwerem MySQL. Kod błędu: " . mysqli_connect_error(); exit; } /* Wykonujemy zapytanie */ if ($result = $mysqli->query(SELECT nazwisko,imie FROM tabela ORDER BY nazwisko,imie')) { echo "Lista osób:<br />\n"; /* Przetwarzamy wiersze wyniku zapytania */ while( $row = $result->fetch_assoc()) { echo $row['nazwisko'] . ' ' . $row['imie'] . '<br />'; } /* Usuwamy wynik zapytania z pamięci */ $result->close(); } /* Zamykamy połączenie z bazą */ $mysqli->close(); ?>
Parameryzowanie instrukcji SQL Często wygodnie jest użyć w instrukcji SQL zmiennych, których wartości można dynamicznie ustawiać z poziomu PHP. Problem polega na tym, żeby instrukcje typu: SELECT nazwisko, imie FROM tabela WHERE nazwisko LIKE 'K%' zastąpić instrukcjami typu: SELECT nazwisko, imie FROM tabela WHERE nazwisko = ? a w miejsce znaku ? dynamicznie wstawiać odpowiednią wartość przed wykonaniem instrukcji, np: <?php $mysqli = new mysqli('localhost', 'user', 'password', 'baza'); /* Test połączenia */ if (mysqli_connect_errno()) { echo ""Nie mogę połączyć się z serwerem MySQL. Kod błędu: " . mysqli_connect_error(); exit; } /* Przygotowanie instrukcji SQL */ $stmt = $mysqli->prepare("INSERT INTO tabela (nazwisko, imie, wiek) VALUES ( ?, ?, ?)"); $stmt->bind_param('ssi', $nazwisko, $imie, $wiek); $nazwisko = 'Kowalski'; $imie = 'Jan'; $wiek = 18; /* Wykonujemy przygotowaną instrukcję */ $stmt->execute(); echo "Wstawiono wierszy: " . $stmt->affected_rows); /* Usuwamy wynik zapytania z pamięci */ $stmt->close(); /* Zamykamy połączenie z bazą */ $mysqli->close(); ?> Uwagi:
Parameryzowanie wyników instrukcji SQL Zwracane przez zapytania wyniki mogą być także wiązane poprzez zmienne PHP z polami tekstowymi, polami wyboru czy polami w tabelach, np.: <?php $mysqli = new mysqli("localhost", "user", "password", "baza"); /* Test połączenia */ if (mysqli_connect_errno()) { echo ""Nie mogę połączyć się z serwerem MySQL. Kod błędu: " . mysqli_connect_error(); exit; } /* Przygotowanie i wykonanie instrukcji SQL */ if ($stmt = $mysqli->prepare("SELECT nazwisko,imie,wiek FROM tabela ORDER BY wiek DESC LIMIT 5")) { $stmt->execute(); /* Powiązanie zmiennych z wynikiem zapytania */ $stmt->bind_result($col1, $col2, $col3); /* Przetwarzanie wyniku */ while ($stmt->fetch()) { echo $col1 .' ' . $col2 . ' ma ' . $col3 . ' lat<br />'; } /* Usuwamy wynik zapytania z pamięci */ $stmt->close(); } /* Zamykamy połączenie z bazą */ $mysqli->close(); ?> Uwagi na temat bezpieczeństwa Ponieważ SQL jest językiem interpretowanym, to dowolny ciąg znaków będzie zinterpretowany przez serwer MySQL. Jeżeli ten ciąg będzie poprawną instrukcją języka SQL, to zostanie wykonany. W przeciwnym razie serwer zgłosi błąd. Problem dotyczy przede wszystkim zapisu do bazy danych pobranych z formularzy wypełnianych przez użytkowników. Podstawowe reguły bezpieczeństwa baz danych:
|