From 1c130c628f7d513f02db6508661410c12bb6ce66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=B1=E9=87=91=E5=8B=87?= Date: Mon, 17 Apr 2023 02:07:22 +0000 Subject: [PATCH] * Fix bug#34201. --- lib/dao/dm.class.php | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/lib/dao/dm.class.php b/lib/dao/dm.class.php index feff0f2812..e83ba45c1b 100644 --- a/lib/dao/dm.class.php +++ b/lib/dao/dm.class.php @@ -298,12 +298,18 @@ class dm extends dao return parent::on($condition); } - public function getPKColumns() + /** + * 获取唯一索引的列。 + * Get unique columns. + * + * @access public + * @return array + */ + public function getUniqueColumns() { - $sql = "SELECT A.OWNER, A.TABLE_NAME, WM_CONCAT(B.COLUMN_NAME) PK_COLUMNS FROM ALL_CONSTRAINTS A, ALL_CONS_COLUMNS B where A.CONSTRAINT_type = 'P' AND A.OWNER = '{$this->config->db->name}' AND A.TABLE_NAME = '{$this->table}' AND B.OWNER = A.OWNER AND A.TABLE_NAME = B.TABLE_NAME GROUP BY A.OWNER, A.TABLE_NAME;"; + $sql = "SELECT * from dba_ind_columns WHERE index_owner = '{$this->config->db->name}' AND index_name IN (SELECT index_name FROM dba_indexes WHERE table_name='{$this->table}' AND INDEX_TYPE = 'NORMAL' AND UNIQUENESS = 'UNIQUE' AND INDEX_NAME NOT IN (SELECT INDEX_NAME FROM DBA_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'P'))"; - $content = $this->dbh->query($sql)->fetch(); - return empty($content) ? false : $content->PK_COLUMNS; + return $this->dbh->query($sql)->fetchAll(); } /** @@ -347,17 +353,18 @@ class dm extends dao $insertSql .= $fields . ' ' . $values; $updateSql = str_replace('REPLACE', 'UPDATE', $sql); - $pks = $this->getPKColumns(); - if(!empty($pks)) + $cols = $this->getUniqueColumns(); + + /* No unique keys, no replace. */ + if(empty($cols)) return false; + + $conditions = array(); + foreach($cols as $col) { - $pks = explode(',', $pks); - $conditions = array(); - foreach($pks as $pk) - { - if(isset($this->sqlobj->data->{$pk})) $conditions[] = " \"{$pk}\" = '{$this->sqlobj->data->{$pk}}'"; - } - if(!empty($conditions)) $updateSql .= ' WHERE ' . implode(' AND ', $conditions); + $pk = $col->COLUMN_NAME; + if(isset($this->sqlobj->data->{$pk})) $conditions[] = " \"{$pk}\" = '{$this->sqlobj->data->{$pk}}'"; } + if(!empty($conditions)) $updateSql .= ' WHERE ' . implode(' AND ', $conditions); $deleteSql = "DELETE FROM \"{$this->table}\" WHERE "; $ingore = array();