PDOs vinculam dados de valor, não nomes de tabela e coluna.
Você está entendendo mal o uso de ligações. Você não pode vincular nomes de tabela e coluna com PDO. Você vincula dados para inserir INTO nessas colunas. Você precisa construir o SQL para incluir os nomes e colunas das tabelas usando operações de string.
Formatar os dados
Renomeei seu $column e $value para $column_array, $value_array para deixar claro o que são e assumi que cada um é um array simples:
$column_array = array('column1', 'column2', ...) etc.
$placeholders = array_map(function($col) { return ":$col"; }, $column_array);
$bindvalues = array_combine($placeholders , $value_array);
$ placeholders agora se parece com isso:
$placeholders = array(
':column1',
':column2',
...
);
$bindvalues agora se parece com isso:
$bindvalues = array(
':column1'=>'value1',
':column2'=>'value2',
...
);
Construir, preparar, executar
$sql = $this->connect->prepare("INSERT INTO $table (" .implode(",", $column_array) .") VALUES (". implode(",", $placeholders) . ")";
Isso lhe dará uma declaração preparada do formulário:
$sql = INSERT INTO table_name (column1, column2, ...) VALUES (:column1, :column2, ...)
Você pode então executar a instrução preparada e passar os $values como um argumento.
$sql->execute($bindValues);
Observação:
- Uma ressalva que deve ser mencionada. Certifique-se de que seus dados originais foram esterilizados em relação ao SQL Injection. Os PDOs cuidam disso para os valores vinculados, mas se você estiver construindo as colunas de, digamos, dados $_POST, isso é vulnerável e precisa ser higienizado.