<?php
/**
  * @method API统计
  * @author soul
  * @copyright 2018/10/31
  */
class PjltjBase
{
	public $TjDb = null;
	public function __construct($TjDb = null)
	{
		$this->TjDb = $TjDb==null ?  new LibDb (mvc::$cfg['DB']['APITJ']): $TjDb;
	}

	/**
	  * @method 查询表信息
	  * @param  $Table 表明 如：yp_product 或者 yp_product as a join yp_number as b on a.pid=b.pid
	  * @param  $FieldArr 需要查询的字段名称数组
	  * @param  $Where 查询条件
	  * @param  $OneRow true|false
	  * @author soul
	  * @copyright 2016/3/30
	  * @return array(3) { ["status"]=> bool(true) ["data"]=> $OneRow=false 二维数组 ; $OneRow=true 一维数组["code"]=> int(0) } 
	  */
	public function get($Table, $FieldArr, $Where = '', $OneRow = false)
	{
		if(!empty($FieldArr) && is_array($FieldArr))
		{
			$Sql = sprintf("select %s from %s where 1=1 %s", implode(',', $FieldArr), $Table, $Where);
			$ResFlag = $this->TjDb->Query($Sql);
			if($ResFlag)
			{
				$Arr = array();
				while($Row = $this->TjDb->Fetch())
				{
					if($OneRow)
					{
						$Arr = $Row;
						break;
					}
					else
					{
						$Arr[] = $Row;
					}
				}
				return LibFc::ReturnData(true, $Arr);
			}
			return LibFc::ReturnData(false, $Sql.'查询SQL语句执行失败。');
		}
		return LibFc::ReturnData(false, $Table.'查询提供的参数不正确。');
	}


	/**
	  * @method 添加记录
	  * @param  $Table 表明 如：yp_product 或者 yp_product as a join yp_number as b on a.pid=b.pid
	  * @param  $DataArr 基本信息字段=>值 数组
	  * @author soul
	  * @copyright 2016/3/30
	  * @return array(3) { ["status"]=> bool(true) ["data"]=> ID ["code"]=> int(0) } 
	  */
	public function add($Table, $DataArr)
	{
		if(empty($Table) || !is_array($DataArr) || empty($DataArr))
		{
			return LibFc::ReturnData(false, $Table.'添加记录提供的参数不正确。');
		}
		
		$FiledArr = array();
		$ValArr = array();
		foreach($DataArr as $K=>$V)
		{
			$FiledArr[] = LibFc::Escape($K);
			$ValArr[] = sprintf("'%s'", LibFc::Escape($V, true));
		}
		$AddSql = sprintf("insert into %s (%s) VALUES(%s)", LibFc::Escape($Table), implode(',', $FiledArr), implode(',', $ValArr));
		$this->TjDb->Begin();
		$ResFlag = $this->TjDb->Query($AddSql);
		$Rows = $this->TjDb->RowCount();
		if($ResFlag && $Rows > 0)
		{
			$Id = $this->TjDb->InsertID();
			$this->TjDb->End();
			return LibFc::ReturnData(true, $Id);
		}
		return LibFc::ReturnData(false, $Table.'添加记录SQL语句执行失败。');
	}


	/**
	  * @method 添加多条记录
	  * @param  $Table 表明
	  * @param  $FiledArr 基本信息字段['name', ...]
	  * @param  $DataArr [['name'=>'11'...], ['name'=>'22'...]....]
	  * @author soul
	  * @copyright 2016/3/30
	  * @return array(3) { ["status"]=> bool(true) ["data"]=>  ["code"]=> int(0) } 
	  */
	public function addAny($Table, $FiledArr, $DataArr)
	{
		if(empty($Table) || !is_array($FiledArr) || empty($FiledArr) || !is_array($DataArr) || empty($DataArr))
		{
			return LibFc::ReturnData(false, $Table.'添加记录提供的参数不正确。');
		}

		$ValArr = [];
		foreach($DataArr as $V)
		{
			$tempArr =[];
			foreach($FiledArr as $Filed)
			{
				$tempArr[] = sprintf("'%s'", LibFc::Escape($V[$Filed], true));
			}
			$ValArr[] = sprintf("(%s)", implode(',', $tempArr));
		}
		
		$AddSql = sprintf("INSERT INTO %s (%s) VALUES %s", LibFc::Escape($Table), implode(',', $FiledArr), implode(',', $ValArr));
		$this->TjDb->Begin();
		$ResFlag = $this->TjDb->Query($AddSql);
		if($ResFlag)
		{
			$this->TjDb->End();
			return LibFc::ReturnData(true);
		}
		return LibFc::ReturnData(false, $AddSql.'添加记录SQL语句执行失败。');
	}

	/**
	  * @method 根据条件修改记录
	  * @param  $Table 表明 如：yp_product 或者 yp_product as a join yp_number as b on a.pid=b.pid
	  * @param  $DataArr 基本信息字段=>值 数组
	  * @param  $Where 修改条件
	  * @author soul
	  * @copyright 2016/3/30
	  * @return array(3) { ["status"]=> bool(true) ["data"]=> 影响行数  ["code"]=> int(0) } 
	  */
	public function set($Table, $DataArr, $Where)
	{
		if(empty($Table) || !is_array($DataArr) || empty($DataArr))
		{
			return LibFc::ReturnData(false, $Table.'修改记录提供的参数不正确。');
		}
		$ValArr = array();
		foreach($DataArr as $K=>$V)
		{
			if(stripos($V, '#@') === 0)
			{
				$ValArr[] = sprintf("%s=%s", LibFc::Escape($K), LibFc::Escape(trim(substr($V, 2))));
			}
			else
			{
				$ValArr[] = sprintf("%s='%s'", LibFc::Escape($K), LibFc::Escape($V, true));
			}
			// $ValArr[] = sprintf("%s='%s'", LibFc::Escape($K), LibFc::Escape(trim($V)));
		}
		$SetSql = sprintf("update %s set %s where 1 %s ", LibFc::Escape($Table), implode(',', $ValArr), $Where);
		$this->TjDb->Begin();
		$ResFlag = $this->TjDb->Query($SetSql);
		if($ResFlag)
		{
			$Rows = $this->TjDb->RowCount();
			$this->TjDb->End();
			return LibFc::ReturnData(true, $Rows);
		}
		return LibFc::ReturnData(false, $SetSql.'修改记录SQL语句执行失败。');
	}

	/**
	  * @method 根据唯一键添加或者替换记录
	  * @param  $table 表明 如：yp_product 或者 yp_product as a join yp_number as b on a.pid=b.pid
	  * @param  $dataArr 基本信息字段=>值 数组
	  * @author soul
	  * @copyright 2016/3/30
	  * @return 
			成功 ["status"=>true, "data"=> 影响行数] 
			失败 ["status"=>false, "data"=> 错误信息] 
	  */
	public function replace($table, $dataArr)
	{
		if(empty($table) || !is_array($dataArr) || empty($dataArr))
		{
			return LibFc::ReturnData(false, $table.'提供添加记录的参数不正确。');
		}

		$filedArr = array();
		$valArr = array();
		foreach($dataArr as $k=>$v)
		{
			$filedArr[] = LibFc::Escape($k);
			$valArr[] = sprintf("'%s'", LibFc::Escape($v, true));
		}
		$AddSql = sprintf("replace into %s (%s) values(%s)", LibFc::Escape($table), implode(',', $filedArr), implode(',', $valArr));
		$this->TjDb->Begin();
		$ResFlag = $this->TjDb->Query($AddSql);
		if($ResFlag)
		{
			$Rows = $this->TjDb->RowCount();
			$this->TjDb->End();
			return LibFc::ReturnData(true, $Rows);
		}
		return LibFc::ReturnData(false, $AddSql.'添加记录SQL语句执行失败。');
	}

	/**
	  * @method 根据条件删除记录
	  * @param  $Table 表明 如：yp_product 或者 yp_product as a join yp_number as b on a.pid=b.pid
	  * @param  $Where 修改条件
	  * @author soul
	  * @copyright 2016/3/30
	  * @return array(3) { ["status"]=> bool(true) ["data"]=> 影响行数  ["code"]=> int(0) } 
	  */
	public function del($Table, $Where)
	{
		if(empty($Table) || empty($Where))
		{
			return LibFc::ReturnData(false, $Table.'删除记录提供的参数不正确。');
		}
		$DelSql = sprintf("delete from %s where 1=1 %s",  LibFc::Escape($Table), $Where );
		$this->TjDb->Begin();
		$ResFlag = $this->TjDb->Query($DelSql);
		if($ResFlag)
		{
			$Rows = $this->TjDb->RowCount();
			$this->TjDb->End();
			return LibFc::ReturnData(true, $Rows);
		}
		return LibFc::ReturnData(false,  $DelSql.'删除记录SQL语句执行失败。');
	}


	/**
	  * @method 批量执行语句
	  * @param  $sqlArr 
	  * @author soul
	  * @copyright 2016/3/30
	  * @return array(3) { ["status"]=> bool(true) ["data"]=> true ["code"]=> int(0) } 
	  */
	public function exeAnySql($sqlArr, $transaction = true)
	{
		
		if(empty($sqlArr)) return LibFc::ReturnData(false, '请提供需要执行的语句');
		if($transaction) $this->TjDb->Begin();
		foreach($sqlArr as $sql){
			$resFlag = $this->TjDb->Query($sql);
			if(!$resFlag) return LibFc::ReturnData(false, $sql.'执行失败');
		}
		if($transaction) $this->TjDb->End();
		return LibFc::ReturnData(true, true);
	}
}