Jeśli kiedykolwiek tworzyłeś formularze w PHP, to pewnie wiesz, że przekazywanie danych z prostych pól formularza jest banalne. Wystarczy $_POST['nazwa_pola'] i gotowe. Ale co, jeśli potrzebujesz przesłać całą tablicę danych, np. listę produktów, użytkowników albo odpowiedzi na pytania? A jeszcze lepiej – co jeśli chcesz używać tablic wielowymiarowych, czyli takich, które zawierają tablice w tablicach?
Brzmi jak coś skomplikowanego, ale spokojnie – zaraz to rozgryziemy.
W tym artykule pokażę Ci krok po kroku, jak stworzyć formularz z tablicami wielowymiarowymi w PHP, jak poprawnie je obsługiwać po stronie serwera i jak uniknąć typowych błędów, które doprowadzają początkujących do szewskiej pasji.
Co to w ogóle jest tablica wielowymiarowa w PHP?
Zacznijmy od podstaw.
Tablica wielowymiarowa to po prostu tablica, która zawiera inne tablice.
Wyobraź sobie np. listę produktów w sklepie internetowym. Każdy produkt ma swoje cechy: nazwę, cenę i ilość. W PHP moglibyśmy to zapisać tak:
$produkty = [
[
'nazwa' => 'Laptop',
'cena' => 3500,
'ilosc' => 2
],
[
'nazwa' => 'Myszka',
'cena' => 79,
'ilosc' => 5
]
];
To właśnie tablica dwuwymiarowa – tablica produktów, gdzie każdy produkt sam w sobie jest tablicą.
Dlaczego warto używać tablic w formularzach?
Bo dzięki nim możesz w prosty sposób przesłać wiele rekordów jednocześnie.
Na przykład, jeśli tworzysz panel administracyjny, możesz umożliwić edycję wielu produktów naraz — zamiast wysyłać dane każdego z osobna.
PHP ma genialną cechę: jeżeli nazwiesz pole formularza z nawiasami kwadratowymi ([]), to PHP automatycznie zbuduje tablicę z tych danych.
A jeśli zagnieździsz te nawiasy, otrzymasz tablicę wielowymiarową.
Przykład prostego formularza z tablicą wielowymiarową
Okej, czas na praktykę!
Zróbmy prosty formularz, w którym użytkownik może edytować kilka produktów.
HTML (formularz):
<form action="formularz.php" method="post">
<h3>Produkt 1</h3>
<input type="text" name="produkty[0][nazwa]" placeholder="Nazwa" value="Laptop">
<input type="number" name="produkty[0][cena]" placeholder="Cena" value="3500">
<input type="number" name="produkty[0][ilosc]" placeholder="Ilość" value="2">
<h3>Produkt 2</h3>
<input type="text" name="produkty[1][nazwa]" placeholder="Nazwa" value="Myszka">
<input type="number" name="produkty[1][cena]" placeholder="Cena" value="79">
<input type="number" name="produkty[1][ilosc]" placeholder="Ilość" value="5">
<br><br>
<button type="submit">Zapisz zmiany</button>
</form>
Zwróć uwagę na nazwy pól:
produkty[0][nazwa]produkty[0][cena]produkty[0][ilosc]produkty[1][nazwa]itd.
Dzięki temu, po wysłaniu formularza PHP automatycznie zbuduje taką strukturę:
$_POST['produkty'] = [
0 => [
'nazwa' => 'Laptop',
'cena' => 3500,
'ilosc' => 2
],
1 => [
'nazwa' => 'Myszka',
'cena' => 79,
'ilosc' => 5
]
];
Obsługa danych po stronie PHP
No dobra, formularz mamy, to teraz zobaczmy, jak te dane odebrać i przetworzyć.
Kod PHP (formularz.php):
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$produkty = $_POST['produkty'] ?? [];
echo "<h2>Otrzymane dane:</h2>";
echo "<pre>";
print_r($produkty);
echo "</pre>";
foreach ($produkty as $index => $produkt) {
$nazwa = htmlspecialchars($produkt['nazwa']);
$cena = (float)$produkt['cena'];
$ilosc = (int)$produkt['ilosc'];
echo "Produkt #$index: $nazwa, cena: $cena zł, ilość: $ilosc szt.<br>";
}
}
?>
Tutaj robimy trzy rzeczy:
- Sprawdzamy, czy formularz został wysłany (
$_SERVER['REQUEST_METHOD'] === 'POST'). - Odbieramy dane z
$_POST['produkty']. - Iterujemy po każdym produkcie i wyświetlamy go.
Walidacja danych — bo bezpieczeństwo to podstawa
Nie możemy jednak ślepo ufać danym z formularza.
Użytkownik może przecież wysłać cokolwiek — nawet próbę wstrzyknięcia kodu HTML czy JavaScript.
Dlatego zawsze stosuj filtrowanie i walidację.
Na przykład:
foreach ($produkty as $index => $produkt) {
$nazwa = htmlspecialchars(trim($produkt['nazwa']));
$cena = filter_var($produkt['cena'], FILTER_VALIDATE_FLOAT);
$ilosc = filter_var($produkt['ilosc'], FILTER_VALIDATE_INT);
if ($cena === false || $ilosc === false) {
echo "Błąd w produkcie #$index – nieprawidłowe dane liczbowe!<br>";
continue;
}
echo "OK: $nazwa, cena: $cena zł, ilość: $ilosc szt.<br>";
}
Dzięki temu masz pewność, że dane, które przetwarzasz, są bezpieczne.
Dynamiczne dodawanie produktów w JavaScript
Okej, ale co jeśli chcesz, żeby użytkownik mógł sam dodać więcej produktów bez odświeżania strony?
Wtedy przyda się odrobina JavaScriptu.
Przykład:
<form action="formularz.php" method="post" id="produktyForm">
<div id="produktyList">
<div class="produkt">
<input type="text" name="produkty[0][nazwa]" placeholder="Nazwa">
<input type="number" name="produkty[0][cena]" placeholder="Cena">
<input type="number" name="produkty[0][ilosc]" placeholder="Ilość">
</div>
</div>
<button type="button" id="dodajProdukt">+ Dodaj produkt</button>
<button type="submit">Wyślij</button>
</form>
<script>
let index = 1;
document.getElementById('dodajProdukt').addEventListener('click', () => {
const div = document.createElement('div');
div.classList.add('produkt');
div.innerHTML = `
<input type="text" name="produkty[${index}][nazwa]" placeholder="Nazwa">
<input type="number" name="produkty[${index}][cena]" placeholder="Cena">
<input type="number" name="produkty[${index}][ilosc]" placeholder="Ilość">
`;
document.getElementById('produktyList').appendChild(div);
index++;
});
</script>
W ten sposób użytkownik może dodać dowolną liczbę produktów, a PHP i tak odbierze je jako tablicę wielowymiarową.
Częste błędy i jak ich uniknąć
Okej, teraz kilka pułapek, które potrafią napsuć krwi:
1. Niezgodne indeksy
Jeśli pomylisz się w nazwach pól (produkty[1][cena], ale produkty[2][ilosc]), dane się nie połączą poprawnie.
Zawsze dbaj o spójność indeksów!
2. Brak walidacji
Nigdy nie ufaj danym z $_POST.
Używaj filter_var(), htmlspecialchars() i sprawdzaj typy danych.
3. Puste wartości
Jeśli użytkownik zostawi puste pola, PHP nadal utworzy tablicę.
Warto więc filtrować puste produkty przed zapisaniem ich do bazy danych.
Jak zapisać dane z tablicy wielowymiarowej do bazy danych (MySQL)
Skoro już mamy poprawne dane, możemy je zapisać do bazy.
Oto przykład z użyciem PDO:
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$produkty = $_POST['produkty'] ?? [];
$pdo = new PDO('mysql:host=localhost;dbname=sklep;charset=utf8', 'root', '');
$stmt = $pdo->prepare("INSERT INTO produkty (nazwa, cena, ilosc) VALUES (:nazwa, :cena, :ilosc)");
foreach ($produkty as $produkt) {
if (empty($produkt['nazwa'])) continue;
$stmt->execute([
':nazwa' => $produkt['nazwa'],
':cena' => (float)$produkt['cena'],
':ilosc' => (int)$produkt['ilosc']
]);
}
echo "Produkty zapisane pomyślnie!";
}
?>
W praktyce możesz dodać też aktualizację istniejących produktów lub usuwanie – mechanizm będzie dokładnie taki sam.
Tworzenie formularza z tablicami wielowymiarowymi w PHP wcale nie jest trudne.
Wystarczy zrozumieć, jak PHP buduje strukturę tablic z nazw pól formularza.
Najważniejsze rzeczy do zapamiętania:
- Używaj nawiasów kwadratowych w nazwach pól (
name="produkty[0][nazwa]"). - Odbieraj dane przez
$_POST['produkty']. - Waliduj dane, zanim ich użyjesz.
- Możesz łatwo rozbudować formularz o dynamiczne dodawanie pól w JavaScript.
- Tablice wielowymiarowe świetnie nadają się do pracy z wieloma rekordami naraz (np. edycja wielu produktów).
Dzięki temu prostemu mechanizmowi PHP możesz w sposób uporządkowany i bezpieczny przesyłać złożone dane z formularzy – niezależnie od tego, czy tworzysz panel administracyjny, system ankiet, czy sklep internetowy.