W formularzu dokumentu PHP istnieje pole <input name="im">. Po wprowadzeniu przez użytkownika ciągu znaków "Janek", w celu dodania zawartości pola do bazy danych, w tablicy $_POST zawarty jest element
W tablicy $_POST element będzie miał indeks im, a jego wartością będzie tekst Janek, czyli praktycznie odczyt wyglądałby tak: $_POST["im"] zwróci "Janek". Wynika to z zasady działania formularzy HTML wysyłanych metodą POST: atrybut name pola formularza staje się nazwą klucza w tablicy asocjacyjnej, a wpisana przez użytkownika zawartość staje się wartością tego elementu. Czyli nie PHP wymyśla tutaj kolejny numer indeksu, tylko korzysta z nazwy pola podanej w formularzu. Moim zdaniem to jedna z ważniejszych rzeczy przy obsłudze formularzy, bo potem dokładnie tak pobiera się dane do walidacji, zapisu do bazy albo dalszego przetwarzania. Przykładowo przed dodaniem imienia do bazy danych zwykle robi się coś w stylu: $imie = $_POST["im"]; a potem sprawdza, czy pole nie jest puste, czy ma poprawną długość i dopiero używa się zapytania przygotowanego, np. przez PDO. Dobra praktyka branżowa jest taka, żeby nigdy nie wkładać $_POST bezpośrednio do SQL, bo użytkownik może wpisać dowolny tekst, także szkodliwy. Najpierw walidacja, potem filtrowanie lub rzutowanie, a przy bazie danych parametryzowane zapytania. Sam mechanizm indeksu pozostaje jednak prosty: name="im" daje klucz im, a wpisane "Janek" daje wartość.
W tym pytaniu łatwo pomylić dwie rzeczy: nazwę pola formularza i wartość wpisaną przez użytkownika. W formularzach HTML atrybut name nie jest daną wpisaną przez użytkownika, tylko etykietą techniczną, pod którą PHP zapisze przesłaną wartość. Jeżeli pole ma nazwę name="im", to po wysłaniu metodą POST w tablicy $_POST pojawi się element dostępny przez $_POST["im"]. Dopiero pod tym indeksem znajduje się tekst "Janek". Dlatego myślenie, że "Janek" staje się indeksem, jest odwróceniem relacji klucz-wartość. W tablicy asocjacyjnej PHP klucz pochodzi z nazwy kontrolki formularza, a wartość pochodzi z tego, co użytkownik wprowadził.
Nie pasuje tu też pomysł z kolejnym numerem indeksu. Automatyczne indeksy liczbowe pojawiają się zwykle wtedy, gdy tworzymy zwykłą tablicę bez podawania kluczy, na przykład $tab[] = "Janek". Formularz POST działa inaczej, bo dane przychodzą w parach nazwa=wartość. Przeglądarka wysyła coś w rodzaju im=Janek, a PHP zamienia to na tablicę asocjacyjną. To jest bardzo praktyczne, bo w większym formularzu można mieć pola login, email, haslo i każde z nich odczytuje się po konkretnej nazwie. Z mojego doświadczenia sporo osób zapamiętuje tylko, że $_POST to „tablica z formularza”, ale nie zwraca uwagi, skąd biorą się indeksy. A to potem powoduje błędy typu odczytywanie $_POST["Janek"] albo oczekiwanie, że dane będą pod numerem 0. Przy zapisie do bazy danych poprawny schemat to: pobrać $_POST["im"], sprawdzić dane, zabezpieczyć zapytanie i dopiero wykonać INSERT.
Nie pasuje tu też pomysł z kolejnym numerem indeksu. Automatyczne indeksy liczbowe pojawiają się zwykle wtedy, gdy tworzymy zwykłą tablicę bez podawania kluczy, na przykład $tab[] = "Janek". Formularz POST działa inaczej, bo dane przychodzą w parach nazwa=wartość. Przeglądarka wysyła coś w rodzaju im=Janek, a PHP zamienia to na tablicę asocjacyjną. To jest bardzo praktyczne, bo w większym formularzu można mieć pola login, email, haslo i każde z nich odczytuje się po konkretnej nazwie. Z mojego doświadczenia sporo osób zapamiętuje tylko, że $_POST to „tablica z formularza”, ale nie zwraca uwagi, skąd biorą się indeksy. A to potem powoduje błędy typu odczytywanie $_POST["Janek"] albo oczekiwanie, że dane będą pod numerem 0. Przy zapisie do bazy danych poprawny schemat to: pobrać $_POST["im"], sprawdzić dane, zabezpieczyć zapytanie i dopiero wykonać INSERT.