jednak mam wątpliwości dla kolumn. Tam nie da się niestety użyć parametryzacji z PDO
Na chwilę obecną, po dokładnym sprawdzeniu, nie da się użyć parametryzacji w nazwach kolumn.
Można co najwyżej spróbować np. tak
$columns = ['nazwa_kolumny_1', 'nazwa_kolumny_2'];
$values = ['wartość_1', 'wartość_2'];
$placeholders = implode(', ', array_fill(0, count($columns), '?'));
$columns = implode(', ', array_map([$pdo, 'quote'], $columns));
$sql = "INSERT INTO tabela ($columns) VALUES ($placeholders)";
$stmt = $pdo->prepare($sql);
$stmt->execute([...$values]);
W powyższym przykładzie tworzymy tablicę z placeholderem (?) dla każdej nazwy kolumny, a następnie łączymy je za pomocą przecinka.
$placeholders = implode(', ', array_fill(0, count($columns), '?'));
Następnie odpowiednio filtrujemy nazwy kolumn i łączymy je również za pomocą przecinka.
$columns = implode(', ', array_map([$pdo, 'quote'], $columns));
Powyższa linia służy do tworzenia ciągu znaków z nazwami kolumn, które następnie będą wstawione do zapytania SQL.
Funkcja array_map() wykonuje podany callback ,funkcję dla każdego elementu tablicy. W naszym przypadku podajemy callback jako tablicę z dwoma elementami: obiektem PDO oraz nazwą metody (quote). Funkcja quote() jest metodą obiektu PDO, która zwraca bezpieczny ciąg znaków zapytania SQL dla podanego ciągu znaków. Dzięki temu nazwy kolumn są odpowiednio zabezpieczone przed atakami typu SQL injection.
Funkcja implode() łączy elementy tablicy w jeden ciąg znaków. W naszym przypadku elementy tablicy są łączone za pomocą przecinka i spacji.
W rezultacie otrzymujemy ciąg znaków z odpowiednio zabezpieczonymi nazwami kolumn, który możemy wstawić do zapytania SQL.
W końcu łączymy nazwy kolumn i wartości w jedną tablicę i przekazujemy ją jako parametr do metody execute().
[...$values] - splat operator