/home2/kerimkazan/dvf/magaza/lib/db.php
<?php
class DB
{
	static $connect;
	protected $db_database = DB_DATABASE;
	protected $db_host = DB_HOST;
	protected $db_username = DB_USERNAME;
	protected $db_password = DB_PASSWORD;
	protected $db_name = DB_NAME;
	protected $db_prefix = DB_PREFIX;
	
	
	//parameters
	
	protected $error = null;
	protected $last_id = null;
	protected $query = null;
	protected $from = null;
	protected $select = '*';
	protected $where = null;
	protected $group = null;
	protected $order = null;
	protected $limit = null;
	protected $pagination_type = false;
	protected $per_page = 0;
	protected $get_arr = null;
	function __construct() 
	{      
		try {
			 self::$connect = new PDO("{$this->db_database}:host={$this->db_host};dbname={$this->db_name};charset=utf8mb4", "{$this->db_username}", "{$this->db_password}");
			 self::$connect->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
			 self::$connect->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES utf8mb4");
		} catch ( PDOException $e ){
			 echo  '<b>Veritabanı bağlantısı sağlanamadı! - Hata Kodu: </b>'.$e->getMessage();
			 exit;
		}
    }
	public function now($type='datetime')
	{
		switch($type)
		{
			case 'timestamp';
			return time();
			case 'date';
			return date('m-d');
			case 'datetime';
			return date('Y-m-d H:i:s');
			default:
			return date('Y-m-d H:i:s');
			
		}
		
	}
	public function m_empty($data)
	{
		if($data=='' and $data!='0')
		{
			return true;
		}
		else
		{
			return false;
		}
		
	}
	public function query($query,$arr=false)
	{
		$this->reset();
		if($query!="")
		{
			
			try 
			{
				
				
				$run =  self::$connect->prepare($query);
				if($arr)
				{
					if(is_array($arr))
					{
						$run->execute($arr);
						return $run;
					}
					else
					{
						$run->execute(array($arr));
						return $run;
					}
				}
				else
				{
					$run->execute();
					return $run;
				}
			} catch (PDOException $e) {
				$this->error = $e->getMessage();
				return false;
			}
		}
		
		return false;
	}
	public function table($table)
    {
         $this->from = $this->db_prefix . $table;
        return $this;
    }
	public function select($fields)
	{
		$this->select = $fields;
		return $this;
	}
	public function where($field,$op='=',$values,$and='AND', $end_bracket='')
	{
		if(!$this->m_empty($field))
		{
			if(is_null($this->where))
			{
				$this->where="{$field} {$op} ? {$end_bracket}";
				$this->get_arr[] = $values;
			}
			else
			{
				
				$this->where.=" {$and} {$field} {$op} ? {$end_bracket}";
				$this->get_arr[] = $values;
			}
		}
		return $this;
	}
	public function where_set($field,$op='=',$values,$and="AND", $end_bracket='')
	{
		if(!$this->m_empty($field) and !$this->m_empty($values))
		{
			if(is_null($this->where))
			{
				$this->where="{$field} {$op} {$values} {$end_bracket}";
			}
			else
			{
				
				$this->where.=" {$and} {$field} {$op} {$values} {$end_bracket}";
			}
		}
		return $this;
	}
	public function where_set_locate($field,$values,$and="AND", $end_bracket='')
	{
		if(!$this->m_empty($field) and !$this->m_empty($values))
		{
			if(is_null($this->where))
			{
				$this->where="LOCATE('{$values}',{$field}) {$end_bracket}";
			}
			else
			{
				
				$this->where.=" {$and} LOCATE('{$values}',{$field}) {$end_bracket}";
			}
		}
		return $this;
	}
	public function where_set_collate($charset,$field,$op='=',$values,$and="AND", $end_bracket='')
	{
		if(!$this->m_empty($field) and !$this->m_empty($values))
		{
			if(is_null($this->where))
			{
			$this->where="{$field} {$op} {$values} {$end_bracket} COLLATE {$charset}";
			}
			else
			{
				
			$this->where.=" {$and} {$field} {$op} {$values} {$end_bracket} COLLATE {$charset}";
			}
		}
		return $this;
	}
	public function group($fields)
	{
		if(is_null($this->group))
		{
			$this->group = $fields;
		}
		else
		{
			$this->group .=",{$fields}";
		
		}
		return $this;
	}
	public function order($field,$type="desc")
	{
		if(!is_null($field))
		{
			if(is_null($this->order))
			{
				if(strtolower($field)=='rand()')
				{
					$this->order = $field;
				}
				else
				{
					$this->order = $field.' '.strtoupper($type);
				}
			}
			else
			{
				if(strtolower($field)=='rand()')
				{
					$this->order .=",{$fields}";
				}
				else
				{
					$this->order .= ','.$field.' '.strtoupper($type);
				}
			}
		
		}
		return $this;
	}
	public function limit($start,$end=null)
	{
		if(is_null($end))
		{
			if(is_numeric($start))
			{
				$this->limit = $start;
			}
		}
		else
		{
			if(is_numeric($start) and is_numeric($end))
			{
				$this->limit = "{$start},{$end}";
			}
		
		}
		return $this;
	}
	public function pagination($per_page)
	{
		if(is_numeric($per_page))
		{
			$this->per_page = $per_page;
			$this->pagination_type = true;
		}
		return $this;
	}
	public function get()
	{
		$query = "SELECT {$this->select} FROM {$this->from}";
		if(!is_null($this->where))
		{
			$query.=" where {$this->where}";
		}
		if(!is_null($this->group))
		{
			$query.=" group by {$this->group}";
		}
		if(!is_null($this->order))
		{
			$query.=" order by {$this->order}";
		}
		if($this->pagination_type)
		{
			$c_per_page = $this->per_page;
			$c_arr = $this->get_arr;
			$extra_query = "SELECT COUNT(*) as total_count FROM ( $query ) as counted_table";
			$all = $this->query($extra_query,$this->get_arr);
			if($all)
			{
					$total_count = $all->fetchAll(PDO::FETCH_ASSOC)[0]['total_count'];
					$page_count = ceil($total_count/$c_per_page);
					$current_page = (integer)m_u_g(DB_PAGINATION_GET) ? (integer)m_u_g(DB_PAGINATION_GET) : 1;
					$current_limit=($current_page - 1) * $c_per_page;
					$query = $query." limit {$current_limit},{$c_per_page}";
					$current_rows = $this->query($query,$c_arr);
					$data = $current_rows->fetchAll(PDO::FETCH_ASSOC);
					$return = array();
					$return['total_count'] = $total_count;
					$return['current_count'] = count($data);
					$return['total_page'] = $page_count;
					$return['current_page'] = $current_page;
					$return['data'] = $data;
					return $return;
			}
			else
			{
				return false;
			}
		}
		else
		{
			if(!is_null($this->limit))
			{
				$query.=" limit {$this->limit}";
			}
			
			$gets = $this->query($query,$this->get_arr);
			if($gets)
			{
					$data = $gets->fetchAll(PDO::FETCH_ASSOC);
					$return = array();
					$return['total_count'] = count($data);
					$return['data'] = $data;
					return $return;
			}
			else
			{
				return false;
			}
		}
	}
	public function get_var($field)
	{
		if($this->m_empty($field))
		{
			return false;
		}
		else
		{
			$query = "SELECT {$field} FROM {$this->from}";
			if(!is_null($this->where))
			{
				$query.=" where {$this->where}";
			}
			if(!is_null($this->order))
			{
				$query.=" order by id desc limit 1";
			}
			$gets = $this->query($query,$this->get_arr);
			if($gets)
			{
					return  $gets->fetchAll(PDO::FETCH_ASSOC)[0][$field];
			}
			else
			{
				return false;
			}
		}
		
	}
	public function get_vars()
	{
		
			$query = "SELECT * FROM {$this->from}";
			if(!is_null($this->where))
			{
				$query.=" where {$this->where}";
			}
			if(!is_null($this->order))
			{
				$query.=" order by id desc limit 1";
			}
			$gets = $this->query($query,$this->get_arr);
			if($gets)
			{
					return  $gets->fetchAll(PDO::FETCH_ASSOC)[0];
			}
			else
			{
				return false;
			}
		
	}
	public function count()
	{
		$grouped = false;
		$query = "SELECT count(*) as total_count FROM {$this->from}";
		if(!is_null($this->where))
		{
			$query.=" where {$this->where}";
		}
		if(!is_null($this->group))
		{
			$grouped = true;
			$query.=" group by {$this->group}";
		}
		if(!is_null($this->order))
		{
			$query.=" order by {$this->order}";
		}
		$gets = $this->query($query,$this->get_arr);
		if($gets)
		{
				if($grouped)
				{
					return count($gets->fetchAll(PDO::FETCH_ASSOC));
				}
				else
				{
					return $gets->fetch(PDO::FETCH_ASSOC)['total_count'];
				}
		}
		else
		{
			return false;
		}
	}
	public function insert(array $data)
	{
		if(is_array($data))
		{
			$query = 'INSERT INTO '.$this->from;
			$keys = array_keys($data);
			$query.=' ('.implode(',',$keys).') values (';
			$query_add='';
			$values = array_values($data);
			foreach($values as $val)
			{
				$query_add.='?,';
			}
			$query_add = trim($query_add,',');
			$query.=$query_add.')';
			if($this->query($query,$values))
			{
				
				$this->last_id = self::$connect->lastInsertId();
				return $this->last_id;
			}
			else
			{
				
				return false;
			}
		}
		return false;

	}
	public function update(array $data)
	{
		if(is_array($data))
		{
			$query = "UPDATE {$this->from} set";
			$keys = array_keys($data);
			$values = array_values($data);
			$query_add = '';
			foreach($keys as $key)
			{
				$query_add.=" {$key} = ?,";
			}
			$query_add = trim($query_add,',');
			$query.=$query_add;
			
			if(!is_null($this->where))
			{
				$query.=" where {$this->where}";
			}
			$new = array_merge($values,$this->get_arr);
			if($this->query($query,$new))
			{
				
				return true;
			}
			else
			{
				
				return false;
			}
		}
		return false;

	}
	public function delete()
	{
		$query = "DELETE FROM {$this->from}";
		if(!is_null($this->where))
		{
			$query.=" where {$this->where}";
		}
		if($this->query($query,$this->get_arr))
		{
			
			return true;
		}
		else
		{
			
			return false;
		}

	}
	public function error()
	{
		return $this->error;
		
	}
	public function last_id()
	{
		return $this->last_id;
	}
	protected function reset()
	{
		$this->error = null;
		$this->last_id = null;
		$this->query = null;
		$this->from = null;
		$this->select = '*';
		$this->where = null;
		$this->group = null;
		$this->order = null;
		$this->limit = null;
		$this->pagination_type = false;
		$this->per_page = 0;
		$this->get_arr = null;
	}
}
?>