CZĘŚĆ 11
SQL: odczyt danych
PPrezentacja dla nauczyciela
Odczyt danych to ponad 80% wszystkich operacji na bazach w aplikacjach internetowych. W tej części poznasz bibliotekę mysqli: nawiązywanie połączenia, wykonywanie zapytań SELECT, pobieranie wierszy w pętli while oraz bezpieczną prezentację wyników w tabelach i listach HTML.
Połączenie z bazą przez mysqli
Do bazy łączymy się funkcją mysqli_connect(), podając host, użytkownika, hasło i nazwę bazy. Wynik zapisujemy w zmiennej — to uchwyt połączenia, którego używamy przy każdym zapytaniu.
Połączenie warto sprawdzić: if (!$polaczenie) pozwala zatrzymać skrypt i pokazać komunikat. W środowisku produkcyjnym nie pokazujemy jednak szczegółów błędu użytkownikowi.
Kodowanie ustalamy przez mysqli_set_charset($polaczenie, 'utf8mb4'). Bez tego polskie znaki mogą zamienić się w znaki zapytania.
$polaczenie = mysqli_connect('localhost', 'root', '', 'szkola');
if (!$polaczenie) {
exit('Brak polaczenia z baza');
}
mysqli_set_charset($polaczenie, 'utf8mb4');
echo 'Polaczono z baza szkola';
SELECT i odczyt wyników
Zapytanie SELECT pobiera dane. Wysyłamy je przez mysqli_query(), a wynik odczytujemy wiersz po wierszu funkcją mysqli_fetch_assoc() — zwraca ona tablicę asocjacyjną albo null, gdy wierszy już nie ma.
Pętlę while z tym warunkiem stosuje się dlatego, że nie wiemy z góry, ile jest rekordów. Każdy wiersz zawiera kolumny pod nazwami z zapytania.
Gdy potrzebny jest tylko jeden wiersz, wystarczy jedno wywołanie mysqli_fetch_assoc() bez pętli. Do liczby wierszy służy mysqli_num_rows().
$wynik = mysqli_query($polaczenie, 'SELECT imie, klasa FROM uczniowie ORDER BY imie');
while ($wiersz = mysqli_fetch_assoc($wynik)) {
echo '<p>' . htmlspecialchars($wiersz['imie'])
. ' - ' . htmlspecialchars($wiersz['klasa']) . '</p>';
}
echo '<p>Razem: ' . mysqli_num_rows($wynik) . '</p>';
Obsługa błędów zapytań
Zapytanie może się nie udać z powodu literówki, braku tabeli albo braku uprawnień. mysqli_query() zwraca wtedy false, więc warto sprawdzić wynik, zanim użyjemy go dalej.
Do diagnostyki służy mysqli_error($polaczenie), ale komunikat pokazujemy tylko w środowisku testowym. Użytkownik nie powinien widzieć struktury bazy.
W kodzie egzaminacyjnym wystarczy warunek i czytelny komunikat. W większych aplikacjach używa się wyjątków i klasy mysqli w stylu obiektowym.
$sql = 'SELECT imie FROM uczniowie';
$wynik = mysqli_query($polaczenie, $sql);
if ($wynik === false) {
echo 'Nie udalo sie pobrac danych';
} else {
echo 'Wierszy: ' . mysqli_num_rows($wynik);
}
mysqli_close($polaczenie);
Ćwiczenia
- 1Połączenie z bazą mysqli_connectpołączenie z bazą mysqli_connectZadanie i podpowiedzi →
- 2Odczyt jednego wierszaodczyt jednego wierszaZadanie i podpowiedzi →
- 3Pętla while z mysqli_fetch_assocpętla while z fetch_assocZadanie i podpowiedzi →
- 4Lista rekordów z bazylista rekordów z bazyZadanie i podpowiedzi →
- 5Prezentacja w tabeli HTMLprezentacja w tabeli HTMLZadanie i podpowiedzi →
- 6Tylko potrzebne kolumnytylko potrzebne kolumnyZadanie i podpowiedzi →
- 7Bezpieczne wyświetlanie danychbezpieczne wyświetlanie XSSZadanie i podpowiedzi →
- 8Liczba rekordów z mysqli_num_rowsliczba rekordów mysqli_num_rowsZadanie i podpowiedzi →
- 9Brak wyników — komunikat zamiast pustej listyobsługa braku rekordówZadanie i podpowiedzi →
- 10Filtrowanie po ceniefiltrowanie liczbą WHEREZadanie i podpowiedzi →
- 11Filtr po klasiefiltr tekstem w apostrofachZadanie i podpowiedzi →
- 12Wyszukiwanie wzorcem LIKEwyszukiwanie wzorcem LIKEZadanie i podpowiedzi →
- 13Pobranie rekordu po IDpobranie rekordu po IDZadanie i podpowiedzi →
- 14Dynamiczny select z bazy danychdynamiczny select z bazyZadanie i podpowiedzi →
- 15Odczyt struktury tabelibadanie struktury DESCRIBEZadanie i podpowiedzi →
- 16Raport zestawieniowy z bazyraport tabelaryczny z bazyZadanie i podpowiedzi →