⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dataset.inc.php

📁 功能齐全
💻 PHP
字号:
<?php
class DataSet
{
	var $dbObj;                                //数据库操作对象
	var $table;                                //数据表名
	var $fieldFunc      = array();             //在执行select操作后,应用到相应字段的回调函数,从此,模板的变量调节器就可丢到垃圾堆里去了
	var $uploadParams   = array();             //在执行sql语句时,要上传或删除的图片的相关属性

	/* 构造函数
	* $dbObj 是数据库操作对象
	* $table 是数据表名
	*/
	function DataSet(&$dbObj,$table='')
	{
		$this->dbObj = $dbObj;
		if (empty($table)) $this->setTable($table) ;
	}

	//设置数据表
	function setTable($table)
	{
		$this->table = $table;
	}

	/* 设置字段的回调函数
	* $fieldName  此函数应用的字段名
	* $funcName   函数名或对象的方法名
	* $funcParams 函数的参数(数组)
	* $paramsAdd  字段数据本身作为函数的参数时,应放到其它参数($funcParams)的左边还是右边
	* $objName    如果$funcName是一个对象的方法,则$objName为该对象
	* $table      数据表
	* 例:sql为:select title from user,现在要将结果中title字段的值中的\r改成<br> ,按如下方式写:
	* setFieldFunc('title','str_replace',array('\r','<br>'),'right','','user')
	* 如果用对象的方法作回调函数,如有个对象$obj,$obj有个方法myreplace() ,则按如下方式写:
	* setFieldFunc('title','myreplace',array('\r','<br>'),'right','obj','user')
	*/
	function setFieldFunc($fieldName,$funcName,$funcParams='',$paramsAdd='left',$objName='',$table='')
	{
		if (empty($table)) $table = $this->table ;

		if (empty($fieldName)) return $this->err->catchErr($this->getSysMsg('3001','$fieldName'),__FILE__,__LINE__);
		if (empty($funcName)) return $this->err->catchErr($this->getSysMsg('3001','$funcName'),__FILE__,__LINE__);

		$tmp['fieldName'] = $fieldName;
		$tmp['funcName']  = (!empty($objName)) ? array($objName,$funcName) : $funcName;
		if (empty($funcParams))$funcParams = array();
		if (!is_array($funcParams)) $funcParams = (array)$funcParams;
		$tmp['funcParams'] = $funcParams;
		$tmp['paramsAdd']  = $paramsAdd;

		$n = count($this->fieldFunc[$table]);
		$this->fieldFunc[$table][$n] = & $tmp;
	}

	/* 设置上传或要删除文件的相关属性
	* $fieldName 数据表中的字段名
	* $path      文件所在目录
	* $maxsize   最大大小
	* $inputName 网页中input文件域的name
	* $type      文件允许的后缀名
	* $rename    上传文件后是否重命名
	*/
	function setUploadParams($fieldName,$path,$maxsize="51200",$inputName='',$type="gif,jpeg,jpg,png,bmp",$rename=true,$table='')
	{
		if (empty($table)) $table = $this->table ;

		if (empty($fieldName) || empty($path)) return $this->err->catchErr($this->getSysMsg('3001','$fieldName or $path'),__FILE__,__LINE__);

		if (empty($inputName)) $inputName = $fieldName;

		$path = str_replace("\\","/",$path);
		if (substr($path,0,-1) != "/")$path .= "/";

		$tmp['fieldName'] = $fieldName;
		$tmp['path']      = $path;
		$tmp['maxsize']   = $maxsize;
		$tmp['inputName'] = $inputName;
		$tmp['type']      = $type;
		$tmp['rename']    = $rename;

		$this->uploadParams[$table][count($this->uploadParams[$table])]  = & $tmp;
	}

	/* 执行sql的insert操作,如果设置了setUploadParams() ,则同时上传相应文件
	* $data 是字段名与数据的对应数组 如array('name'=>$_POST['name'],'title'=>$_POST['title'])
	* 对于要上传文件的字段与数据对应可以不写,即$data中可以不写'image'=>$_FILES['image']['tmp_name']
	*/
	function insert($data,$table='')
	{
		if (empty($table)) $table = $this->table ;

		$result = $this->insertOrUpdate($data,"insert",'',$table);
		return  $result;
	}

	/* 执行sql的update操作,如果设置了setUploadParams() ,则同时修改相应文件
	* $sql_where 是sql的where子句
	*/
	function update($data,$sql_where,$table='')
	{
		if (empty($table)) $table = $this->table ;

		$result = $this->insertOrUpdate($data,"update",$sql_where,$table);
		return  $result;
	}

	function insertOrUpdate($data,$action="insert",$sql_where='',$table='')
	{
		if (empty($table)) $table = $this->table ;

		if (isset($this->uploadParams[$table]) && count($this->uploadParams[$table]) > 0)
		{
			$_inputNames = $_newname = $_path = $_filePath = $_maxsize = $_type = $_rename = $oldfile = array();
			$uploadParams = $this->uploadParams[$table];

			for ($i = 0,$n=count($uploadParams); $i < $n; $i++)
			{
				$inputName = $uploadParams[$i]['inputName'];
				$file_name = $_FILES[$inputName]['name'];
				$tmpName   = $uploadParams[$i]['rename'] ? uniqid(rand()).strrchr( $_FILES[$inputName]['name'], "." )
				: $file_name;
				$file_old  = $_POST[$inputName.'_old'];                 //用在更新中,表示原文件
				$file_del  = $_POST[$inputName.'_del'];                 //原文件是否标记为删除

				if (!empty($_FILES[$inputName]['tmp_name']) && !empty($file_name)) //表示需要上传,即文件域里填入了任何字符
				{
					$_inputNames[]  = $inputName;                        //取得新的上传字段,因为文件域中没有填入任何字符的不用上传
					$_newname[]     = $tmpName;
					$_path[]        = $uploadParams[$i]['path'];
					$_filePath[]    = $uploadParams[$i]['path'].$tmpName;
					$_maxsize[]     = $uploadParams[$i]['maxsize'];
					$_type[]        = $uploadParams[$i]['type'];
					$_rename[]      = $uploadParams[$i]['rename'];

					if (!empty($file_old)) $oldfile[] = $uploadParams[$i]['path'].$file_old;

					$data[$uploadParams[$i]['fieldName']] = $tmpName;     //为$data增加字段与数据对应参数,这就是前面说 "对于要上传文件的字段与数据对应可以不写" 的原因
				}
				else if (!empty($file_old))                               //表示不需要上传,即文件域里没有填入任何字符,但是有旧文件
				{
					if ($file_del == 'true')                              //如果旧文件标记为删除
					{
						$_fieldVal = "";

						$oldfile[]   = $uploadParams[$i]['path'].$file_old;
					}
					else $_fieldVal = $file_old;

					$data[$uploadParams[$i]['fieldName']] = $_fieldVal;
				}
			}

			$sql = $this->dbObj->createSql($table,$data,$action,$sql_where);    //建立SQL语句

			include_once(dirname(__FILE__)."/UpLoadFile.inc.php");              //文件上传类

			$objUpload = new UploadFile();

			$objUpload->fields   = $_inputNames;
			$objUpload->newName  = $_newname;
			$objUpload->path     = $_path;
			$objUpload->filePath = $_filePath;
			$objUpload->maxsize  = $_maxsize;
			$objUpload->type     = $_type;
			$objUpload->rename   = $_rename;

			if (count($_inputNames) > 0)
			{
				if (!$objUpload->test($oldfile)) return false;                  //测试文件是否能正常上传
			}

			if (count($oldfile) > 0)$objUpload->err_del((count($oldfile)-1), $oldfile);   //测试通过后删除标记为删除的原文件

			if (count($_inputNames) == 0) $this->dbObj->query($sql);            //如果没有要上传的文件,直接执行sql
			else if ($objUpload->upload(false))                                 //否则上传成功后再执行SQL
			{
				$this->dbObj->query($sql);
				if ($this->err->errExists()){                                   //如果执行SQL出错,则删除所有已上传的文件
				$objUpload->err_del(count($_filePath)-1, $_filePath);
				return $this->err->catchErr($this->getSysMsg('3003'));
				}
			}
		}
		else                                                                    //如果没有设置相应的setUploadParams() ,直接执行sql
		{
			$sql = $this->dbObj->createSql($table,$data,$action,$sql_where);
			$this->dbObj->query($sql);
		}

		if ($this->err->errExists())return false;
		else
		{
			if ($action == "insert")return $this->dbObj->insert_id();           //返回最后插入的id值
			else return $this->dbObj->affected_rows();                          //返回受影响到的行数
		}
	}

	/* 执行sql的delete操作,如果设置了setUploadParams() ,则同时删除相应文件
	* $sql_where 是sql的where子句
	*/
	function delete($sql_where,$table='')
	{
		if (empty($table)) $table = $this->table ;

		if (isset($this->uploadParams[$table]) && count($this->uploadParams[$table]) > 0)
		{
			$uploadParams = $this->uploadParams[$table];

			for ($i = 0,$n=count($uploadParams); $i < $n; $i++)
			{
				$fieldName[] = $uploadParams[$i]['fieldName'];                  //找出所有表示图片或文件的字段名
			}

			$selfields = "`".implode("`,`",$fieldName)."`";
			$selsql = "select $selfields from `".$table."` where $sql_where";    //选出所有表示图片或文件的实际名称
			$this->dbObj->query($selsql);
			if ($this->dbObj->num_rows() < 1) return ;
			$delresult = $this->dbObj->getData();

			foreach  ($delresult as $val)
			{
				$i = 0;
				foreach ($val as $v)
				{
					@unlink($uploadParams[$i]['path'].$v) ;                      //删除图片或文件
					$i++;
				}
			}
		}

		$sql = "delete from `$table` where $sql_where " ;
		$this->dbObj->query($sql) ;

		if ($this->err->errExists())return false;
		else return $this->dbObj->affected_rows();                                //返回受影响到的行数
	}

	/* 根据主键取得一行数据
	* $value     主键的值
	* $fieldname 主键名
	*/
	function getDataById($value,$fieldname="id",$table='')
	{
		if (empty($table)) $table = $this->table ;

		$sql = "select * from `$table` where `$fieldname` = '$value'" ;
		$this->dbObj->query($sql);
		$result = $this->dbObj->fetch_array();

		$this->useFieldFunc($result);                                  //对结果应用回调函数

		return $result;
	}

	/* 取得一行数据
	* $sql_where 是sql的where子句
	*/
	function getOneRow($sql_where,$table='')
	{
		if (empty($table)) $table = $this->table ;

		$sql = "select * from ".$table." where ".$sql_where;
		$this->dbObj->query($sql);
		$result = $this->dbObj->fetch_array();

		$this->useFieldFunc($result);

		return $result;
	}

	//应用回调函数
	function useFieldFunc(& $data)
	{
		if (isset($this->fieldFunc[$this->table]) && count($this->fieldFunc[$this->table]) > 0)
		{
			foreach ($this->fieldFunc[$this->table] as $val)
			{
				$fieldName = $val['fieldName'];
				if (isset($data[$fieldName]))
				{
					if ($val['paramsAdd'] == 'left') array_unshift ($val['funcParams'], $data[$fieldName]);
					else array_push($val['funcParams'], $data[$fieldName]) ;
					$data[$fieldName] = call_user_func_array( $val['funcName'],$val['funcParams']);
				}
			}
		}
	}

	/* 根据sql语句取得所有数据,取得的数据放在翻页类PageTurn中
	* $sql       是sql语句
	* $maxnum    每页显示数
	* form_vars  翻页时需要传递的表单字段名(数组)
	* $key       有多个翻页时作为区分标识
	*/
	function getList($sql,$maxnum='0',$form_vars='',$key="")
	{
		$maxnum = (int)$maxnum;

		if (!isset($_GET['totalnum'.$key]))
		{
			$this->dbObj->query($sql);
			$totalnum = $this->dbObj->num_rows();                     //取得总数
		}
		else $totalnum = $_GET['totalnum'.$key];

		include_once(dirname(__FILE__)."/PageTurn.inc.php");          //翻页类

		$objPt = new PageTurn($totalnum,$maxnum,$form_vars,$key);

		$newsql = $sql." limit ".$objPt->startnum.", ".$objPt->maxnum;

		$this->dbObj->query($newsql);                                 //执行sql,只取得当前面的数据

		while ( $row = $this->dbObj->fetch_array() ) {
			$this->useFieldFunc($row);                                //对结果应用回调函数
			$result[] = $row;
		}

		$this->dbObj->free_result();

		$objPt->field = & $result;                                    //将结果放在$objPt的field属性中,方便统一调用

		return $objPt;
	}
}
?>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -