1. 程式人生 > >PHP之Model類封裝

PHP之Model類封裝

<?php
	//引入配置檔案
	include "./config.php";
	class Model
	{
		protected $link;//儲存連線物件
		protected $tableName = "";//儲存表名
		protected $field = "*";//儲存要查詢欄位
		protected $allFields = [];//儲存當前表所有欄位
		protected $where = "";//儲存where條件
		protected $order = "";//儲存order排序條件
		protected $limit = "";//儲存limit條件

		/**
		 * 構造方法(初始化)
		 * @param string $tableName 要操作的表名
		 */
		public function __construct($tableName){
			//連線資料庫的初始化方法
			$this->getConnect();

			//儲存將要操作的資料庫表名
			$this->tableName = PRE.$tableName;

			//獲取當前表有哪些欄位
			$this->getFields();
		}

		/**
		 * 連線資料庫方法
		 */
		public function getConnect(){
			//1.連線資料庫
			$this->link = mysqli_connect(HOST,USER,PWD,DB,PORT);
			//2.判斷連線
			if (mysqli_connect_errno($this->link)>0) {
				echo mysqli_connect_error($this->link);
				exit;
			}
			//3.設定字符集
			mysqli_set_charset($this->link,CHARSET);
		}
		
		/**
		 * 執行傳送方法(查詢)
		 * @param   array $sql  查詢出來的陣列
		 * @return  array  返回二維陣列
		 */
		public function query($sql)
		{
			$result = mysqli_query($this->link,$sql);

			//處理結果集
			if ($result && mysqli_num_rows($result)>0) {
				$array = [];
				while ($row = mysqli_fetch_assoc($result)) {
						$array[] = $row;
				}
			}
			return $array;
		}

		/**
		 * 執行傳送方法(增刪改)
		 * @param   array $sql  查詢出來的陣列
		 * @return 新增成功返回上個id,刪改成功返回true,反之返回false
		 */
		public function exec($sql)
		{
			$result = mysqli_query($this->link,$sql);

			//處理結果集
			if ($result && mysqli_affected_rows($this->link)>0) {
				//判斷是否為新增,是則返回上次操作的id
				if (mysqli_insert_id($this->link)) {
					return mysqli_insert_id($this->link);
				}
				//不是新增,則返回true
				return true;
			}else{
				//沒有執行結果
				return false;
			}
		}

		/**
		 * 設定要查詢的欄位資訊
		 * @param  string $field 要查詢的欄位
		 * @return object 返回自己,保證連貫操作
		 */
		public function field($field){
//			//判斷輸入欄位是否存在
//			if(empty($field)){
//				return $this;
//			}

			$this->field = $field;
			return $this;
		}

		/**
		 * 獲取當前表有哪些欄位
		 * 
		 */
		protected function getFields(){
			//查詢當前表結構
			$sql = "desc {$this->tableName}";

			//執行併發送sql語句
			$result = $this->query($sql);

			$fields = [];
			foreach($result as $v){
				//var_dump($v);
				$fields[] = $v['Field'];
			}
			// var_dump($fields);

			$this->allFields = $fields;
		}


		/**
		 * 查詢多條資料
		 * @return array 返回查詢出來的二維陣列
		 */
		public function select(){
			$sql = "select {$this->field} from {$this->tableName} {$this->where} {$this->order} {$this->limit}";
            echo $sql;
			//執行併發送SQL
			$result = $this->query($sql);
			// var_dump($result);
			
			//判斷是否執行成功
			if ($result) {
				//返回一條資料
				return $result;
			}
			return [];
		}

		/**
		 * 查詢一條資料
		 * @param  int $id 要查詢的id
		 * @return array 返回查詢出來的一維陣列
		 */
		public function find($id=""){
			//判斷id是否為空
			if (!empty($id)) {
				$where = " where id={$id}";
			}else{
				$where = $this->where;
			}

			$sql = "select {$this->field} from {$this->tableName} {$where} limit 1";
			echo $sql;
//			exit;
			//執行併發送sql語句
			$result =  $this->query($sql);
			// var_dump($result); 

			//判斷是否執行成功
			if ($result) {
				//返回一條資料
				return $result[0];
			}
			return [];
			
		}

		/**
		 * 統計總條數
		 * @return int 返回查到的條數
		 */
		public function count(){
			$sql = "select count(*) as total from {$this->tableName} limit 1";
			//執行併發送SQL
			$result = $this->query($sql);
			
			//判斷是否執行成功
			if ($result) {
				//返回一條資料
				return $result[0]['total'];
			}
			return 0;
			
		}

		/**
		 * 新增資料
		 * @param array $data 要新增的陣列
		 */
		public function add($data){
			//判斷是否是陣列
			if (!is_array($data)) {
				return $this;
			}

			//判斷是否全是非法欄位
			if (empty($data)) {
				die("非法資料");
			}

			//過濾非法欄位
			foreach($data as $k => $v){
				if (!in_array($k,$this->allFields)) {
					unset($data[$k]);
				}
			}
			//取得陣列所有的鍵
			$keys = array_keys($data);

			//將陣列轉換為字串
			$key = implode(",",$keys);
//			$values = array_values($data);
			$value = implode("','",$data);
            $sql = "insert into {$this->tableName}({$key}) values('{$value}')";
			echo $sql;
//			exit;
			return $this->exec($sql);
		}

		/**
		 * 根據id刪除資料
		 * @param  int $id 要刪除的id
		 * @return int 返回受影響行數
		 */
		public function delete($id=""){
			//判斷id是否為空
			if (isset($id)) {
				$where = "where id={$id}";
			}else{
				$where = $this->where;
			}

			$sql = "delete from {$this->tableName} {$where}";
            echo $sql;
//            exit;
			return $this->exec($sql);
		}


		/**
		 * 修改資料
		 * @param  array $data 要改的資料
		 * @return int    返回受影響的行數
		 */
		public function update($data){
			//判斷是否是陣列
			if (!is_array($data)) {
				return $this;
			}

			//判斷是否全為非法欄位
			if (empty($data)) {
				die("非法資料");
			}

			$str = "";
			//過濾非法欄位
			foreach ($data as $k => $v) {
				if ($k == "id") {
					$this->where = "where id={$v}";
				}
				if (!in_array($k,$this->allFields)) {
					unset($data[$k]);
				}else{
					$str .= "{$k}='{$v}',";
				}
			}

			//判斷是否有條件
			if (empty($this->where)) {
				die("請修改輸入條件");
			}

			//去除右邊逗號
			$str = rtrim($str,",");

			$sql = "update {$this->tableName} set $str {$this->where}";
            echo $sql;
//            exit;
			return $this->exec($sql);
		}

		/**
		 * 設定where條件
		 * @param  string $str where條件
		 * @return object 返回自己,連貫操作
		 */
		public function where($str)
		{
			$this->where = 'where '.$str;
			return $this;
		}

		/**
		 * 處理order排序條件
		 * @param  string $order order條件
		 * @return object 返回自己,連貫操作
		 */
		public function order($order){
			$this->order = 'order by '.$str;
			return $this;
		}


		/**
		 * 處理limit條件
		 * @param  string $limit limit條件
		 * @return object 返回自己,連貫操作
		 */
		public function limit($limit){
			//跳過幾條取幾條
			$this->limit = "limit ".$limit;
			return $this;
		}
}
	//自行除錯
	$a = new Model("info");
	// var_dump($a->find(3));
	// var_dump($a->select());
    //var_dump($a->count());
    // $res = $a->select();
    //var_dump($res);
?>