Jak stworzyć formularz z tablicami wielowymiarowymi

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:

  1. Sprawdzamy, czy formularz został wysłany ($_SERVER['REQUEST_METHOD'] === 'POST').
  2. Odbieramy dane z $_POST['produkty'].
  3. 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:

  1. Używaj nawiasów kwadratowych w nazwach pól (name="produkty[0][nazwa]").
  2. Odbieraj dane przez $_POST['produkty'].
  3. Waliduj dane, zanim ich użyjesz.
  4. Możesz łatwo rozbudować formularz o dynamiczne dodawanie pól w JavaScript.
  5. 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.

Szukasz taniego i dobrego hostingu dla swojej strony www? - Sprawdź Seohost.pl