ADOdbのReplaceの問題点
どうやらキーのみを指定すると必ずINSERTにいってデータがあるとキー重複エラーになる模様。
で、ソースを追ってみると adodb-lib.inc.php の _adodb_replace() 関数にたどり着き
中では大幅に略すと以下のようなロジックに
- キーと値を指定しているとUPDATE文を作成し更新
- UPDATE文を発行済かつ条件にマッチする行があれば正常終了
- INSERT文発行
INSERT文発行の制限をかけてない、、(ノ∀`)タハー
ということでINSERT文発行前にキーのみの指定だったらその行が存在するかのチェックを追加
adodb-lib.inc.php の _adodb_replace() 関数 90行目付近に以下を追加
if ($uSet && $where) { $update = "UPDATE $table SET $uSet WHERE $where"; ・・・・ } //Mod:Start キー値のみのReplace対応 if (!$uSet) { $cnt = $zthis->GetOne("select count(*) from $table where $where"); if ($cnt > 0) return 1; // record already exists } //Mod:End キー値のみのReplace対応 // print "<p>Error=".$this->ErrorNo().'<p>'; $first = true; foreach($fieldArray as $k => $v) { if ($has_autoinc && in_array($k,$keyCol)) continue; // skip autoinc col
該当の行、挙動等はV4.64で確認した際の話。