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

这篇博客介绍了如何在PHP中使用面向对象的方式实现数据库操作。通过定义一个UserModel类,包含了连接数据库、插入、更新、删除、查询等基本功能,并提供了自动处理字段和表名的方法。此外,还展示了如何通过构造函数初始化配置,以及如何进行测试以验证功能的正确性。
摘要由CSDN通过智能技术生成

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值