W budowie
Materiał edukacyjny · Informatyka Połączenie z MySQL, zapytania SELECT i prezentacja w HTML

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';
1. Co zwraca mysqli_connect()?
2. Po co ustawiamy utf8mb4?
3. Co zrobić przy braku połączenia?

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>';
4. Co zwraca mysqli_fetch_assoc()?
5. Dlaczego używamy pętli while?
6. Co robi mysqli_num_rows()?

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);
7. Co zwraca nieudane zapytanie?
8. Do czego służy mysqli_error()?
9. Czy pokazywać błąd użytkownikowi?

Ćwiczenia