多くの異なる $_POST データをデータベースに挿入するために必要な PHP コードの量を削減しようとしています。私は現在、名前付きパラメーターで PDO を使用しており、毎回手動でリストしています。おそらく、私の例で試みているよりもクリーンで優れた方法がありますが、私はすでに次のようにリストした数百のキャプチャされた変数をリファクタリングできない立場にあります。
$digital_fee = (isset ($_POST['digital_fee']) ? $_POST['digital_fee'] : '');
$banner_1 = (isset ($_POST['banner_1']) ? 1 : 0);
そして、残りの PHP - SQL は次のように書き出されます。
$statement = $db->prepare("INSERT INTO $table
(digital_fee, banner_1)
VALUES
(:digital_fee, :banner_1)
ON DUPLICATE KEY UPDATE
digital_fee=:digital_fee, banner_1=:banner_1");
$statement->bindParam(':arn_mkt_stn', $arn_mkt_stn);
$statement->bindParam(':digital_fee', $digital_fee);
$statement->execute();
だから私はクラス/関数に変わり、既存の連想配列を渡すと思った以下のようなものをテストしています。
// example function to handle the PDO named params db inserts
$digital_fee ='500';
$banner_1 = '0';
$arr_digital = array("digital_fee"=>$digital_fee, "banner_1"=>$banner_1);
$table = 'myTable';
//create sql string with $vars
$sql = "INSERT INTO $table (";
foreach ($arr_digital as $key => $val){
$sql.= "$key, ";
}
$sql.= ") VALUES ( ";
foreach ($arr_digital as $key => $val){
$sql.= ":$key, ";
}
$sql.= ") ON DUPLICATE KEY UPDATE ";
foreach ($arr_digital as $key => $val){
$sql.= "$key=:$key, ";
}
echo $sql;
$statement = $db->prepare($sql);
$statement->bindParam(':arn_mkt_stn', $arn_mkt_stn);
foreach ($arr_digital as $key => $val){
$statement->bindParam(":$key, $val");
}
$statement->execute();
これを実行すると、形式に関連していると思われるエラーが返されます (うまくいけば) - メッセージは次のとおりです。
Fatal error:
Uncaught exception 'PDOException' with message
'SQLSTATE[42000]: Syntax error or access violation: 1064
You have an error in your SQL syntax; check the manual that corresponds
to your MySQL server version for the right syntax to use near
') VALUES ( '500', '0', ) ON DUPLICATE KEY UPDATE digital_fee='500', banner_1='0'' at line 1'
リッチ。