まず第一に、あなたはステートメントを完全に誤解しています。:)
方法は次のとおりです。
$query = "insert into customer (name, address, city, state, zip) values (?, ?, ?, ?, ?)";
$statement = $dbh->prepare($query);
$statement->execute(array($name, $address, $city, $state, $zip));
間違いなく自分でわかるよう$columns
に、例では変数を利用していません。それはクエリの一部である必要があります。
2 つ目の間違いは、データ変数を直接文字列に補間しようとしたことです。準備されたステートメントの全体的なポイントは、それを回避することです。代わりにプレースホルダー (この場合は ? 文字) を使用します。PDO は、指定した順序で実際の変数をプレースホルダーに置き換えます。これは、配列を使用して実行ステートメントへのパラメーターとしてそれらを PDO に送信することによって行われます。
これは、すべてのセキュリティ リスクを排除するため、完全なクエリを文字列として作成する古い方法よりもはるかに優れています。あなたが行った方法でクエリを作成することによって引き起こされる脆弱性は非常に現実的であり、おそらくインターネット上で最も一般的なセキュリティ ホールです。詳しく知りたい方は「SQLインジェクション」で検索してみてください。
エラーが発生しない理由は、おそらくエラー報告メカニズムを設定していないためです。接続後にこれを追加してみてください:
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);