<?php
// Database Abstraction class 2011
// March 30 13:22:14 IST 2011
// Fixed bug in join which wrongly guessing table columns for join, from the tables that are not yet seen.
// Made UTF8 the default encoding
// Added a encoding property to set the default encoding,eg: $crdb->encoding = 'utf8'
// Fixed bug with delete when used with joins
// Added provision for specifien scalar values in joins on clasues using by casting value into object
// Bug fix in _row functon when rownum execced available rows
// Added _row($rowNum) function to retrive $rowNum th row of result as a stdObj Object instead of rowset object
// Added Support for custom operators in select query when arrays are passed
// Added join column guessing,(to be tested)
// Fixed bug that causes bad sql when using or() and start_group()/_where() together
// Fixed bug that causes queries to run twice.
// Fixed _set_link function
// Added notice in case of non existant table during insert
// Added object support for group by to include mysql functions
// added custom result columns
// echo for debugging queries
// Requires php version >=5.2.3
// sandeepcr2@gmail.com
class crdb_table
{
private $table_name;
private $parent;
public $insert_id;
public $affected_rows;
function __construct()
{
@list($table_name,$parent)=func_get_args();
$this->table_name=$table_name;
$this->parent=$parent;
}
private function notice($msg)
{
if(function_exists('debug_backtrace'))
{
$stack=debug_backtrace(false);
foreach($stack as $v)
if(isset($v['file']) && substr($v['file'],-8)!='crdb.php' )
{
$error_line="<br/>\n".'<b>Called from:'.$v['file'].',Line:<span style="color:red">'.$v['line']."</span></b><br/>";
break;
}
}
trigger_error($msg.$error_line,E_USER_WARNING);
}
function __call($column_name,$args)
{
$operator='=';
$table_name=$this->table_name;
if(count($args)==2):
list($operator,$value)=$args;
if(is_int($operator) && $column_name=='limit') :
return $this->parent->$table_name()->limit($operator,$value);
else:
return $this->parent->$table_name()->$column_name($operator,$value);
endif;
elseif(count($args)==1):
return $this->parent->$table_name()->$column_name($args[0]);
elseif(count($args)==0):
return $this->parent->{$this->table_name}()->$column_name();
endif;
}
}
class crdb_rowset extends crdb implements Iterator,Countable
{
private $parent;
private $table;
private $where;
protected $suffix;
protected $result_columns;
private $result;
private $offset;
private $current;
private $end;
protected $join_obj;
protected $join_query;
private $group_start_count;
function __construct()
{
if(func_num_args()==3)
{
$args=func_get_args();
list($this->table,$this->where,$this->parent)=$args;
}
elseif(func_num_args()==2)
{
$args=func_get_args();
list($this->join_query,$this->join_obj)=$args;
$this->parent=$this->join_obj->crdb;
}
$this->suffix= array_fill_keys(array('order_by','desc_order_by','group_by','limit'), array());
$this->result=null;
$this->result_columns='*';
$this->escape=$this->parent->escape;
$this->group_start_count=0;
}
private function notice($msg)
{
if(function_exists('debug_backtrace'))
{
$stack=debug_backtrace(false);
foreach($stack as $v)
if(isset($v['file']) && substr($v['file'],-8)!='crdb.php' )
{
$error_line="<br/>\n".'<b>Called from:'.$v['file'].',Line:<span style="color:red">'.$v['line']."</span></b></br>";
break;
}
}
trigger_error($msg.$error_line,E_USER_WARNING);
}
private function query($query)
{
if($this->parent->debug) echo $query;
$return= mysql_query($query,$this->parent->link);
if($return===false && $this->parent->debug > 1 ) $this->notice(mysql_error($this->parent->link).PHP_EOL.'</br>');
return $return;
}
private function get_suffix()
{
$suffix=$group_by_suffix='';
$order_by=array();
if(!empty($this->suffix['order_by']))
{
foreach($this->suffix['order_by'] as $v) if(is_object($v)) $order_by[]=$v->scalar;else $order_by[]="`$v`";
}
if(!empty($this->suffix['group_by']))
{
foreach($this->suffix['group_by'] as $v) if(is_object($v)) $group_by[]=$v->scalar;else $group_by[]="`$v`";
}
if(!empty($this->suffix['desc_order_by']))
{
foreach($this->suffix['desc_order_by'] as $v) if(is_object($v)) $order_by[]=" {$v->scalar} DESC ";else $order_by[]=" `$v` DESC ";
}
if(count($this->suffix['group_by'])>0)
{
$suffix.=" GROUP BY ".join(",",$group_by);
}
if(count($order_by)>0)
{
$suffix.=" ORDER BY ".join(',',$order_by);
}
if(count($this->suffix['limit'])>0)
{
$suffix.= $this->suffix['limit'];
}
return $suffix;
}
private function exe()
{
if(func_num_args() >0)
{
$args=func_get_args();
return $this->__call('exe',$args);
}
if(is_null($this->result) )
{
$suffix=$this->get_suffix();
if(strlen($this->where)>0)
{
if($this->group_start_count>0)
{
$this->where.=str_repeat(' ) ', $this->group_start_count);
$this->group_start_count=0;
}
if(!empty($this->join_query))
{
if($this->result_columns=='*'):
$query="SELECT {$this->join_query[0]} FROM {$this->join_query[1]} WHERE {$this->where} {$suffix}";
else:
$query="SELECT {$this->result_columns} FROM {$this->join_query[1]} WHERE {$this->where} {$suffix}";
endif;
}
else
{
$query="SELECT {$this->result_columns} FROM `{$this->table}` WHERE {$this->where} {$suffix}";
}
}
else
{
if(!empty($this->join_query))
{
if($this->result_columns=='*'):
$query="SELECT {$this->join_query[0]} FROM {$this->join_query[1]} {$suffix}";
else:
$query="SELECT {$this->result_columns} FROM {$this->join_query[1]} {$suffix}";
endif;
}
else
{
$query="SELECT {$this->result_columns} FROM `{$this->table}` {$suffix}";
}
}
if($result=$this->query($query))
{
$this->result=$result;
$this->current=null;
$this->end=false;
}
}
}
public function count()
{
if(func_num_args() >0)
{
$args=func_get_args();
return $this->__call('count',$args);
}
$this->exe();
if(is_resource($this->result)) return mysql_num_rows($this->result);else return false;
}
public function current()
{
if(func_num_args() >0)
{
$args=func_get_args();
return $this->__call('current',$args);
}
$this->exe();
$row=$this->current;
$this->current=mysql_fetch_object($this->result);
if($this->current==false) $this->end=true;
return $row;
}
public function key()
{
if(func_num_args() >0)
{
$args=func_get_args();
return $this->__call('key',$args);
}
$this->exe();
return $this->offset++;
}
public function next()
{
if(func_num_args() >0)
{
$args=func_get_args();
return $this->__call('next',$args);
}
$this->exe();
}
public function rewind()
{
if(func_num_args() >0)
{
$args=func_get_args();
return $this->__call('rewind',$args);
}
$this->exe();
if(is_resource($this->result))
{
if(is_resource($this->result) && mysql_num_rows($this->result)>0)
{
mysql_data_seek($this->result,0);
$this->offset=0;
$this->end=false;
$this->current=mysql_fetch_object($this->result);
}
}
}
public function valid()
{
if(func_num_args() >0)
{
$args=func_get_args();
return $this->__call('valid',$args);
}
if(is_resource($this->result) && mysql_num_rows($this->result)>0 && !$this->end) return true;else return false;
}
function __call($column_name,$args)
{
$operator='=';
$this->result=null;
if(count($args)>1):
list($operator,$value)=$args;
if((is_int($operator) || is_null($operator)) && $column_name=='limit'):
{
if(is_null($operator)) $this->notice("Blank value given for offset,limit pair");
$clone=clone $this;
$clone->suffix['limit']=" LIMIT $operator,$value ";
return $clone;
}
endif;
elseif(count($args)==0):
switch($column_name)
{
case 'or':
$clone=clone $this;
$clone->where.=' OR ';
return $clone;
case 'start_group':
$clone=clone $this;
if((substr($clone->where,-3) !='OR ') && (substr($clone->where,-4)) !='AND ' && (strlen($clone->where) > 0 )) $clone->where.=' AND ';
$clone->where.=' ( ';
$clone->group_start_count++;
return $clone;
case 'end_group':
$clone=clone $this;
$clone->where.=' ) ';
$clone->group_start_count--;
return $clone;
case 'delete':
if(strlen($this->where)>0) return $this->__unset('all');
else $this->notice('No WHERE Clause for delete.Use `empty()` method to delete all rows.');
return false;
case 'empty':
return $this->__unset('all');
case 'order_by':
return new crdb_ext($this,'order_by');
case 'desc_order_by':
return new crdb_ext($this,'desc_order_by');
case 'group_by':
return new crdb_ext($this,'group_by');
case 'group_by':
return new crdb_ext($this,'group_by');
case 'max':
return new crdb_ext($this,'max');
case 'min':
return new crdb_ext($this,'min');
case 'sum':
return new crdb_ext($this,'sum');
case 'avg':
return new crdb_ext($this,'avg');
case 'average':
return new crdb_ext($this,'avg');
case 'distinct':
return new crdb_ext($this,'distinct');
case 'result':
$this->exe();
if(is_resource($this->result))
{
$return=array();
while($row=mysql_fetch_object($this->result))
{
$return[]=$row;
}
return $return;
}
}
else:
$value=$args[0];
endif;
if(!empty($this->join_query))
{
if(isset($this->join_obj->join_aliases[$column_name]))
{
$column_name=$this->join_obj->join_aliases[$column_name];
}
else
{
$this->notice("No column `$column_name` in specified tables.");
}
}
else
{
if(isset($this->parent->table_columns[$this->table][$column_name]))
{
$column_name="`$column_name`";
}
else
{
$this->notice("No column `$column_name` in table `{$this->table}`");
}
}
$clone=clone $this;
if(substr($clone->where,-3)=='OR ' or substr($clone->where,-2)=='( 'or strlen($clone->where)==0) $combine='';else $combine= ' AND ';
if(is_string($value)):
$value=$this->escape($value);
$clone->where=$clone->where." $combine $column_name $operator \"$value\" ";
elseif(is_null($value)):
if(trim($operator)=='!'):
$clone->where=$clone->where." $combine $column_name IS NOT NULL";
else:
$clone->where=$clone->where." $combine $column_name IS NULL";
endif;
elseif(is_object($value)):
$clone->where=$clone->where." $combine $column_name $operator {$value->scalar}";
elseif(is_array($value)):
foreach($value as &$v) $v=$this->escape($v);
$value_list='"'.join('","',$value).'"';
if($operator != '=')
{
$clone->where=$clone->where." $combine $column_name $operator ( $value_list )";
}else
{
$clone->where=$clone->where." $combine $column_name IN( $value_list )";
}
else:
$clone->where=$clone->where." $combine $column_name $operator $value ";
endif;
return $clone;
}
function _columns($str)
{
$clone=clone $this;
$clone->result_columns=" $str ";
return $clone;
}
function _where($str)
{
$clone=clone $this;
$str=trim($str);
if( (strtoupper(substr($str,0,4))=='AND ') || (strtoupper(substr($str,0,3))=='OR ') )
{
$clone->where.=$str;
return $clone;
}
if(strlen($clone->where)>0 && (strtoupper(substr($clone->where,-4))!==' OR ') && (strtoupper(substr($clone->where,-3))!==' ( ') ) $clone->where.=" AND $str ";else $clone->where.=$str;
return $clone;
}
function _row($rowNum)
{
$this->exe();
if(is_resource($this->result))
{
$return=array();
$totalRows = mysql_num_rows($this->result);
if(($rowNum >= 0) && ($rowNum < $totalRows))
{
mysql_data_seek($this->result,$rowNum);
}elseif(($rowNum < 0) && -$rowNum < $totalRows)
{
mysql_data_seek($this->result,$totalRows+$rowNum);
}
else return false;
$row=mysql_fetch_object($this->result);
return $row;
}
}
function __unset($arg)
{
if($arg=='all')
{
if(!empty($this->join_query))
{
$tables=join('`,`',array_keys($this->join_obj->tables));
if(strlen($this->where)>0)
$query="DELETE `$tables` FROM {$this->join_query[1]} where {$this->where}";
else
$query="DELETE `$tables` FROM {$this->join_query[1]}";
}
else
{
if(strlen($this->where)>0)
$query="DELETE FROM `{$this->table}` where {$this->where}";
else
$query="DELETE FROM `{$this->table}`";
}
$return=$this->query($query);
$affected_rows=mysql_affected_rows($this->parent->link);
if(empty($this->join_query)) $this->parent->crdb_table_objects[$this->table]->affected_rows=$affected_rows;
else
{
foreach($this->join_obj->tables as $k=>$v)
{
$this->parent->crdb_table_objects[$v]->affected_rows=$affected_rows;
}
}
$this->result=null;
return $return;
}
}
function __get($column_name)
{
//$this->result=null;
$this->rewind();
if(is_resource($this->result)) $count=mysql_num_rows($this->result);else return false;
if($count>0)
{
if(property_exists($this->current, $column_name)) return $this->current->$column_name;
else
{
$this->notice("No Column `$column_name` in result.Columns should be accessed in format 'tablealias_columnsname' when a join performed.");
}
}
else return false;
}
function __set($column_name,$value)
{
$this->result=null;
if(is_object($value)) $value=$value->scalar;else
{
$value=$this->escape($value);
$value="\"$value\"";
}
if(!empty($this->join_query))
{
$column_name=$this->join_obj->join_aliases[$column_name];
if(strlen($this->where)>0)
$query="update {$this->join_query[1]} set $column_name =$value where {$this->where}";
else
$query="update {$this->join_query[1]} set $column_name =$value";
}
else
{
if(!isset($this->parent->table_columns[$this->table][$column_name]))
{
$this->notice("No Column `$column_name` in table {$this->table}");
return;
}
if(strlen($this->where)>0)
$query="update `{$this->table}` set `$column_name` =$value where {$this->where}";
else
$query="update `{$this->table}` set `$column_name` =$value";
}
$result=$this->query($query);
$affected_rows=mysql_affected_rows($this->parent->link);
if(empty($this->join_query))
$this->parent->crdb_table_objects[$this->table]->affected_rows=$affected_rows;
else
{
foreach($this->join_obj->tables as $k=>$v)
{
$this->parent->crdb_table_objects[$k]->affected_rows=$affected_rows;
}
}
}
}
class crdb_join extends crdb_rowset
{
public $join_aliases;
private $foreign_keys;
protected $tables;
protected $table_columns;
protected $crdb;
private $type;
private $join_on_clauses;
private $join_types;
private $last_join_type;
private $on_context;
private $last_table_alias;
function _end()
{
$tables=$this->tables;
$tables_seen = array();
foreach($tables as $k=>$v)
{
$tables_seen[$k] = $v;
if(!isset($current_table))
{
$current_table=$v;
$current_alias=$k;
$table_str="`$current_table` as `$current_alias` ";
}
else
{
$columns=null;
$join_operator='=';
if(isset($this->join_on_clauses[$k]))
{
$on_clause=$this->join_on_clauses[$k];
$current_table=$v;
$current_alias=$k;
}
else
{
if(isset($this->foreign_keys[$current_table][$v]))
{
$columns=$this->foreign_keys[$current_table][$v];
}
elseif(isset($this->foreign_keys[$v][$current_table]))
{
$columns=array_reverse($this->foreign_keys[$v][$current_table]);
}
if(!$columns)
{
foreach($this->crdb->table_columns[$v] as $column_array )
{
foreach($tables_seen as $table_in_join)
{
foreach($this->crdb->table_columns[$table_in_join] as $search_column_array)
{
if((strtolower(str_replace('_','',$search_column_array['Field'])) == strtolower(str_replace('_','',$v.$column_array['Field']))) || (strtolower(str_replace('_','',$table_in_join.$search_column_array['Field'])) == strtolower(str_replace('_','',$column_array['Field']))))
{
$columns = array($search_column_array['Field'],$column_array['Field']);
$current_alias = array_search( $table_in_join,$tables);
break 3;
}
}
}
}
}
if($columns)
{
list($src_column,$dst_column)=$columns;
$on_clause=" `$current_alias`.`$src_column` $join_operator `$k`.`$dst_column` ";
$current_table=$v;
$current_alias=$k;
}
else
{
$this->notice("No Key to connect tables `$current_table` and `$v` ." );
}
}
if(isset($this->join_types[$k])) $join_type=$this->join_types[$k];else $join_type=$this->type;
$table_str.=" $join_type `$v` as `$k` ON ( $on_clause ) ";
}
foreach($this->table_columns[$v] as $column)
{
$query_columns[]="`$k`.`$column` as `{$k}_{$column}` ";
$this->join_aliases["{$k}_{$column}"]=" `$k`.`$column` ";
}
}
return new crdb_rowset(array(join(',',$query_columns), $table_str),$this);
}
private function notice($msg)
{
if(function_exists('debug_backtrace'))
{
$stack=debug_backtrace(false);
foreach($stack as $v)
if(isset($v['file']) && substr($v['file'],-8)!='crdb.php' )
{
$error_line="<br/>\n".'<b>Called from:'.$v['file'].',Line:<span style="color:red">'.$v['line']."</span></b><br/>";
break;
}
}
trigger_error($msg.$error_line,E_USER_WARNING);
}
public function __construct($type,$crdb,$foreign_keys)
{
$this->tables=array();
$this->foreign_keys=$foreign_keys;
$this->crdb=$crdb;
$this->type=$type;
$this->escape =$crdb->escape;
$this->on_context=false;
}
public function __get($name)
{
if($name=='_end' || $name=='end')
{
return $this->_end();
}
if($name=='_on' || $name=='on')
{
$this->on_context=true;
return $this;
}
if($name=='_join' || $name=='join')
{
$this->on_context=false;
$this->last_join_type=' JOIN ';
return $this;
}
if($name=='_left_join' || $name=='left_join')
{
$this->on_context=false;
$this->last_join_type=' LEFT JOIN ';
return $this;
}
}
private function get_column_from_alias($column_alias)
{
foreach($this->tables as $alias=>$table_name)
{
foreach($this->table_columns[$table_name] as $k=>$v)
{
if($alias.'_'.$v==$column_alias) return "`$alias`.`$v`";
}
}
}
public function __call($table_name,$args)
{
if($this->on_context)
{
if(!$column_one=$this->get_column_from_alias($table_name))
{
foreach($this->tables as $k=>$v)
{
if(substr($table_name,0,strlen($k))==$k) $this->notice("No column with name `".substr($table_name,strlen($k)+1)."` in table `$v`" );
}
$this->notice("Column alias `$table_name` is not defined.");
}
$operator=' = ';
if(count($args)==1) $alias=$args[0];
elseif(count($args)==2) list($operator,$alias)=$args;
if(isset($args[0]))
{
if(is_object($alias))
{
$column_two = $this->escape((string)$alias->scalar);
}else
if(!$column_two=$this->get_column_from_alias($alias))
{
foreach($this->tables as $k=>$v)
{
if(substr($alias,0,strlen($k))==$k) $this->notice("No column with name `".substr($alias,strlen($k)+1)."` in table `$v`" );
}
$this->notice("Column alias `$alias` is not defined.");
}
}
else
{
$this->notice("column name missing");
}
if(isset($this->join_on_clauses[$this->last_table_alias]))
{
$this->join_on_clauses[$this->last_table_alias].="AND $column_one $operator $column_two ";
}
else
{
$this->join_on_clauses[$this->last_table_alias]="$column_one $operator $column_two ";
}
return $this;
}
else
{
if(isset($args[0]))
{
if(!isset($this->crdb->crdb_table_objects[$table_name]))
{
$this->notice("No Table `$table_name`.");
return $this;
}
$this->last_table_alias=$args[0];
$this->tables[$args[0]]=$table_name;
$this->join_types[$args[0]]=$this->last_join_type;
if($result=mysql_query("SHOW COLUMNS FROM `$table_name`"))
{
if(!isset($this->table_columns[$table_name]))
{
while($row=mysql_fetch_array($result))
{
$this->table_columns[$table_name][]=$row[0];
}
}
}
return $this;
}
}
}
}
class crdb_ext extends crdb_rowset
{
private $rowset;
private $ext_name;
public function crdb_ext($rowset,$ext_name)
{
$this->rowset=clone $rowset;
$this->ext_name=$ext_name;
}
public function fields()
{
$args=func_get_args();
if($this->ext_name=='order_by')
{
$this->rowset->suffix['order_by']+=$args;
}
elseif($this->ext_name=='desc_order_by')
{
$this->rowset->suffix['desc_order_by']+=$args;
}
elseif($this->ext_name=='group_by')
{
$this->rowset->suffix['group_by']+=$args;
}
elseif($this->ext_name=='distinct')
{
$fields=join('`,`',$args);
$this->rowset->result_columns=" DISTINCT ( `$fields` ) ";
}
return $this->rowset;
}
public function __get($field)
{
if($this->ext_name=='order_by'):
$this->rowset->suffix['order_by'][]=$field;
elseif($this->ext_name=='desc_order_by'):
$this->rowset->suffix['desc_order_by'][]=$field;
elseif($this->ext_name=='group_by'):
$this->rowset->suffix['group_by'][]="$field";
elseif($this->ext_name=='max'):
if(!empty($this->rowset->join_query)):
$full_field_name=$this->rowset->join_obj->join_aliases[$field];
$this->rowset->result_columns=" MAX($full_field_name) as `$field`";
else:
$this->rowset->result_columns=" MAX(`$field`) as `$field`";
endif;
return $this->rowset->$field;
elseif($this->ext_name=='min'):
if(!empty($this->rowset->join_query)):
$full_field_name=$this->rowset->join_obj->join_aliases[$field];
$this->rowset->result_columns=" MIN($full_field_name) as `$field`";
else:
$this->rowset->result_columns=" MIN(`$field`) as `$field`";
endif;
return $this->rowset->$field;
elseif($this->ext_name=='sum'):
if(!empty($this->rowset->join_query)):
$full_field_name=$this->rowset->join_obj->join_aliases[$field];
$this->rowset->result_columns=" SUM($full_field_name) as `$field`";
else:
$this->rowset->result_columns=" SUM(`$field`) as `$field`";
endif;
return $this->rowset->$field;
elseif($this->ext_name=='avg'):
if(!empty($this->rowset->join_query)):
$full_field_name=$this->rowset->join_obj->join_aliases[$field];
$this->rowset->result_columns=" AVG($full_field_name) as `$field`";
else:
$this->rowset->result_columns=" AVG(`$field`) as `$field`";
endif;
return $this->rowset->$field;
elseif($this->ext_name=='distinct'):
if(!empty($this->rowset->join_query)):
$full_field_name=$this->rowset->join_obj->join_aliases[$field];
$this->rowset->result_columns=" DISTINCT($full_field_name) as `$field`";
else:
$this->rowset->result_columns=" DISTINCT(`$field`) as `$field`";
endif;
return $this->rowset;
endif;
return $this->rowset;
}
}
class crdb
{
protected $link;
private $table_primary_keys;
protected $table_columns;
private $foreign_keys;
protected $crdb_table_objects;
protected $debug;
protected $escape;
public function __construct($link,$foreign_keys=array())
{
$this->link=$link;
mysql_query("SET NAMES utf8",$this->link);
$this->escape=true;
$table_result=mysql_query("show tables",$this->link);
$this->foreign_keys=$foreign_keys;
if($table_result!== FALSE && mysql_num_rows($table_result) > 0)
while($row=mysql_fetch_array($table_result))
{
$this->crdb_table_objects[$row[0]]= new crdb_table($row[0],$this);
$table_data=mysql_query("describe `{$row[0]}`",$this->link);
while($column_data=mysql_fetch_array($table_data))
{
if($column_data['Key']=='PRI' && !isset($this->table_primary_keys[$row[0]])) $this->table_primary_keys[$row[0]]=$column_data['Field'];
$this->table_columns[$row[0]][$column_data['Field']]=$column_data;
}
}
}
private function notice($msg)
{
if(function_exists('debug_backtrace'))
{
$stack=debug_backtrace(false);
foreach($stack as $v)
if(isset($v['file']) && substr($v['file'],-8)!='crdb.php' )
{
$error_line="<br/>\n<b>Called from:".$v['file'].',Line:<span style=\"color:red\">'.$v['line']."</span></b><br/>";
break;
}
}
trigger_error($msg.$error_line,E_USER_WARNING);
}
protected function escape($str)
{
if(strpos($str,"\"")===false || (!$this->escape)) return $str;
$parts=explode('"',$str);
$total=count($parts)-1;
foreach($parts as $k=>&$v)
{
if( ( strspn(strrev($v),'\\') % 2 )==0 && $k<$total) $v.='\\';
}
$return=join('"',$parts);
if(substr($return,0,1)=="\"") $return ="\\".$return;
return $return;
}
private function query($query)
{
if($this->debug) echo $query;
$return=mysql_query($query,$this->link);
if($return===false && $this->debug > 1 ) $this->notice(mysql_error($this->link).PHP_EOL.'</br>');
return $return;
}
public function __set($table_name,$value)
{
$query='';
$tuples=array();
if(is_array($value))
{
if(!isset($this->table_columns[$table_name]))
{
$this->notice("No Table `$table_name`.");
return;
}
foreach($this->table_columns[$table_name] as $k=>$v)
{
if(isset($value[$k]))
{
if(is_object($value[$k])) $tuples[]="`$k`={$value[$k]->scalar}";
else
{
$value[$k]=$this->escape($value[$k]);
$tuples[$k]="`$k`=\"{$value[$k]}\"";
}
}
}
if(count($tuples)>0)
{
if(isset($this->table_primary_keys[$table_name]) && isset($value[$this->table_primary_keys[$table_name]]) && count($this->$table_name($value[$this->table_primary_keys[$table_name]])) > 0 )
{
$primary_key_tuple=$tuples[$this->table_primary_keys[$table_name]];
unset($tuples[$this->table_primary_keys[$table_name]]);
$query="UPDATE `$table_name` SET ".join(',',$tuples)." WHERE $primary_key_tuple";
}
else
{
$query="INSERT INTO `$table_name` SET ".join(',',$tuples);
}
}
if($this->query($query,$this->link))
{
$this->crdb_table_objects[$table_name]->insert_id=mysql_insert_id($this->link);
$this->crdb_table_objects[$table_name]->affected_rows=mysql_affected_rows($this->link);
}
}
elseif(is_object($value))
{
foreach($this->table_columns[$table_name] as $k=>$v)
{
if(isset($value->$k))
{
$value->$k=$this->escape($value->$k);
$tuples[]="`$k`=\"{$value->$k}\"";
}
}
if(count($tuples)>0)
{
$query="INSERT INTO `$table_name` SET ".join(',',$tuples);
}
if($this->query($query,$this->link))
{
$this->crdb_table_objects[$table_name]->insert_id=mysql_insert_id($this->link);
$this->crdb_table_objects[$table_name]->affected_rows=mysql_affected_rows($this->link);
}
}
else
{
if($table_name=='debug')
{
$this->debug=$value;
return;
}
if($table_name=='escape')
{
$this->escape=$value;
return;
}
if($table_name=='encoding')
{
mysql_query("SET NAMES $value",$this->link);
}
}
}
public function __isset($table_name)
{
if(isset($this->crdb_table_objects[$table_name]) ) return true;else return false;
}
public function __get($table_name)
{
if($table_name=='_join') return new crdb_join('JOIN',$this,$this->foreign_keys);
if($table_name=='_left_join') return new crdb_join('LEFT JOIN',$this,$this->foreign_keys);
if($table_name=='_right_join') return new crdb_join('RIGHT JOIN',$this,$this->foreign_keys);
if(isset($this->crdb_table_objects[$table_name])) return $this->crdb_table_objects[$table_name];
else
{
$this->notice("Table `$table_name` doesn't exist.");
}
}
public function __call($table_name,$arg)
{
$where='';
if(isset($this->crdb_table_objects[$table_name]))
{
if(count($arg)>0)
{
if(!is_null($arg[0]))
{
if(isset($this->table_primary_keys[$table_name]))
{
if(is_array($arg[0]))
{
foreach($arg[0] as &$v) $v=$this->escape($v);
$value_list='"'.join('","',$arg[0]).'"';
$where=" `{$this->table_primary_keys[$table_name]}` IN( $value_list )";
}
else
{
$where=" `{$this->table_primary_keys[$table_name]}` =\"{$arg[0]}\"";
}
}
else
{
$this->notice("No Primary Key Defined For Table `$table_name`");
}
}
else
{
$this->notice("Null value specified for primary key value");
$where=" false ";
}
}
return new crdb_rowset($table_name,$where,$this);
}
else
{
$this->notice("Table `$table_name` doesn't exist.");
}
}
public function _set_link($link)
{
$this->__construct($link);
}
public function _query($query,$mode=2,$link=NULL)
{
if($link) $result=mysql_query($query,$link) ;else $result=mysql_query($query);
if($result)
{
if(gettype($result)!='boolean' )
{
if($mode==0)
{
if($row=mysql_fetch_array($result)) return $row[0];else return NULL;
}
elseif($mode==1)
{
if($row=mysql_fetch_object($result)) return $row;else return array();
}
else
{
if(mysql_num_rows($result)==0) return array();
if($mode==2)
{
while($row=mysql_fetch_object($result))
{
$return[]=$row;
}
}
else
{
while($row=mysql_fetch_array($result))
{
$return[]=$row;
}
}
return $return;
}
}
else return true;
}
else
{
return false;
}
}
}
?>
|