* @version 1.3 */ class ADVANCEDMODEL extends Model{ /** * @var string $table Name der vom Model verwendeten MySQL-Tabelle. */ var $table = 'TABLE NAME'; /** * @var array $table_fields Array aller Tabellen-Felder, die lesbar sind. */ var $table_fields = array('*', 'my', 'table', 'fields'); /** * @var array $table_writable_fields Array aller Tabellen-Felder die beschreibbar sind. Hier die Auto-Increment Werte auslassen. */ var $table_writable_fields = array('my', 'table', 'fields'); /** * Konstruktor */ function ADVANCEDMODEL(){ parent::Model(); } /** * Checkt einen Array an Feldern gegen den Array mit erlaubten Feldern. * Übergeben wird entweder ein einfaches Array mit Datenbankfeldern als Werte, oder ein Key/Value Array mit Datenbankfeldern als Keys. * @param array $fields * @param bool[optional] $editMode Im Edit-Mode können nur beschreibbare Tabellenfelder genutzt werden, ansonsten sind alle Felder verfügbar (für SELECT empfohlen). * @return array */ function _checkFields($fields, $fieldSet){ $return = array(); foreach($fields as $key => $value){ if($key === intVal($key)){ //Keine Key/Value Zuordnung. if(in_array($value, $fieldSet) AND ! in_array($value, $return)) $return[] = $value; } else { //Key/Value Zuordnung if(in_array($key, $fieldSet) AND ! isset($return[$key])) $return[$key] = $value; } } return $return; } /** * Fügt einen neuen Eintrag in die Datenbank ein. * @param array $parameters * @return integer|false ID des neuen Eintrags. */ function add($parameters){ $insert = $this->_checkFields($parameters, $this->table_writable_fields); $query = $this->db->insert_string($this->table, $insert); $this->db->query($query); return $this->db->insert_id(); } /** * Entfernt einen Eintrag aus der Datenbank * ! Richte MySQL-Trigger für weitere Operationen ein ! * @param integer $ID * @return boolean */ function remove($ID){ $ID = (int)$ID; $query = 'DELETE FROM '.$this->table.' WHERE ID = '.$ID.' LIMIT 1;'; $this->db->query($query); if($this->db->affected_rows()) return TRUE; return FALSE; } /** * Ändert einen oder mehrere Einträge in der Datenbank. * @param integer|array|string $ID Eine ID, mehrere IDs im Array, oder * für alle Einträge. * @param array $parameters * @return boolean */ function set($ID, $parameters){ if($ID == (int)$ID) { $where = 'ID = '.(int)$ID.' LIMIT 1;'; } else if(is_array($ID)){ foreach($ID as $key => $value){ $ID[$key] = (int)$value; } $where = 'ID IN('.implode(',',$ID).');'; } else { $where = ';'; } $update = $this->_checkFields($parameters, $this->table_writable_fields); $query = $this->db->update_string($this->table, $update, $where); $this->db->query($query); if($this->db->affected_rows()) return TRUE; return FALSE; } /** * Gibt einen oder mehrere Einträge aus der Datenbank zurück. * @param integer|array|string $ID Eine ID, mehrere IDs im Array, oder * für alle Einträge (nicht empfohlen). * @param string $felder Zu selektierende Datenbankfelder. * @param string $filter Dient als Erweiterung des WHERE Bereichs, sowie für ORDER und LIMIT (LIMIT wird bei einer einzelnen ID automatisch gesetzt). * @return array|false Wird nur ein Feld von einem Datensatz verlangt, so wird der Wert des Feldes direkt zurückgegeben. */ function get($ID, $fields, $filter = NULL){ $suffix = ''; if($ID === intVal($ID)) { $where = 'WHERE ID = '.(int)$ID; $suffix = ' LIMIT 1;'; } else if(is_array($ID)){ foreach($ID as $key => $value){ $ID[$key] = (int)$value; } $where = 'WHERE ID IN('.implode(',',$ID).')'; } else { $where = 'WHERE '; if(! $filter) $where .= 'TRUE'; } if($filter) $where .= ' '.$filter; $where .= $suffix.';'; $sqlFields = $this->_checkFields(explode(',',$fields), $this->table_fields); $query = 'SELECT '.implode(',',$sqlFields).' FROM '.$this->table.' '.$where; $result = $this->db->query($query); if($result){ $resData = $result->result_array(); if(count($sqlFields) == 1 && count($resData) && $fields[0] != '*') return $resData[0][$fields[0]]; else return $resData; } return FALSE; } /** * Führt ein get() aus und konvertiert die Rückgabe in ein Key/Value Array, wobei $key als Key-Feld verwendet wird. * Dies ist hilfreich, wenn man zum Beispiel die id der Tabelle als Key verwendet und so mit $ergebnis[ID] direkt auf die Daten zugreifen kann. * @param string $key Name des Datenbankfeldes, das als Array Key benutzt werden soll. * @param integer|array|string $ID Eine ID, mehrere IDs im Array, oder * für alle Einträge (nicht empfohlen). * @param string $felder Zu selektierende Datenbankfelder. * @param string $filter Dient als Erweiterung des WHERE Bereichs, sowie für ORDER und LIMIT (LIMIT wird bei einer einzelnen ID automatisch gesetzt). * @return array|false */ function get_keyed($key, $ID, $fields, $filter = NULL){ $data = $this->get($ID, $fields, $filter); if( ! $data) return FALSE; if( ! isset($data[0][$key])) return FALSE; $result = array(); foreach($data as $item){ $result[$item[$key]] = $item; } return $result; } }