0

PHPのpdoから準備されたステートメントを使用してSQLを挿入または更新しようとしています。最初にREPLACE INTOコマンドを使用することを考えましたが、インデックスに外部キーがあるため、エラーが発生します。機能させるには構文を使用する必要があることを読んでくださいINSERT...ON DUPLICATE KEY UPDATE。ただし、準備されたステートメントでそれを行う方法は明確ではありません。これに対する解決策はありますか?ありがとう。

SQLは次のとおりです。

$sql="REPLACE INTO fn_currencies(id,short,name,buy,sell,date) VALUES (:id,:short,:name,:buy,:sell,:update)";

UPD: PDO で個人用ラッパーを使用する Yii でこのクエリを作成しています。名前のないパラメーターを使用すると、次のタイプのエラーが発生します。

CDbCommand failed to execute the SQL statement: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens. The SQL statement executed was: INSERT INTO `fn_currencies` (id,short,name,buy,sell,date) VALUES (?,?,?,?,?,?) ON DUPLICATE KEY UPDATE id=?,short=?,name=?,buy=?,sell=?,date=? 

前述のように、挿入と更新に異なる名前の名前付きパラメーターを使用すると、エラーが発生せず、DB にデータが挿入されません。DB のスキーマは次のとおりです。

CREATE TABLE IF NOT EXISTS `fn_currencies` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `short` varchar(4) NOT NULL,
  `name` varchar(200) NOT NULL,
  `buy` decimal(10,4) NOT NULL,
  `sell` decimal(10,4) NOT NULL,
  `date` date NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

--
ALTER TABLE `fn_currencies`
  ADD CONSTRAINT `FK_fn_currencies` FOREIGN KEY (`id`) REFERENCES `fn_operations` (`currency_id`);
4

1 に答える 1

3

DavaRandomのおかげで、彼は私のコードのエラーを指摘しましたが、これでうまくいくはずです。名前付きパラメーターをに置き換え、?配列マージを使用して、次のようにオンザフライでSQLを作成します。

$sql="
    insert INTO fn_currencies(id,short,name,buy,sell,date) 
    VALUES (?,?,?,?,?,?)
    on duplicate key update currencies set 
        short=?, name=?, buy=?, sell=?, update=?";
$values=array("id"=>1, "short"=>36, "name"=>'Bazinga', "sell"=>3.67, "date"=>'2012-08-08');
$db->query($sql, array_merge(array_values($values),array_values($values)));

どうやらこれも機能しますが(yes / no / maybeに関するページ全体のコメントを参照)、上記は確かに機能します:

$sql="
    insert INTO fn_currencies(id,short,name,buy,sell,date) 
    VALUES (:id,:short,:name,:buy,:sell,:update)
    on duplicate key update currencies set 
        short=:short, name=:name, buy=:buy, sell=:Sell, update=:update";
于 2012-08-08T10:26:43.500 に答える