444 lines
12 KiB
PHP
444 lines
12 KiB
PHP
|
<?php
|
||
|
class Db{
|
||
|
public $ar_sql = NULL;
|
||
|
private $ar_select = array();
|
||
|
private $ar_from = array();
|
||
|
private $ar_where = array();
|
||
|
private $ar_like = array();
|
||
|
private $ar_set = array();
|
||
|
private $ar_offset = FALSE;
|
||
|
//private $ar_groupby = array();
|
||
|
private $ar_limit = FALSE;
|
||
|
private $ar_orderby = array();
|
||
|
private $mysql = false;
|
||
|
|
||
|
public function __construct(){
|
||
|
if( defined( 'ISSAE' ) && ISSAE ){
|
||
|
$master['host'] = SAE_MYSQL_HOST_M.':'.SAE_MYSQL_PORT;
|
||
|
$master['user'] = SAE_MYSQL_USER;
|
||
|
$master['passwd'] =SAE_MYSQL_PASS;
|
||
|
$master['dbname'] = SAE_MYSQL_DB;
|
||
|
$slave['host'] = SAE_MYSQL_HOST_S.':'.SAE_MYSQL_PORT;
|
||
|
}else{
|
||
|
include_once( ROOT.'config/db.config.php' );
|
||
|
}
|
||
|
$this->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;
|
||
|
}
|
||
|
}
|