📄 dataset.inc.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 + -