0

多くの異なる $_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'

リッチ。

4

2 に答える 2

1

SQL ステートメントを確認してください。必要がない場合でも、常にコンマを追加しています。次のようなことを試してください:

$comma = "";
$sql = "INSERT INTO $table (";  
foreach ($arr_digital as $key => $val){
    $sql.= $comma . "$key ";    
    $comma = ","
}

$comma = "";
$sql.= ") VALUES ( ";
foreach ($arr_digital as $key => $val){
    $sql.= $comma . ":$key ";
    $comma = ","
}

最初の実行では何も追加されませんが、その後の反復では変数の前にコンマが追加されます。

于 2012-09-26T16:01:48.360 に答える
0
    $digital_fee ='500';
    $banner_1 = '0';

    $arr_digital = array("digital_fee"=>$digital_fee, "banner_1"=>$banner_1);   
    $table = 'myTable';

    //create sql string with $vars
    foreach ($arr_digital as $key => $val){
        $columns[]= $key;  
        $vals [] = ':'.$key;
        $updates[]= "$key = :$key";

    }
    $column = implode(', ', $columns);
    $values = implode(', ', $vals);
    $update = implode(', ', $updates);

    $sql = "INSERT INTO $table ($column) VALUES ($values) ON DUPLICATE KEY UPDATE $update";  
    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();

今すぐ試してください..テストされていないのでうまくいくはずです

于 2012-09-26T16:13:53.747 に答える