Opis: Zostanie omówione połączenie z bazą danych MySQL w języku PHP, w tym wykonywanie zapytań za pomocą mysqli_connect, mysqli_query i mysqli_fetch_assoc, wykorzystanie przygotowanych zapytań (prepare, bind_param) oraz obsługa błędów, umożliwiające bezpieczną pracę z danymi w aplikacjach webowych.
Rozszerzenie MySQLi (MySQL Improved) w PHP służy do komunikacji z bazą danych MySQL. Umożliwia wykonywanie zapytań SQL, pobieranie danych oraz obsługę błędów.
Najważniejsze funkcje:
mysqli_connect() - nawiązuje połączenie z bazą danych,
mysqli_query() - wykonuje zapytanie SQL,
mysqli_fetch_assoc() - pobiera kolejne wiersze wyników jako tablicę asocjacyjną ($row['tytul']).
mysqli_fetch_row() - pobiera kolejne wiersze wyników jako tablicę indeksowaną ($row[0]).
Przykład
$polaczenie = mysqli_connect("localhost", "root", "", "moja_baza");
if (!$polaczenie) {
die("Błąd połączenia: " . mysqli_connect_error());
}Wyjaśnienie
"localhost" - adres serwera bazy danych,
"root" - użytkownik bazy,
"" - hasło użytkownika,
"moja_baza" - nazwa bazy danych.
Funkcja próbuje połączyć się z bazą danych. Jeśli się nie uda, mysqli_connect() zwraca false. mysqli_connect_error() zwraca opis błędu. die() przerywa działanie programu i wyświetla komunikat.
Przykład
$sql = "SELECT * FROM users";
$wynik = mysqli_query($polaczenie, $sql);
if (!$wynik) {
die("Błąd zapytania: " . mysqli_error($polaczenie));
}$sql - zapytanie SQL,
mysqli_query() wysyła zapytanie do bazy.
Zapytanie "SELECT * FROM users" pobiera wszystkie rekordy z tabeli. Wynik zapytania trafia do $wynik. Jeśli zapytanie jest błędne - zwracane jest false. mysqli_error() zwraca szczegóły błędu.
Przykład
while ($wiersz = mysqli_fetch_assoc($wynik)) {
echo $wiersz["name"] . "<br>";
}mysqli_fetch_assoc() pobiera jeden wiersz wyniku jako tablicę asocjacyjną (["id" => 1, "name" => "Jan"]).
Funkcja pobiera kolejne rekordy z $wynik. Każdy rekord trafia do zmiennej $wiersz. Możemy odwołać się do kolumn po nazwach ("name"). Gdy nie ma więcej danych - funkcja zwraca null i pętla się kończy.
<?php
$hostname = 'localhost'; // Nazwa hosta
$username = 'root'; // Nazwa użtytkownika
$password = ''; // Hasło
$database = 'biblioteka'; // Nazwa bazy danych
$conn = mysqli_connect($hostname, $username, $password, $database);
$query = "SELECT * FROM ksiazki";
$result = mysqli_query($conn, $query);
while($row = mysqli_fetch_row($result)){
echo $row[0]. ' '. $row[1]. ' '. $row[2]. ' '. $row[3]. ' '. $row[4]."<br>";
}
mysqli_close($conn);
?>$conn = mysqli_connect($hostname, $username, $password, $database);
Tutaj PHP nawiązuje połączenie z bazą danych MySQL. Zmienna $conn przechowuje wynik połączenia. Jeśli coś pójdzie nie tak (np. błędne hasło), $conn będzie false.
$query = "SELECT * FROM ksiazki";
Tworzysz zapytanie SQL, które pobiera wszystkie kolumny (*) z tabeli ksiazki.
$result = mysqli_query($conn, $query);
Funkcja wykonuje zapytanie na bazie danych. $result zawiera wynik (tzw. result set), czyli wszystkie wiersze, które spełniają warunki zapytania.
while($row = mysqli_fetch_row($result)){ ... }
Pętla pobiera kolejno każdy wiersz z wyniku. mysqli_fetch_row() zwraca dane w postaci tablicy indeksowanej.
$row[0] - pierwsza kolumna (np. id)
$row[1] - druga kolumna (np. tytul)
itd.
echo $row[0]. ' '. $row[1]. ' '. $row[2]. ' '. $row[3]. ' '. $row[4]."<br>";
Wyświetlasz wartości kolumn w jednym wierszu, a <br> wstawia nową linię w przeglądarce.
mysqli_close($conn);
Zamykasz połączenie z bazą, co jest dobrą praktyką, żeby zwolnić zasoby serwera.
<?php
$hostname = 'localhost'; // Nazwa hosta
$username = 'root'; // Nazwa użtytkownika
$password = ''; // Hasło
$database = 'biblioteka'; // Nazwa bazy danych
$conn = mysqli_connect($hostname, $username, $password, $database);
$tytul = "tytul";
$autor = "autor";
$rok = "2022";
$data = date("Y-m-d");
$sql = "INSERT INTO `ksiazki` (`id`, `tytul`, `autor`, `rok`, `data-dod`)
VALUES (NULL, '$tytul', '$autor', '$rok', '$data')";
if($result = mysqli_query($conn, $sql)) echo "Dodano nowy rekord";
else echo "Nie udało się dodać nowego rekordu";
mysqli_close($conn);
?>$conn = mysqli_connect($hostname, $username, $password, $database);
To samo jak wcześniej - połączenie z bazą.
$tytul = "tytul"; $autor = "autor"; $rok = "2022"; $data = date("Y-m-d");
Przygotowujesz dane do wstawienia do tabeli. Funkcja date("Y-m-d") generuje aktualną datę w formacie YYYY-MM-DD.
$sql = "INSERT INTO ksiazki (id, tytul, autor, rok, data-dod) VALUES (NULL, '$tytul', '$autor', '$rok', '$data')";
Tworzysz zapytanie SQL typu INSERT. id ustawiasz na NULL, bo kolumna jest zazwyczaj auto_increment. Pozostałe wartości pochodzą ze zmiennych.
if($result = mysqli_query($conn, $sql)) echo "Dodano nowy rekord"; else echo "Nie udało się dodać nowego rekordu";
Funkcja mysqli_query() wykonuje zapytanie.
Jeśli wstawienie się uda - wyświetli komunikat "Dodano nowy rekord".
Jeśli wystąpi błąd - wyświetli komunikat o niepowodzeniu.
mysqli_close($conn);
Zamykasz połączenie z bazą danych.
<?php
$hostname = 'localhost';
$database = 'biblioteka';
$username = 'root';
$password = '';
$conn = mysqli_connect($hostname, $username, $password, $database);
$tytul = "tytul";
$autor = "autor";
$rok = "2022";
$data = date("Y-m-d");
$stmt = mysqli_prepare($conn, "INSERT INTO ksiazki (tytul, autor, rok, data-dod) VALUES (?, ?, ?, ?)");
mysqli_stmt_bind_param($stmt, "ssis", $tytul, $autor, $rok, $data);
if(mysqli_stmt_execute($stmt)){
echo "Dodano nowy rekord";
} else {
echo "Błąd podczas dodawania rekordu";
}
mysqli_stmt_close($stmt);
mysqli_close($conn);
?>Co jest tu bezpieczniejsze:
$stmt = mysqli_prepare($conn, "INSERT INTO ksiazki (...) VALUES (?, ?, ?, ?)");
Tworzysz tzw. przygotowane zapytanie (prepared statement).
Kluczowa różnica:
zamiast wstawiać dane bezpośrednio do SQL ('$tytul')
używasz znaków zapytania ? jako placeholderów
Dzięki temu dane są oddzielone od zapytania SQL - to podstawa ochrony przed SQL Injection.
mysqli_stmt_bind_param($stmt, "ssis", $tytul, $autor, $rok, $data);
Tutaj przypisujesz wartości do placeholderów ?.
"ssis" oznacza typy danych:
s - string ($tytul)
s - string ($autor)
i - integer ($rok)
s - string ($data)
Kolejność musi odpowiadać kolejności ? w zapytaniu.
if(mysqli_stmt_execute($stmt))
W tym momencie:
zapytanie SQL jest już przygotowane
dane są bezpiecznie wstrzykiwane przez silnik MySQL
zapytanie jest wykonywane
jeśli wszystko się uda - true
w przeciwnym razie - false
Napisz skrypt PHP, który połączy się z bazą danych szkola i wyświetli wszystkie rekordy z tabeli uczniowie. Dla każdego ucznia wyświetl: imię, nazwisko, klasę oraz średnią ocen.
Kroki do wykonania:
Utwórz zmienne do połączenia z bazą.
Nawiąż połączenie z bazą przy użyciu mysqli_connect() i zapisz je do zmiennej $conn.
Przygotuj zapytanie SQL:
SELECT * FROM uczniowieWykonaj zapytanie za pomocą mysqli_query() i zapisz wynik do zmiennej $result.
Użyj pętli while wraz z mysqli_fetch_row() lub mysqli_fetch_assoc(), aby przejść po wszystkich rekordach.
W każdej iteracji:
pobierz dane jednego ucznia
wyświetl imię, nazwisko, klasę i średnią (np. w jednej linii)
Po zakończeniu zamknij połączenie funkcją mysqli_close().
Napisz skrypt PHP, który doda nowy rekord do tabeli uczniowie w bazie szkola. Dane ucznia (imię, nazwisko, klasa, średnia ocen) mają być zapisane w zmiennych w kodzie.
Kroki do wykonania:
Utwórz zmienne do połączenia z bazą.
Połącz się z bazą danych przy użyciu mysqli_connect().
Przygotuj zmienne z danymi ucznia, np.:
$imie
$nazwisko
$klasa
$srednia
Zbuduj zapytanie SQL typu INSERT INTO, które doda dane do tabeli uczniowie.
pamiętaj o NULL dla kolumny id (jeśli jest auto_increment)
Wykonaj zapytanie za pomocą mysqli_query().
Sprawdź wynik:
jeśli się uda - wyświetl komunikat o sukcesie
jeśli nie - komunikat o błędzie
Zamknij połączenie z bazą (mysqli_close())
© 2026 Piskorowski Jakub. All rights reserved.