Прежде всего, вы совершенно не поняли заявления. :)
Вот как это должно быть сделано:
$query = "insert into customer (name, address, city, state, zip) values (?, ?, ?, ?, ?)";
$statement = $dbh->prepare($query);
$statement->execute(array($name, $address, $city, $state, $zip));
Как вы, без сомнения, можете видеть себя, вы даже не использовали свою переменную $columns
в своем примере. Это должно быть частью запроса.
Ваша вторая ошибка заключалась в том, что вы пытались интерполировать переменные данных непосредственно в строку. Весь смысл подготовленных заявлений состоит в том, чтобы этого избежать. Вместо этого вы используете заполнители (в данном случае символ?). PDO будет заменять фактические переменные в том же порядке, в каком вы их предоставляете. Это делается путем отправки их в PDO в качестве параметра оператора execute с использованием массива.
Это намного превосходит старый метод построения полного запроса в виде строки, поскольку он устраняет все риски безопасности. Уязвимости, вызванные построением запроса так, как вы это сделали, очень реальны и, вероятно, являются самой распространенной дырой в безопасности в Интернете. Попробуйте поискать «SQL-инъекцию», если хотите узнать больше.
Причина, по которой вы не получаете сообщение об ошибке, возможно, заключается в том, что вы не установили механизм сообщения об ошибках. Попробуйте добавить это после подключения:
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);