ADOdbのReplaceの問題点

どうやらキーのみを指定すると必ずINSERTにいってデータがあるとキー重複エラーになる模様。
で、ソースを追ってみると adodb-lib.inc.php の _adodb_replace() 関数にたどり着き
中では大幅に略すと以下のようなロジックに

  1. キーと値を指定しているとUPDATE文を作成し更新
  2. UPDATE文を発行済かつ条件にマッチする行があれば正常終了
  3. 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で確認した際の話。