我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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);


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

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

下载Word文档

猜你喜欢

带有类和对象的面向对象的 PHP

在本文中,我们将探索使用 PHP 类进行面向对象编程的基础知识。我们将从类和对象的介绍开始,我们将在本文的后半部分讨论一些高级概念,如继承和多态性。什么是面向对象编程 (OOP)?面向对象编程,通常称为 OOP,是一种帮助我们以易于长期维护
带有类和对象的面向对象的 PHP
2024-02-27

面向对象数据库有哪些

面向对象数据库是一种基于面向对象编程思想的数据库管理系统。常见的面向对象数据库有:1. ObjectStore:ObjectStore是一种基于对象的数据库管理系统,提供了一个完全的面向对象的数据模型。2. GemStone:GemSton
2023-06-07

PHP 函数库中有哪些面向对象的函数?

php 提供了丰富的 oop 函数库,可简化开发工作:常用 oop 函数:splfixedarray(固定长度数组)、splobjectstorage(存储对象)、splpriorityqueue(优先级队列)、splqueue(先进先出队
PHP 函数库中有哪些面向对象的函数?
2024-04-27

php面向对象中类的定义方法

这篇文章主要介绍php面向对象中类的定义方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!php的框架有哪些php的框架:1、Laravel,Laravel是一款免费并且开源的PHP应用框架。2、Phalcon,Ph
2023-06-14

python中面向对象_类_对象的概念与

1. 面向对象的概念,面向对象是一种编程思想。是对现实世界中一类事物的抽象,在编程中可以理解为是一种建立现实世界事物的模型  2.  面向对象和面向过程的区别:面向过程关注的是完成工作的步骤。面向对象关注的是谁能完成工作。面向对象是在完成工
2023-01-30

面向对象编程的基础:PHP中类和对象的构建

在当今 Web 开发处于顶峰的数字时代,开发人员必须深入了解面向对象编程 (OOP) 及其如何应用于 PHP。PHP 是一种服务器端脚本语言,已经发展了多年,面向对象的 PHP 是现代 Web 开发的一个基础。在这篇文章中,我们将深入研究面
面向对象编程的基础:PHP中类和对象的构建
2023-11-07

使用PDO建立面向对象式PHP数据库连接

使用 php 数据对象 (pdo) 建立面向对象式 php 数据库连接,提供了一个与各种数据库交互的统一界面。pdo 连接的建立需要一个数据源名称 (dsn)、用户名和密码。使用 query() 方法执行 sql 查询,fetchall()
使用PDO建立面向对象式PHP数据库连接
2024-05-21

Python面向对象中类和对象的示例分析

这篇文章主要介绍了Python面向对象中类和对象的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。什么是面向对象编程?我们是不是听过面向过程,拿来放在一起对比就比较好理
2023-06-22

面向对象的 PHP 数据结构设计模式

在 oop php 中,有以下数据结构设计模式:阵列模式:表示有序元素序列;链表模式:表示可增长的有序元素序列;堆栈模式:表示后进先出元素序列;队列模式:表示先进先出元素序列;树状模式:表示分层结构;图形模式:表示具有节点和边界的结构。面向
面向对象的 PHP 数据结构设计模式
2024-05-08

Java面向对象中基本数据、包装类怎么用

这篇文章主要为大家展示了“Java面向对象中基本数据、包装类怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java面向对象中基本数据、包装类怎么用”这篇文章吧。/**知识点: 基本数据类型
2023-06-02

golang函数在面向对象编程中的抽象类实现

在 golang 中,可以通过实现一个接口并定义一个函数来实现抽象类功能:定义接口并声明方法签名。定义函数并实现接口方法。实例化结构体并调用函数。实战案例中,使用 shape 接口和对应的具体形状函数来绘制不同的形状。Golang 函数在面
golang函数在面向对象编程中的抽象类实现
2024-05-03

golang函数在面向对象编程中的作用

在 go 语言中,函数在面向对象编程中扮演着关键角色:encapsulation:封装行为和操作对象。operations:执行对对象的操作,例如修改字段值或执行任务。Golang 函数在面向对象编程中的作用面向对象编程 (OOP) 是一
golang函数在面向对象编程中的作用
2024-04-26

数据分析处理库Pandas——对象操作

Series结构 索引 修改 旧数据赋值给新数据,旧数据不变。 对某一数值进行修改,可以选择保留修改前或修改后的数值。 替换索引 修改某一个索引 添加 在数据1后添加数据2,数据1不改变。 添加一个数据。 数据1后添加数据2,新生成的数据可
2023-01-31

02、对数据库的操作

数据库的操作不管是在Windows系统还是Linux系统的是一样的。小编在此先以Windows系统下安装的数据库为例,Linux系统下如何安装及其使用,在后面的大数据中会讲。1、创建数据库  CREATE DATABASE 数据库名;     如:create
02、对数据库的操作
2014-09-03

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录