广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >PHP中面向对象的数据库操作类
  • 291
分享到

PHP中面向对象的数据库操作类

2024-04-02 19:04:59 291人浏览 薄情痞子
摘要

    在PHP的面向过程中,我们可以通过封装函数来实现对数据库的操作,那么在面向过程中,我们同样可以通过类来实现对数据库的操作,整个过程和面向过程的思路大体差不多,

    在PHP的面向过程中,我们可以通过封装函数来实现对数据库的操作,那么在面向过程中,我们同样可以通过类来实现对数据库的操作,整个过程和面向过程的思路大体差不多,但是代码量更多了一些,实现起来稍微困难。一共实现了十个功能。先定义成员属性,然后定义成员方法。一共分为连接数据库的config文件、具体实现对数据库操作的类文件、测试代码。所有的代码均是通过了测试,具体的测试结果由于篇幅问题没有附图。

具体实现功能:

1、连接数据库;

2、插入数据;

3、更新数据;

4、删除数据;

5、修改数据;

6、求最大值;

7、求最小值;

8、求平均数;

9、求和;

10、指定查询;


具体代码分为三个部分:

一、config文件:主要用于连接数据库

<?php
return array(
	'DB_HOST' => '127.0.0.1',   //主机
	'DB_USER' => 'root',		//用户名	
	'DB_PWD' => '123456',		//密码
	'DB_NAME' => 'blog',		//数据库名
	'DB_CHARSET' => 'utf8',		//字符集
	'DB_PREFIX' => 'bbs_',		//前缀

);


二、数据库操作类:

<?php

class UserModel
{
	
	//链接
	protected $link;
	//主机
	protected $host;
	//数据库名字
	protected $dbName;
	//字符集
	protected $charset;
	//表名
	protected $table;
	//用户名
	protected $user;
	//密码
	protected $pwd;
	//表前缀
	protected $prefix;
	//字段
	protected $fields;
	//保存的查询、更新、添加的参数
	protected $options;

	

	//初始化数据库
	public function __construct(Array $config)
	{
		//把一批成员属性都初始化
		$this->host = $config['DB_HOST'];
		$this->user = $config['DB_USER'];
		$this->pwd = $config['DB_PWD'];
		$this->dbName = $config['DB_NAME'];
		$this->charset = $config['DB_CHARSET'];
		$this->prefix = $config['DB_PREFIX'];
		//连接
		$this->link = $this->connect();
		//判断连接成功与否  失败处理
		if (!$this->link) {
			exit('数据库连接或者选择数据库失败。');
		}

		//表名  需要处理
		$this->table = $this->getTable();

		//字段 	需要处理
		$this->fields = $this->getFields();



	}

	//连接数据库成员方法
	protected function connect()
	{
		$conn = Mysqli_connect($this->host,$this->user,$this->pwd);

		//连接数据库失败处理
		if (!$conn) {

			return flase;
		}

		//选择数据失败处理
		if (!mysqli_select_db($conn,$this->dbName)) {

			return false ;
		}
		//设置字符集
		mysqli_set_charset($conn,$this->charset);

		//返回处理结果
		return $conn;

	}
	//初始化表 【暂时出现报错,后面用命名空间解决】
	protected function getTable()
	{
		//判断用户时候设置过?
		if (isset($this->table)) {

			//设置过就以用户的为准,先把用户前缀弃掉,然后拼接前缀,保证统一性
			return $this->prefix . ltrim($this->table,$this->prefix);
		} else {

			//没有设置过就用 类名拼接前缀,组成一个全新的的表名
			//get_class() 获取类名 等同于 __CLASS__
			//获取类名后进行字串提取[substr( string,start,length )],并且全部转换为小写[strtolower()]
			return $this->prefix . strtolower(substr(get_class($this),0,-5));
		}
	}
	//初始化字段 需要把字段缓存到一个文件里面去
	protected function getFields()
	{
		//如果有字段的文件说明以前缓存过这个文件,直接包含即可,但是需要知道文件路径的规则
		//定义文件路径
		$filePath = './caceh/' . $this->table . '.php';

		//判断时候有缓存文件
		if (file_exists($filePath)) {

			//存在缓存文件直接包含即可
			return include $filePath;
		} else {

			//没有的话就需要生成一个缓存文件
			//首先需要查询字段
			$fields = $this->queryFields();

			//var_export() 输出或返回一个变量的字符串  true表示不打印  将其保存下来
			$str = "<?php \n return ". var_export($fields,true) . ';?>';
			//写入到缓存文件file_put_contents(文件保存路径,需要写进去的内容)
			file_put_contents($filePath, $str);

		}
		return $fields;


	}

	//查询字段处理
	protected function queryFields()
	{
		//打印字段的sql语句
		$sql = 'desc ' . $this->table;
		//var_dump($sql);
		//执行sql语句  需要定义成员方法query
		$data = $this->query($sql);

		$fields = [];
		//想要获取字段,需要对返回的数据进行遍历
		foreach ($data as $key => $value) {
			$fields[] = $value['Field'];
			if ($value['Key'] == 'PRI') {
				$fields['_pk'] = $value['Field'];
			}
		}
		return $fields;


	}

	//系统级查询(定义为 public ),在外部调用的时候,想自定义SQL语句可以只是调用该成员方法
	//查询相应的结果,这个仅供读取使用查询相应的结果
	public function query($sql)
	{
		//执行一条SQL语句
		$result = mysqli_query($this->link,$sql);

		if ($result) {
			$data = [];
			//获取每行数据
			while ($row = mysqli_fetch_assoc($result)) {
				$data[] = $row;
			}
			return $data;

		} else {
			return false;
		}


	}

	//查询成员方法
	//准备好无需换的SQL语句
	//用户调用询的时候,将call里面保存进去的参数,一一替换sql语句
	//发送SQL语句
	//返回查询的结果
	public function select()
	{
		//拼接sql语句
		$sql = "select %FIELDS% from %TABLE% %WHERE% %GROUP% %HAVING% %ORDER% %LIMIT%";

		//将sql语句中的相应部分替换
		$newsql = str_replace(
					array(
						'%FIELDS%',
						'%TABLE%',
						'%WHERE%',
						'%GROUP%',
						'%HAVING%',
						'%ORDER%',
						'%LIMIT%',
					),
					array(
						$this->parseFields(),
						$this->parseTable(),
						$this->parseWhere(),
						$this->parseGroup(),
						$this->parseHaving(),
						$this->parseOrder(),
						$this->parseLimit(),
					),
					$sql
				);
		echo $newsql;
		$this->sql = $newsql;
		return $this->query($newsql);
	}
	//字段处理
	protected function parseFields()
	{
		//因为我们对比字段的时不需要对比主键是谁,所以需要unset()
		//将当前的字段赋值给一个变量
		$fields = $this->fields;

		unset($fields['_pk']);

		//判断字段是什么形式(字符串、数组)
		if (is_array($this->options['fields'][0])) {

			//遍历取出键值
			foreach ($this->options['fields'][0] as $key => $value) {
				//判断传入的字段时候合法(属于表结构中的字段)
				if (!in_array($value, $fields)) {
					//如果不属于合法的字段就unset()
					unset($this->options['fields'][0][$key]);
				}
			}
			return join(',',$this->options['fields'][0]);

		} else if (is_string($this->options['fields'][0])){
			//如果是字符串就先变为数组进行处理
			$this->options['fields'][0] = explode(',', $this->options['fields'][0]);
			//遍历
			foreach ($this->options['fields'][0]  as $key => $value) {
				//判断字段是否合法
				if (!in_array($value,$fields)) {

					unset($this->options['fields'][0][$key]);
				}
				return join(',',$this->options['fields'][0]);
			}

		} else {
			return join(',',$fields);
		}

	}

	//判断用户有没有手动指定过查询哪个用
	//如果指定过,则以用户设定的options里面的表为准
	//如果没有设定过,则以默认的为准
	protected function parseTable()
	{
		if (isset($this->options['table'][0])) {
			return $this->options['table'][0];
		} else {
			return $this->table;
		}

	}


	//判断用户设置过where 如果设置过就以用户设置为准,没有设置就为空

	protected function parseWhere()
	{
		if (isset($this->options['where'][0])) {
			return 'WHERE ' .$this->options['where'][0];
		} else {
			return '';
		}
	}


	//判断用户设置过group 如果设置过就以用户设置为准,没有设置就为空

	protected function parseGroup()
	{
		if (isset($this->options['where'][0])) {
			return 'GROUP BY ' .$this->options['group'][0];
		} else {
			return '';
		}
	}

	//判断用户设置过having如果设置过就以用户设置为准,没有设置就为空

	protected function parseHaving()
	{
		if (isset($this->options['having'][0])) {
			return 'HAVING ' .$this->options['having'][0];
		} else {
			return '';
		}
	}

	//判断用户设置过order如果设置过就以用户设置为准,没有设置就为空
	protected function parseOrder()
	{
		if (isset($this->options['order'][0])) {
			return 'ORDER BY ' .$this->options['order'][0];
		} else {
			return '';
		}
	}

	//limit可以有以下几种传法


	protected function parseLimit()
	{
		if (isset($this->options['limit'][0])) {

			if (is_int($this->options['limit'][0])) {

				//用户传进来的是一个整 数,就是查询指定的条数
				return 'LIMIT ' . $this->options['limit'][0];

			} else if (is_array($this->options['limit'][0])){

				//用户传进来的是一个数组,则数组中的第一个元素为$offset,第二个元素为$num
				return 'LIMIT ' . join(',',$this->options['limit'][0]);
			} else {

				//如果户传进来的是一个字符串,则以用户传的为准
				return 'LIMIT ' . $this->options['limit'][0];
			}
		} else {

			return '';
		}
	}

	//插入的成员方法
	public function insert($data)
	{
		//SQL语句
		$sql = "insert into %TABLE%(%FIELDS%) values(%VALUES%) ";
		//替换
		$newsql = str_replace(
						array(
							'%TABLE%',
							'%FIELDS%',
							'%VALUES%'
						),
						array(
							$this->parseTable(),
							$this->parseInsertFieldes($data),
							join (',',$this->parseValue($data)),
						),
						$sql
					);
		//重新赋值
		$this->sql = $newsql;
		echo $this->sql;
		//调用exec并执行
		return $this->exec($newsql,true);

	}
	//处理插入时候的字段
	protected function parseInsertFieldes(&$data)
	{
		foreach ($data as $key => $value) {
			if (!in_array($key,$this->fields)) {
				unset($data[$key]);
			}
		}
		return join(',',array_keys($data));
	}

	//处理插入时候的值
	//分为字符串  数组 空的情况处理
	protected function parseValue($data)
	{

		if (is_string($data)) {
			$data = '\'' . $data . '\'';
		} else if (is_array($data)){
			$data = array_map(array($this, 'parseValue'),$data);
		} else if (is_null($data)){
			$data = 'null';
		}

		return $data;
	}
	//
	public function exec($sql,$isInsertId = false)
	{
		$result = mysqli_query($this->link,$sql);

		if ($result) {

			if ($isInsertId) {
				//insertfan返回自动增长的id
				return mysqli_insert_id($this->link);
			} else {
				//update delete 返回受影响的行数

				return mysqli_affected_rows($this->link);
			}
		} else {
			return false;
		}
	}

	//更新方法
	public function update($data)
	{
		$sql = "update %TABLE% set %SETS% %WHERE% %ORDER% %LIMIT%";

		$newsql = str_replace(
					array(
						'%TABLE%',
						'%SETS%',
						'%WHERE%',
						'%ORDER%',
						'%LIMIT%'
					),
					array(
						$this->parseTable(),
						$this->parseSets($data),
						$this->parseWhere(),
						$this->parseOrder(),
						$this->parseLimit(),
					),
					$sql
				);
		$this->sql = $newsql;
		//echo $newsql;
		return $this->exec($newsql);

	}

	//更新内容设置
	protected function parseSets($data)
	{
		$sets = [];
		foreach ($data as $key => $value) {
			 if (in_array($key,$this->fields)) {
			 	$sets[] = $key . '=' . $this->parseValue($value);
			 }
		}
		return join(',',$sets);
	}


	//删除方法
	public function delete()
	{
		$sql = "delete from %TABLE% %WHERE% %ORDER% %LIMIT%";

		$newsql = str_replace(
					array(
						'%TABLE%',
						'%WHERE%',
						'%ORDER%',
						'%LIMIT%'
					),
					array(
						$this->parseTable(),
						$this->parseWhere(),
						$this->parseOrder(),
						$this->parseLimit(),
					),
					$sql
				);

		$this->sql = $newsql;

		return $this->exec($newsql);
	}

	//求总数
	public function sum($field = null )
	{
		if (is_null($field)) {
			$field = $this->fields['_pk'];
		}

		$sql = "select count($field) as sum from %TABLE% %WHERE% ";

		$newsql = str_replace(
						array(
							'%TABLE%',
							'%WHERE%',
						),
						array(
							$this->parseTable(),
							$this->parseWhere(),
							),
						$sql
				);
		$this->sql = $newsql;
		$data = $this->query($newsql);
		return $data[0]['sum'];
	}
	//求最大数
	public function max($field = null )
	{
		if (is_null($field)) {
			$field = $this->fields['_pk'];
		}

		$sql = "select max($field) as max from %TABLE% %WHERE% ";

		$newsql = str_replace(
					array(
						'%TABLE%',
						'%WHERE%',
					),
					array(
						$this->parseTable(),
						$this->parseWhere(),
					),
					$sql
				);
		$this->sql = $newsql;
		$data = $this->query($newsql);
		return $data[0]['max'];
	}
	//求最小数
	public function min($field = null )
	{
		if (is_null($field)) {
			$field = $this->fields['_pk'];
		}

		$sql = "select min($field) as min from %TABLE% %WHERE% ";

		$newsql = str_replace(
					array(
						'%TABLE%',
						'%WHERE%',
					),
					array(
						$this->parseTable(),
						$this->parseWhere(),
					),
					$sql
				);
		$this->sql = $newsql;
		$data = $this->query($newsql);
		return $data[0]['min'];
	}
	//求平均数
	public function avg($field = null )
	{
		if (is_null($field)) {
			$field = $this->fields['_pk'];
		}

		$sql = "select avg($field) as avg from %TABLE% %WHERE% ";

		$newsql = str_replace(
					array(
						'%TABLE%',
						'%WHERE%',
					),
					array(
						$this->parseTable(),
						$this->parseWhere(),
					),
					$sql
				);
		$this->sql = $newsql;
		$data = $this->query($newsql);
		return $data[0]['avg'];
	}


	//自动的一个按照字段来查询的智能化查询方法
	protected function getBy($field,$value)
	{
		$sql = "select %FIELDS% from %TABLE% %WHERE%";

		$newsql = str_replace(
					array(
						'%FIELDS%',
						'%TABLE%',
						'%WHERE%'
					),
					array(
						$this->parseFields(),
						$this->parseTable(),
						' WHERE '.$field . "='$value'",
					),
					$sql
				);
		$this->sql = $newsql;
		echo $newsql;
		return $this->query($newsql);
	}

	//__call方法,针对用户请求limit(), order(),group()等将其保存到options中, 判断其方法合法性;
	//并且return $this 让其能够连贯操作,
	public function __call($func,$args)
	{
		//合法的
		$allow = ['where','table','fields','order','limit','group','having'];
		//把传入的统一转化为小写
		$func = strtolower($func);
		if (in_array($func,$allow)) {
			$this->options[$func] = $args;
			return $this;
		} else if(substr($func,0,5) == 'getby'){
			$field = substr($func,5);

			if (in_array($field,$this->fields)) {
				return $this->getBy($field,$args[0]);
			}
		} else {
			exit ('方法不合法!');
		}

	}

	//析構方法 關閉頁面/對象消費時候調用
	public function __destruct()
	{
		mysqli_close($this->link);
	}
}



三、测试(验证)代码:

//包含文件
$config = include 'config.php';

$blog = new UserModel($config);
//测试查询

$data = $blog->fields('uid,uesrname,passWord')->table('bbs_user')->limit([1,2])->order('uid desc ')->group('username')->select();

var_dump($data);

//插入测试
$_POST['uesrname'] = 'chen';
$_POST['password'] = 123456;
$_POST['creatime'] = 123423;

$_POST['senlin'] = '不存在的字段处理';

echo $blog->insert($_POST);

//更新测试

$_POST['uesrname'] = '1kkkkk12';
$_POST['password'] = 123456;
$_POST['createtime'] = 234567;
$_POST['haiyan'] = '你可长点心眼吧';
echo $blog->where('uid>0')->limit('1')->update($_POST);

//删除测试
echo $blog->where('uid>0 and uid<2')->delete();

//测试求和
echo $blog->sum('uid');

//测试求最大数
echo $blog->max('uid');

//测试求最小数
echo $blog->min();

//测试求平均數
echo $blog->avg();

//测试自动的一个按照字段来查询
$data = $blog->getByPassword('123456');
var_dump($data);


--结束END--

本文标题: PHP中面向对象的数据库操作类

本文链接: https://www.lsjlt.com/news/40924.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • PHP中面向对象的数据库操作类
        在PHP的面向过程中,我们可以通过封装函数来实现对数据库的操作,那么在面向过程中,我们同样可以通过类来实现对数据库的操作,整个过程和面向过程的思路大体差不多,...
    99+
    2022-10-18
  • 面向对象数据库有哪些
    面向对象数据库是一种基于面向对象编程思想的数据库管理系统。常见的面向对象数据库有:1. ObjectStore:ObjectStor...
    99+
    2023-06-07
    对象数据库 数据库
  • php面向对象中类的定义方法
    这篇文章主要介绍php面向对象中类的定义方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!php的框架有哪些php的框架:1、Laravel,Laravel是一款免费并且开源的PHP应用框架。2、Phalcon,Ph...
    99+
    2023-06-14
  • python中面向对象_类_对象的概念与
    1. 面向对象的概念,面向对象是一种编程思想。 是对现实世界中一类事物的抽象,在编程中可以理解为是一种建立现实世界事物的模型     2.  面向对象和面向过程的区别: 面向过程关注的是完成工作的步骤。 面向对象关注的是谁能完成工作。 面...
    99+
    2023-01-30
    面向对象 对象 概念
  • 面向对象编程的基础:PHP中类和对象的构建
    在当今 Web 开发处于顶峰的数字时代,开发人员必须深入了解面向对象编程 (OOP) 及其如何应用于 PHP。PHP 是一种服务器端脚本语言,已经发展了多年,面向对象的 PHP 是现代 Web 开发的一个基础。在这篇文章中,我们将深入研究面...
    99+
    2023-11-07
    php PHP面向对象编程
  • Python面向对象中类和对象的示例分析
    这篇文章主要介绍了Python面向对象中类和对象的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。什么是面向对象编程?我们是不是听过面向过程,拿来放在一起对比就比较好理...
    99+
    2023-06-22
  • Java面向对象中基本数据、包装类怎么用
    这篇文章主要为大家展示了“Java面向对象中基本数据、包装类怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java面向对象中基本数据、包装类怎么用”这篇文章吧。public cl...
    99+
    2023-06-02
  • MySQL 数据库的对库的操作及其数据类型
    目录1. 数据库的操作1.1 显示数据库1.2 创建数据库1.3 选中数据库1.4 删除数据库2. MySQL 中的数据类型2.1 数值类型2.2 字符串类型2.3 日期类型1. 数...
    99+
    2022-11-12
  • go面向对象方式操作JSON库实现四则运算
    目录前言面向对象的方式操作 JSON实现原理对 JSON 做四则运算总结前言 在之前实现的 JSON 解析器中当时只实现了将一个 JSON 字符串转换为一个&nb...
    99+
    2022-11-13
  • 数据分析处理库Pandas——对象操作
    Series结构 索引 修改 旧数据赋值给新数据,旧数据不变。 对某一数值进行修改,可以选择保留修改前或修改后的数值。 替换索引 修改某一个索引 添加 在数据1后添加数据2,数据1不改变。 添加...
    99+
    2023-01-31
    对象 操作 数据
  • PHP中的面向对象编程是什么?
    PHP是一种常用的编程语言,广泛应用于网络应用程序的开发中。在PHP的发展过程中,面向对象编程(OOP)成为其一个不可分割的组成部分。本文将介绍PHP中的面向对象编程是什么,其特点和应用场景。一、面向对象编程概述面向对象编程是一种编程范型,...
    99+
    2023-05-21
    PHP 面向对象编程 OOP
  • php如何用PDO操作大数据对象
    目录什么是大数据对象直接操作大数据对象会怎么样?正确的姿势总结什么是大数据对象 “大”通常意味着“大约 4kb 或以上”,尽管某些数据库在数据达到“大”之前可以轻松地处理多达 32...
    99+
    2022-11-12
  • PDO中操作大数据对象的方法
    这篇文章主要介绍了PDO中操作大数据对象的方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。PDO操作大数据对象一般在数据库中,我们保存的都...
    99+
    2022-10-18
  • 02、对数据库的操作
             数据库的操作不管是在Windows系统还是Linux系统的是一样的。小编在此先以Windows系统下安装的数据库为例,Linux系统下如何安装及其使用,在后面的大数据中会讲。 1、创建数据库   CREATE D...
    99+
    2014-09-03
    02 对数据库的操作
  • JavaScript【History 对象、Cookie 对象 、封装cookie操作、apply、call和bind函数、面向对象简介、new 命令】(十八)
    目录 History 对象 History.back()  History.forward()  History.go()  Cookie 对象 来源地址:https://blog.csdn.net/m0_58719994/articl...
    99+
    2023-08-31
    前端 History 对象 Cookie 对象 new 命令 原力计划
  • Python 对象中的数据类型
    对于python,一切事物都是对象,程序中存储的所有数据都是对象,对象基于类创建 计算机能处理的远不止数值,还可以处理文本、图形、音频、视频、网页等各种各样的数据,不同的数据,需要定义不同的数据类型。 cl...
    99+
    2022-06-04
    数据类型 象中 Python
  • 浅谈python中的面向对象和类的基本语法
    当我发现要写python的面向对象的时候,我是踌躇满面,坐立不安呀。我一直在想:这个坑应该怎么爬?因为python中关于面向对象的内容很多,如果要讲透,最好是用面向对象的思想重新学一遍前面的内容。这个坑是如...
    99+
    2022-06-04
    浅谈 面向对象 语法
  • Python中对数据库的操作详解
    目录一、数据库介绍1、为什么要学习数据库2、数据库的介绍二、MySQL介绍安装MySQL使用数据库1、语法格式2、简单示例三、查看数据库查看MySQL中存在的数据库四、简单示例一、数...
    99+
    2023-02-20
    Python数据库 Python操作数据库
  • 举例讲解Python面向对象编程中类的继承
    python创建一个类很简单只需要定义它就可以了. class Cat: pass 就像这样就可以了,通过创建子类我们可以继承他的父类(超类)的方法。这里重新写一下cat class Cat...
    99+
    2022-06-04
    面向对象 Python
  • Python 对mysql数据库的操作
    Python 对mysql数据库的操作 #!/usr/bin/python # -*- coding: utf-8 -*- import MySQLdb class mysql:     def __init__(self, sql, h...
    99+
    2023-01-31
    操作 数据库 Python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作