首页 > 后端开发 > 正文

php框架封装数据库 如何写一个属于自己的数据库封装(2)

2023-09-27 21:36:04 | 我爱编程网

今天,我爱编程网小编为关注后端开发的同学们准备了php框架封装数据库 如何写一个属于自己的数据库封装(2),下面一起来看一下吧。

php框架封装数据库 如何写一个属于自己的数据库封装(2)

怎么用php建立一个数据库



怎么用php建立一个数据库?
首先打开我们的php编辑器,在新建好的文件中写上注释内容。
新建一个函数,命名为create_data
设置用户名,密码和主机名的变量,并给他们赋值。
$Username="root";
$Password="";
$servernmae="localhost";
连接数据库。
连接好数据库之后,开始写创建数据库的sql语句。
执行sql语句。
调用这个函数即可。
更多PHP相关知识,请访问PHP中文网!

php框架封装数据库 如何写一个属于自己的数据库封装(2)我爱编程网

PHP中对数据库操作的封装,有什么好的例子吗

类文件mysql.class.php:
<?php

class Mysql{

//数据库连接返回值
private $conn;

/**
* [构造函数,返回值给$conn]
* @param [string] $hostname [主机名]
* @param [string] $username[用户名]
* @param [string] $password[密码]
* @param [string] $dbname[数据库名]
* @param [string] $charset[字符集]
* @return [null]

*/

function __construct($hostname,$username,$password,$dbname,$charset='utf8'){
$config = @mysql_connect($hostname,$username,$password);
if(!$config){
echo '连接失败,请联系管理员';
exit;
  }
  $this->conn = $config;
  $res = mysql_select_db($dbname);
  if(!$res){
  echo '连接失败,请联系管理员';
  exit;
  }
  mysql_set_charset($charset);
}
function __destruct(){
  mysql_close();
}
/**
* [getAll 获取所有信息]
* @param [string] $sql [sql语句]
* @return [array] [返回二维数组]
*/
function getAll($sql){
  $result = mysql_query($sql,$this->conn);
  $data = array();
  if($result && mysql_num_rows($result)>0){
    while($row = mysql_fetch_assoc($result)){
    $data[] = $row;
    }
  }
  return $data;
}
/**
* [getOne 获取单条数据]
* @param [string] $sql [sql语句]
* @return [array] [返回一维数组]
*/
function getOne($sql){
  $result = mysql_query($sql,$this->conn);
  $data = array();
  if($result && mysql_num_rows($result)>0){
    $data = mysql_fetch_assoc($result);
  }
  return $data;
}

/**
* [getOne 获取单条数据]
* @param [string] $table [表名]
* @param [string] $data [由字段名当键,属性当键值的一维数组]
* @return [type] [返回false或者插入数据的id]
*/

function insert($table,$data){
  $str = '';
  $str .="INSERT INTO `$table` ";
  $str .="(`".implode("`,`",array_keys($data))."`) ";
  $str .=" VALUES ";
  $str .= "('".implode("','",$data)."')";
  $res = mysql_query($str,$this->conn);
  if($res && mysql_affected_rows()>0){
      return mysql_insert_id();
  }else{
    return false;
  }
}
/**
* [update 更新数据库]
* @param [string] $table [表名]
* @param [array] $data [更新的数据,由字段名当键,属性当键值的一维数组]
* @param [string] $where [条件,‘字段名’=‘字段属性’]
* @return [type] [更新成功返回影响的行数,更新失败返回false]
*/
function update($table,$data,$where){
  $sql = 'UPDATE '.$table.' SET ';
  foreach($data as $key => $value){
  $sql .= "`{$key}`='{$value}',";
  }
  $sql = rtrim($sql,',');
  $sql .= " WHERE $where";
  $res = mysql_query($sql,$this->conn);
  if($res && mysql_affected_rows()){
    return mysql_affected_rows();
  }else{
  return false;
  }
}

/**
* [delete 删除数据]
* @param [string] $table [表名]
* @param [string] $where [条件,‘字段名’=‘字段属性’]
* @return [type] [成功返回影响的行数,失败返回false]
*/
function del($table,$where){
  $sql = "DELETE FROM `{$table}` WHERE {$where}";
  $res = mysql_query($sql,$this->conn);
  if($res && mysql_affected_rows()){
    return mysql_affected_rows();
  }else{
  return false;
  }
}
}
?>
使用案例:
<?php
//包含数据库操作类文件
include 'mysql.class.php';
//设置传入参数
$hostname='localhost';
$username='root';
$password='123456';
$dbname='aisi';
$charset = 'utf8';
//实例化对象
$db = new Mysql($hostname,$username,$password,$dbname);
//获取一条数据
$sql = "SELECT count(as_article_id) as count FROM as_article where as_article_type_id=1";
$count = $db->getOne($sql);
//获取多条数据
$sql = "SELECT * FROM as_article where as_article_type_id=1 order by as_article_addtime desc limit $start,$limit";
$service = $db->getAll($sql);
//插入数据
$arr = array(
'as_article_title'=>'数据库操作类',
'as_article_author'=>'rex',
);
$res = $db->insert('as_article',$arr);
//更新数据
$arr = array(
'as_article_title'=>'实例化对象',
'as_article_author'=>'Lee',
);
$where = "as_article_id=1";
$res = $db->update('as_article',$arr,$where);
//删除数据
$where = "as_article_id=1";
$res = $db->del('as_article',$where);
?>

php框架封装数据库 如何写一个属于自己的数据库封装(2)

如何写一个属于自己的数据库封装(2)


Connector.php负责与数据库通信,增删改读(CRUD)
首先, 建一个Connector类, 并且设置属性
<?php
class Connector {
// 数据库地址前缀,常见的有mysql,slqlsrv,odbc等等等
private $driver = 'mysql';
// 数据库地址
private $host = 'localhost';
// 数据库默认名称, 设置为静态是因为有切换数据库的需求
private static $db = 'sakila';
// 数据库用户名
private $username = 'root';
// 数据库密码
private $password = '';
// 当前数据库连接
protected $connection;
// 数据库连接箱,切换已存在的数据库连接不需要重新通信,从这里取即可
protected static $container = [];
// PDO默认属性配置,具体请自行查看文档
protected $options = [
PDO::ATTR_CASE => PDO::CASE_NATURAL,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL,
PDO::ATTR_STRINGIFY_FETCHES => false,
];
}以上代码配合注释应该可以理解了所以不多解释了,直接进入函数
buildConnectString - 就是生成DSN连接串, 非常直白
protected function buildConnectString() {
return "$this->driver:host=$this->host;dbname=".self::$db;
}
// "mysql:host=localhost;dbname=sakila;"connect - 连接数据库
public function connect() {
try {
// 连接数据库,生成pdo实例, 将之赋予$connection,并存入$container之中
self::$container[self::$db] = $this->connection = new PDO($this->buildConnectString(), $this->username, $this->password, $this->options);
// 返回数据库连接
return $this->connection;
} catch (Exception $e) {
// 若是失败, 返回原因
// 还记得dd()吗?这个辅助函数还会一直用上
dd($e->getMessage());
}
}setDatabase - 切换数据库
public function setDatabase($db) {
self::$db = $db;
return $this;
}_construct - 生成实例后第一步要干嘛
function construct() {
// 如果从未连接过该数据库, 那就新建连接
if(empty(self::$container[self::$db])) $this->connect();
// 反之, 从$container中提取, 无需再次通信
$this->connection = self::$container[self::$db];
}接下来两个函数式配合着用的,单看可能会懵逼, 配合例子单步调试
$a = new Connector();
$bindValues = [
'PENELOPE',
'GUINESS'
];
dd($a->read('select * from actor where first_name = ? and last_name = ?', $bindValues));返回值
array (size=1)
0 =>
object(stdClass)[4]
public 'actor_id' => string '1' (length=1)
public 'first_name' => string 'PENELOPE' (length=8)
public 'last_name' => string 'GUINESS' (length=7)
public 'last_update' => string '2006-02-15 04:34:33' (length=19)read - 读取数据
public function read($sql, $bindings) {
// 将sql语句放入预处理函数
// $sql = select * from actor where first_name = ? and last_name = ?
$statement = $this->connection->prepare($sql);
// 将附带参数带入pdo实例
// $bindings = ['PENELOPE', 'GUINESS']
$this->bindValues($statement, $bindings);
// 执行
$statement->execute();
// 返回所有合法数据, 以Object对象为数据类型
return $statement->fetchAll(PDO::FETCH_OBJ);
}bindValues - 将附带参数带入pdo实例
// 从例子中可以看出, 我用在预处理的变量为?, 这是因为pdo的局限性, 有兴趣可以在评论区讨论这个问题
public function bindValues($statement, $bindings) {
// $bindings = ['PENELOPE', 'GUINESS']
// 依次循环每一个参数
foreach ($bindings as $key => $value) {
// $key = 0/1
// $value = 'PENELOPE'/'GUINESS'
$statement->bindValue(
// 如果是字符串类型, 那就直接使用, 反之是数字, 将其+1
// 这里是数值, 因此返回1/2
is_string($key) ? $key : $key + 1,
// 直接放入值
// 'PENELOPE'/'GUINESS'
$value,
// 这里直白不多说
// PDO::PARAM_STR/PDO::PARAM_STR
is_int($value) ? PDO::PARAM_INT : PDO::PARAM_STR
);
}
}所以懂了吗_( :3」∠)
update - 改写数据
// 与read不同的地方在于, read返回数据, update返回boolean(true/false)
public function update($sql, $bindings) {
$statement = $this->connection->prepare($sql);
$this->bindValues($statement, $bindings);
return $statement->execute();
}delete - 删除数据
// 与update一样, 分开是因为方便日后维护制定
public function delete($sql, $bindings) {
$statement = $this->connection->prepare($sql);
$this->bindValues($statement, $bindings);
return $statement->execute();
}create - 增加数据
// 返回最新的自增ID, 如果有
public function create($sql, $bindings) {
$statement = $this->connection->prepare($sql);
$this->bindValues($statement, $bindings);
$statement->execute();
return $this->lastInsertId();
}lastInsertId - 返回新增id, 如果有
// pdo自带,只是稍微封装
public function lastInsertId() {
$id = $this->connection->lastInsertId();
return empty($id) ? null : $id;
}过于高级复杂的SQL语句可能无法封装, 因此准备了可直接用RAW query通信数据库的两个函数
exec - 适用于增删改
public function exec($sql) {
return $this->connection->exec($sql);
}query - 适用于读
public function query($sql) {
$q = $this->connection->query($sql);
return $q->fetchAll(PDO::FETCH_OBJ);
}将数据库事务相关的函数封装起来, 直白所以没有注释
public function beginTransaction() {
$this->connection->beginTransaction();
return $this;
}
public function rollBack() {
$this->connection->rollBack();
return $this;
}
public function commit() {
$this->connection->commit();
return $this;
}
public function inTransaction() {
return $this->connection->inTransaction();
}完整代码<?php
class Connector {
// 数据库地址前缀,常见的有mysql,slqlsrv,odbc等等等
private $driver = 'mysql';
// 数据库地址
private $host = 'localhost';
// 数据库默认名称, 设置为静态是因为有切换数据库的需求
private static $db = 'sakila';
// 数据库用户名
private $username = 'root';
// 数据库密码
private $password = '';
// 当前数据库连接
protected $connection;
// 数据库连接箱,切换已存在的数据库连接不需要重新通信,从这里取即可
protected static $container = [];
// PDO默认属性配置,具体请自行查看文档
protected $options = [
PDO::ATTR_CASE => PDO::CASE_NATURAL,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL,
PDO::ATTR_STRINGIFY_FETCHES => false,
];
function construct() {
// 如果从未连接过该数据库, 那就新建连接
if(empty(self::$container[self::$db])) $this->connect();
// 反之, 从$container中提取, 无需再次通信
$this->connection = self::$container[self::$db];
}
// 生成DSN连接串
protected function buildConnectString() {
return "$this->driver:host=$this->host;dbname=".self::$db;
}
// 连接数据库
public function connect() {
try {
// 连接数据库,生成pdo实例, 将之赋予$connection,并存入$container之中
self::$container[self::$db] = $this->connection = new PDO($this->buildConnectString(), $this->username, $this->password, $this->options);
// 返回数据库连接
return $this->connection;
} catch (Exception $e) {
// 若是失败, 返回原因
dd($e->getMessage());
}
}
// 切换数据库
public function setDatabase($db) {
self::$db = $db;
return $this;
}
// 读取数据
public function read($sql, $bindings) {
// 将sql语句放入预处理函数
$statement = $this->connection->prepare($sql);
// 将附带参数带入pdo实例
$this->bindValues($statement, $bindings);
// 执行
$statement->execute();
// 返回所有合法数据, 以Object对象为数据类型
return $statement->fetchAll(PDO::FETCH_OBJ);
}
// 将附带参数带入pdo实例
public function bindValues($statement, $bindings) {
// 依次循环每一个参数
foreach ($bindings as $key => $value) {
$statement->bindValue(
// 如果是字符串类型, 那就直接使用, 反之是数字, 将其+1
is_string($key) ? $key : $key + 1,
// 直接放入值
$value,
// 这里直白不多说
is_int($value) ? PDO::PARAM_INT : PDO::PARAM_STR
);
}
}
// 改写数据
public function update($sql, $bindings) {
// 与read不同的地方在于, read返回数据, update返回boolean(true/false)
$statement = $this->connection->prepare($sql);
$this->bindValues($statement, $bindings);
return $statement->execute();
}
// 删除数据
public function delete($sql, $bindings) {
$statement = $this->connection->prepare($sql);
$this->bindValues($statement, $bindings);
return $statement->execute();
}
// 增加数据
public function create($sql, $bindings) {
$statement = $this->connection->prepare($sql);
$this->bindValues($statement, $bindings);
$statement->execute();
return $this->lastInsertId();
}
// 返回新增id, 如果有
public function lastInsertId() {
$id = $this->connection->lastInsertId();
return empty($id) ? null : $id;
}
// 适用于增删改
public function exec($sql) {
return $this->connection->exec($sql);
}
// 适用于读
public function query($sql) {
$q = $this->connection->query($sql);
return $q->fetchAll(PDO::FETCH_OBJ);
}
public function beginTransaction() {
$this->connection->beginTransaction();
return $this;
}
public function rollBack() {
$this->connection->rollBack();
return $this;
}
public function commit() {
$this->connection->commit();
return $this;
}
public function inTransaction() {
return $this->connection->inTransaction();
}
}本期疑问1.) 因为php本身的特性, 默认情况下运行完所有代码类会自行析构,pdo自动断联, 所以我没有disconnect(),让pdo断开连接, 不知这样是不是一种 bad practice?
2.) 增加和改写数据的两个函数并不支持多组数据一次性加入,只能单次增该, 原因是我之前写了嫌太繁琐所以删了, 有心的童鞋可以提供方案

以上就是我爱编程网小编为大家带来的php框架封装数据库 如何写一个属于自己的数据库封装(2),希望对大家有帮助,了解更多相关资讯请关注我爱编程网。
与“php框架封装数据库 如何写一个属于自己的数据库封装(2)”相关推荐
php实现框架数据库链接封装 如何写一个属于自己的数据库封装(2)
php实现框架数据库链接封装 如何写一个属于自己的数据库封装(2)

如何写一个属于自己的数据库封装(2)Connector.php负责与数据库通信,增删改读(CRUD)首先,建一个Connector类,并且设置属性&lt;?phpclassConnector{//数据库地址前缀,常见的有mysql,slqlsrv,odbc等等等private$driver='mysql';//数据库地址private$host='localho

2023-10-06 07:12:40
php封装自己的框架 php数据库封装哪个框架好(php封装类)
php封装自己的框架 php数据库封装哪个框架好(php封装类)

php如何封装方法【相关学习推荐:php图文教程】php封装方法的方法:1、先把代码写好,能出功能了,就把该代码全部剪切过去事先创建好的类中,其中将需要的参数也写好,当然,如果你逻辑清晰的话,也可以直接封装好调用。如果是想操作页面的文本框、下拉框等等,传输的参数就不是字符串类型的了,而是创建该页面对应的标签。给你们举个简单的列子:2、就是该标签,在封装方法的时候一定要声明是该

2023-09-16 03:40:44
数据库框架php php数据库封装哪个框架好(php封装类)
数据库框架php php数据库封装哪个框架好(php封装类)

php主流框架都有什么php各种主流框架的比较一、ThinkPHP框架优势:简单易用(Model,Controller,View负责各自的工作),它拥有支持XML标签库技术的编译型模版引擎,支持两种模版标签,动态编译,缓存技术。还支持自定义标签库,具有独特的数据验证和自动填充,MD5数据加密等功能。部署简单只需要一个入口文件,上手快,有丰富的中文文档;学习成本低,社区活跃度高,在

2023-09-24 04:53:28
php数据库管理框架 php数据库封装哪个框架好(php封装类)
php数据库管理框架 php数据库封装哪个框架好(php封装类)

php框架哪个用的多php框架哪个用的多?在国内ThinkPHP框架用的是最多的,是目前国内最流行的开源PHP开发框架!ThinkPHP是一个快速、简单、面向对象的轻量级PHP开发框架。遵循Apache2开源协议发布,从Struts结构移植过来并做了改进和完善,同时也借鉴了国外很多优秀的框架和模式,使用面向对象的开发结构和MVC模式,融合了Struts的思想和TagLib(标

2023-09-28 05:24:47
数据库查询PHP框架 php数据库封装哪个框架好(php封装类)
数据库查询PHP框架 php数据库封装哪个框架好(php封装类)

php如何查询数据库PHP查询数据库之前,首先要连接数据库,下面使用PDO来连接数据库。pdo是php5中新加入的数据库抽象层,为了解决访问不同数据库统一接口的问题。类似于PEAR::DB类和ADODB类的操作,不过它是直接封装再php扩展中,可以自由选择使用。PDO构造函数连接数据库在PDO中,要建立数据库的连接需要实例化PDO的构造函数,PDO构造函数的语法格式如下:

2023-09-28 18:08:50
php框架数据 php数据库封装哪个框架好(php封装类)
php框架数据 php数据库封装哪个框架好(php封装类)

thinkphp支持哪些数据库(基于thinkphp框架)目前的数据库包括Mysql、SqlServer、PgSQL、Sqlite、Oracle、Ibase、Mongo,也包括对PDO的支持,如果应用需要使用数据库,必须配置数据库连接信息,数据库的配置文件有多种定义方式。php框架需要掌握什么php框架需要掌握什么?下面介绍几个主流的PHP框架。(1)ZendFrame

2023-09-03 05:14:33
php学封装框架 php数据库封装哪个框架好(php封装类)
php学封装框架 php数据库封装哪个框架好(php封装类)

php数据库封装哪个框架好(php封装类)PHP随便你用什么框架都不是问题,重点是玩的熟悉了后,PHPER自己做出类似YII,CI的框架都不是问题,而且现在成熟框架来说,也有很多缺点比如ZENDFRAMEWORK,走的是MVC套路,但是实际上低成本的框架不一定是这个结构,而是后BS时代的近似于CS结构的那种通信方式,代码越少,开发周期就会变短YII的问题是过度封装,仔细阅读代码,就会

2023-09-15 14:56:54
什么是php框架封装 php数据库封装哪个框架好(php封装类)
什么是php框架封装 php数据库封装哪个框架好(php封装类)

php框架需要掌握什么php框架需要掌握什么?下面介绍几个主流的PHP框架。(1)ZendFrameworkZendFramework是由Zend公司开发的PHP框架,可用于开发Web程序和服务。ZendFramework采用MVC架构模式来分离应用程序中不同的部分,从而方便程序的开发和维护。(2)CakePHPCakePHP是一个运用了诸如ActiveRecord、

2023-09-17 17:41:07