Index: trunk/core/kernel/db/dbitem.php =================================================================== diff -u -N -r7635 -r7855 --- trunk/core/kernel/db/dbitem.php (.../dbitem.php) (revision 7635) +++ trunk/core/kernel/db/dbitem.php (.../dbitem.php) (revision 7855) @@ -323,7 +323,7 @@ { $skip = false; $skip = $skip || ( isset($this->VirtualFields[$field_name]) ); //skipping 'virtual' field - $skip = $skip || ( !getArrayValue($this->FieldValues, $field_name) && getArrayValue($this->Fields[$field_name], 'skip_empty') ); //skipping 'virtual' field + $skip = $skip || ( !getArrayValue($this->FieldValues, $field_name) && getArrayValue($this->Fields[$field_name], 'skip_empty') ); //skipping marked field with 'skip_empty' // $skip = $skip || ($field_name == $this->IDField && !$force_id); //skipping Primary Key // $table_name = preg_replace("/^(.*)\./", "$1", $field_name); @@ -538,8 +538,14 @@ array_push($unique_fields,$field); foreach($unique_fields as $unique_field) { - $where[] = '`'.$unique_field.'` = '.$this->Conn->qstr( $this->GetDBField($unique_field) ); + // if field is not empty or if it is required - we add where condition + if ($this->GetDBField($unique_field) != '' || $this->Fields[$unique_field]['required']) { + $where[] = '`'.$unique_field.'` = '.$this->Conn->qstr( $this->GetDBField($unique_field) ); + } } + // This can ONLY happen if all unique fields are empty and not required. + // In such case we return true, because if unique field is not required there may be numerous empty values + if (!$where) return true; $sql = 'SELECT COUNT(*) FROM %s WHERE ('.implode(') AND (',$where).') AND ('.$this->IDField.' <> '.(int)$this->ID.')'; @@ -669,38 +675,43 @@ $fields_sql = ''; $values_sql = ''; - foreach ($this->FieldValues as $field_name => $field_value) - { + foreach ($this->FieldValues as $field_name => $field_value) { if ($this->SkipField($field_name, $force_id)) continue; - $fields_sql .= sprintf('`%s`, ',$field_name); //Adding field name to fields block of Insert statement - //Adding field' value to Values block of Insert statement, escaping it with ADODB' qstr - if (is_null( $this->FieldValues[$field_name] )) - { - if (isset($this->Fields[$field_name]['not_null']) && $this->Fields[$field_name]['not_null']) - { - $values_sql .= $this->Conn->qstr($this->Fields[$field_name]['default']).', '; - } - else - { - $values_sql .= 'NULL, '; - } - } - else - { - $values_sql .= sprintf('%s, ',$this->Conn->qstr($this->FieldValues[$field_name], 0)); - } + //Adding field' value to Values block of Insert statement, escaping it with qstr + if (is_null( $this->FieldValues[$field_name] )) { + if (isset($this->Fields[$field_name]['not_null']) && $this->Fields[$field_name]['not_null']) { + $values_sql .= $this->Conn->qstr($this->Fields[$field_name]['default'], 0); + } + else { + $values_sql .= 'NULL'; + } + } + else { + if ($field_name == $this->IDField && $this->FieldValues[$field_name] == 0) { + $values_sql .= 'DEFAULT'; + } + else { + $values_sql .= $this->Conn->qstr($this->FieldValues[$field_name], 0); + } + } + + $fields_sql .= '`'.$field_name.'`, '; //Adding field name to fields block of Insert statement + $values_sql .= ', '; } //Cutting last commas and spaces $fields_sql = ereg_replace(", $", '', $fields_sql); $values_sql = ereg_replace(", $", '', $values_sql); $sql = sprintf('INSERT INTO %s (%s) VALUES (%s)', $this->TableName, $fields_sql, $values_sql); //Formatting query //Executing the query and checking the result - if($this->Conn->ChangeQuery($sql) === false) return false; + if ($this->Conn->ChangeQuery($sql) === false) return false; $insert_id = $this->Conn->getInsertID(); - if($insert_id == 0) $insert_id = $this->FieldValues[$this->IDField]; + if ($insert_id == 0) { + // insert into temp table (id is not auto-increment field) + $insert_id = $this->FieldValues[$this->IDField]; + } $this->setID($insert_id); if (!$system_create){