mysql = new Mysql( $master ); if( isset( $slave ) && $slave ){ $this->mysql->setSlave( $slave ); } } public function __set( $key , $value ){ if( $key == 'do_replication' ){ $this->mysql->$key = $value; return true; } } public function __get( $key ){ if( $key == 'sql' ){ return $this->getSql(); } } public function escape( $str ){ return $this->mysql->escape( $str ); } private function getSql(){ if( $this->ar_from ){ $this->ar_sql = $this->_compile_select(); $this->_resetCache(); } if( $this->ar_sql ){ return $this->ar_sql; }else{ die('can not make sql...'); } } public function getData( $sql = NULL , $key = NULL ){ if( $sql == NULL ){ $sql = $this->getSql(); }else{ $this->_resetCache(); $this->ar_sql = $sql; } return $this->mysql->getData($sql , $key ); } public function getLine( $sql = NULL ){ if( $sql == NULL ){ $sql = $this->getSql(); }else{ $this->_resetCache(); $this->ar_sql = $sql; } return $this->mysql->getLine($sql); } public function getVar( $sql = NULL ){ if( $sql == NULL ){ $sql = $this->getSql(); }else{ $this->_resetCache(); $this->ar_sql = $sql; } return $this->mysql->getVar($sql); } public function runSql( $sql = NULL ){ if( $sql == NULL ){ $sql = $this->getSql(); }else{ $this->_resetCache(); $this->ar_sql = $sql; } return $this->mysql->runSql($sql); } public function lastId(){ return $this->mysql->lastId(); } public function error(){ return $this->mysql->error(); } public function delete($table = '', $where = '', $limit = NULL, $reset_data = TRUE){ if ($table == ''){ if ( ! isset($this->ar_from[0])){ die('can not delete error no params...'); } $table = $this->ar_from[0]; }elseif (is_array($table)){ foreach ($table as $single_table){ $this->delete($single_table, $where, $limit, FALSE); } $this->_resetCache(); return; } if ($where != ''){ $this->where($where); } if ($limit != NULL){ $this->limit($limit); } if (count($this->ar_where) == 0 && count($this->ar_like) == 0){ die('db_del_must_use_where...'); } $sql = $this->_delete($table, $this->ar_where, $this->ar_like, $this->ar_limit); if ($reset_data){ $this->ar_sql = $sql; $this->_resetCache(); } return $this->runSql($sql); } public function replace($table = '', $set = NULL){ if ( ! is_null($set)){ $this->set($set); } if (count($this->ar_set) == 0){ die('can not replace error no params...'); } if ($table == ''){ if ( ! isset($this->ar_from[0])){ die('can not replace error no table to use...'); } $table = $this->ar_from[0]; } $sql = $this->_replace($table, array_keys($this->ar_set), array_values($this->ar_set)); $this->ar_sql = $sql; $this->_resetCache(); return $this->runSql($sql); } public function update($table = '', $set = NULL, $where = NULL, $limit = NULL , $escape = true ){ if ( ! is_null($set)){ $this->set($set); } if (count($this->ar_set) == 0){ die('can not update error no params...'); } if ($table == ''){ if ( ! isset($this->ar_from[0])){ die('can not update error no table to use...'); } $table = $this->ar_from[0]; } if ($where != NULL){ $this->where($where); } if ($limit != NULL){ $this->limit($limit); } if ( $escape && !preg_match("/(`)/i", trim($table))){ $table = '`'.trim($table).'`'; } $sql = $this->_update($table, $this->ar_set, $this->ar_where, $this->ar_orderby, $this->ar_limit); $this->ar_sql = $sql; $this->_resetCache(); return $this->runSql($sql); } public function insert($table = '', $set = NULL){ if ( ! is_null($set)){ $this->set($set); } if (count($this->ar_set) == 0){ die('can not insert error no params...'); } if ($table == ''){ if ( ! isset($this->ar_from[0])){ die('can not insert error no table to use...'); } $table = $this->ar_from[0]; } $sql = $this->_insert($table, array_keys($this->ar_set), array_values($this->ar_set)); $this->ar_sql = $sql; $this->_resetCache(); return $this->runSql($sql); } public function select($select = '*'){ if (is_string($select)){ $select = explode(',', $select); } foreach ($select as $val){ $val = trim($val); if ($val != ''){ $this->ar_select[] = $val; } } return $this; } public function from($from , $escape = true ){ foreach ((array)$from as $val){ if (strpos($val, ',') !== FALSE){ foreach (explode(',', $val) as $v){ $v = trim($v); if ($escape && !preg_match("/(`)/i", $v )){ $v = '`'.trim($v).'`'; } $this->ar_from[] = $v; } }else{ $val = trim($val); if ($escape && !preg_match("/(`)/i", $val )){ $val = '`'.trim($val).'`'; } $this->ar_from[] = $val; } } return $this; } function like($field, $match = ''){ return $this->_like($field, $match, 'AND '); } function notLike($field, $match = '', $side = 'both'){ return $this->_like($field, $match, 'AND ', 'NOT'); } function orLike($field, $match = ''){ return $this->_like($field, $match, 'OR '); } function orNotLike($field, $match = ''){ return $this->_like($field, $match, 'OR ', 'NOT'); } public function where($key, $value = NULL){ return $this->_where($key, $value, 'AND '); } public function orWhere($key, $value = NULL, $escape = TRUE){ return $this->_where($key, $value, 'OR ', $escape); } public function orderBy($orderby, $direction = '' , $escape = true ){ if (trim($direction) != ''){ $direction = (in_array(strtoupper(trim($direction)), array('ASC', 'DESC'), TRUE)) ? ' '.$direction : ' ASC'; } if ( $escape && strpos($orderby, ',') !== FALSE){ $temp = array(); foreach (explode(',', $orderby) as $part) { $part = trim($part); $temp[] = '`'.$part.'`'; } $orderby = implode(', ', $temp); }elseif($escape == true ){ $orderby ='`'.$orderby.'`'; } $orderby_statement = $orderby.$direction; $this->ar_orderby[] = $orderby_statement; return $this; } public function limit($value , $offset = NULL){ $this->ar_limit = $value; if ($offset != ''){ $this->ar_offset = $offset; } return $this; } public function set($key, $value = NULL , $escape = true ){ if ( ! is_array($key)){ if(is_null($value) && $this->_has_operator($key) ){ $key = array( $key ); }else{ $key = array($key => $value); } } foreach ($key as $k => $v){ if( is_numeric($k) && strpos( $v , '=' ) !== false ){ list( $k , $v ) = explode( '=' , $v , 2 ); $k = trim($k); $v = trim($v); if( $escape ){ if ( !preg_match("/(`)/i", trim($k))){ $k = '`'.trim($k).'`'; } if ( !preg_match("/(\-|\+)/i", $v)){ $v = '`'.trim($v).'`'; } } }else{ if ( $escape ){ $k = '`'.$k.'`'; $v = "'".$this->escape($v)."'"; } } $this->ar_set[$k] = $v; } return $this; } private function _resetCache(){ $this->ar_select = array(); $this->ar_from = array(); $this->ar_where = array(); $this->ar_like = array(); $this->ar_offset = FALSE; $this->ar_limit = FALSE; $this->ar_orderby = array(); $this->ar_set = array(); } private function _like($field, $match = '', $type = 'AND ', $not = ''){ if ( ! is_array($field)){ $field = array($field => $match); } foreach ($field as $k => $v){ $prefix = (count($this->ar_like) == 0) ? '' : $type; $v = $this->escape($v); $like_statement = $prefix." `$k` $not LIKE '%{$v}%'"; $this->ar_like[] = $like_statement; } return $this; } private function _where($key, $value = NULL, $type = 'AND ', $escape = NULL){ if ( ! is_array($key)){ $key = array($key => $value); } // If the escape value was not set will will base it on the global setting if ( ! is_bool($escape)){ //$escape = $this->_protect_identifiers; } foreach ($key as $k => $v){ $prefix = (count($this->ar_where) == 0 ) ? '' : $type; if( !is_numeric($k) ){ if (is_null($v) && ! $this->_has_operator($k)){ // value appears not to have been set, assign the test to IS NULL $k = '`'.$k.'`'.' IS NULL'; //$v = "'".$this->escape($v)."'"; } if ( ! is_null($v)){ if ( ! $this->_has_operator($k)){ $k = '`'.$k.'` ='; } $v = "'".$this->escape($v)."'"; } }else{ $k = NULL; } $this->ar_where[] = $prefix.$k.$v; } return $this; } private function _has_operator($str){ $str = trim($str); if ( ! preg_match("/(\s|<|>|!|=|is null|is not null)/i", $str)){ return FALSE; } return TRUE; } private function _compile_select(){ $sql = 'SELECT ' ; if (count($this->ar_select) == 0){ $sql .= '*'; }else{ $sql .= implode(', ', $this->ar_select); } if (count($this->ar_from) > 0){ $sql .= "\nFROM "; $sql .= implode("\n", $this->ar_from); } if (count($this->ar_where) > 0 OR count($this->ar_like) > 0){ $sql .= "\n"; $sql .= "WHERE "; } $sql .= implode("\n", $this->ar_where); if (count($this->ar_like) > 0){ if (count($this->ar_where) > 0){ $sql .= "\nAND "; } $sql .= implode("\n", $this->ar_like); } if (count($this->ar_orderby) > 0){ $sql .= "\nORDER BY "; $sql .= implode(', ', $this->ar_orderby); } if (is_numeric($this->ar_limit)){ $sql .= "\nLIMIT "; $sql .= $this->ar_limit; if( intval( $this->ar_offset ) ){ $sql .= ','.intval( $this->ar_offset ); } } return $sql; } private function _insert($table , $keys , $values ){ $sql = "INSERT INTO $table (".join(',',$keys).")VALUES(".join(",",$values).")"; return $sql; } private function _update($table, $values, $where, $orderby = array(), $limit = FALSE){ foreach ($values as $key => $val){ $valstr[] = $key . ' = ' . $val; } $limit = ( ! $limit) ? '' : ' LIMIT '.$limit; $orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):''; $sql = "UPDATE ".$table." SET ".implode(', ', $valstr); $sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : ''; $sql .= $orderby.$limit; return $sql; } private function _replace($table, $keys, $values){ return "REPLACE INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")"; } private function _delete($table, $where = array(), $like = array(), $limit = FALSE){ $conditions = ''; if (count($where) > 0 OR count($like) > 0){ $conditions = "\nWHERE "; $conditions .= implode("\n", $where); if (count($like) > 0){ $conditions .= " AND "; $conditions .= implode("\n", $like); } } $limit = ( ! $limit) ? '' : ' LIMIT '.$limit; return "DELETE FROM ".$table.$conditions.$limit; } }