
MySQL.class.php 底层的sql处理 添加单例模式,只允许实例化一次
↓ 引入到 BaseModel中
BaseModel.class.php 基本的 model 设定最mysql的基本数据 并创建了连接
↓ 是BillModel的父类
BillModel.class.php 处理bill表中相应的逻辑
↓
BillController.class.php bill类的处理器 负责 mvc中的 c连接 m v
↓ show
index.html
ModelFactory.class.php 单例工厂 需要时候调用创建单例对象 一般在 Controller中使用
具体代码:
MySQL.class.php
<?php
/*设计一个类:mysqli数据库操作类
设计目标:
1,该类一实例化,就可以自动连接上mysqli数据库;
2,该类可以单独去设定要使用的连接编码(set names XXX)
3,该类可以单独去设定要使用的数据库(use XXX);
4,可以主动关闭连接;
*/
class MySQLDB{
private $link = null; //用于存储连接成功后的“资源”
//定义一些属性,以存储连接数据库的6项基本信息
private $host;
private $port;
private $user;
private $pass;
private $charset;
private $dbname;
//实现单例第2步:用于存储唯一的单例对象:
private static $instance = null;
//实现单例第3步:
static function GetInstance($config){
//if( !isset( self::$instance )){ //还没有该对象
if( !(self::$instance instanceof self) ){ //这一行代替上一行的判断,更常见
self::$instance = new self($config); //就创建并存起来
}
return self::$instance;
}
//实现单例第4步:私有化这个克隆的魔术方法
private function __clone(){}
//实现单例第1步:
private function __construct($config){
//先将这些基本的连接信息,保存起来!
$this->host = !empty($config['host']) ? $config['host'] : "localhost"; //考虑空值情况,使用默认值代替
$this->port = !empty($config['port']) ? $config['port'] : "3306" ;
$this->user = !empty($config['user']) ? $config['user'] : "root" ;
$this->pass = !empty($config['pass']) ? $config['pass'] : "" ;
$this->charset = !empty($config['charset']) ? $config['charset'] : "utf8" ;
$this->dbname = !empty($config['dbname']) ? $config['dbname'] : "php39" ;
//然后连接数据库!
$this->link = new mysqli("{$this->host}:{$this->port}", "{$this->user}", "{$this->pass}")
or die("连接失败");
//设定编码
//mysqli_query("set names {$config['charset']}");
$this->setCharset( $this->charset );//这一行代替上一行
//选定要使用的数据库名
//mysqli_query("use {$config['dbname']}");
$this->selectDB( $this->dbname );//这一行代替上一行
}
//可以设定要使用的连接编码
function setCharset( $charset ){
$this->link->query("set names $charset");
}
//可以设定要使用的数据库
function selectDB($dbname){
$this->link->query("use $dbname");
}
//可关闭连接
function closeDB(){
$this->link->close();
}
//这个方法为了执行一条增删改语句,它可以返回真假结果
function runQuery($sql){
$result = $this->link->query($sql);
return true; //因为是增删改语句,直接返回true就可以
}
}
BaseModel.class.php
<?php
require('MySQL.class.php');
class BaseModel{
protected $db=null;//存储数据库工具类的实例
function __construct(){
$config=array(
'host'=>"localhost",
'port'=>"3306",
'user'=>"root",
'pass'=>"root",
'charset'=>"utf8",
'dbname'=>"db_market"
);
$this->db=MySQLDB::getInstance($config);
}
}
BillModel.class.php
<?php
include('BaseModel.class.php');
class BillModel extends BaseModel{
function deleteBillByID($id){
$sql="delete from tb_goods where id={$id}";
$data=$this->db->runQuery($sql);
return $data;
}
}
ModelFactory.class.php
<?php
//单例工厂类
//通过这个工厂类,可以传递过来一个模型类的类名
//并返回给类的一个实例,并且,保证其为“单例的”;
class ModelFactory{
static $all_model=array();//用于存储各个模型类的唯一实例
private function __construct(){}//禁止实例化
private function __clone(){}//禁止克隆对象
static function M($model_name){ //传递一个模型类的类名
if (!isset(static::$all_model[$model_name]) //如果不存在
||
!(static::$all_model[$model_name] instanceof $model_name)//或者不是其实例
) {
static::$all_model[$model_name]=new $model_name();
}
return static::$all_model[$model_name];
}
}
BillController.class.php
<?php
include('../model/BillModel.class.php');
include('../model/ModelFactory.class.php');
//$bill=new BillModel();
$bill=ModelFactory::M('BillModel');
$count=$bill->deleteBillByID(1);
echo $count;
include('../view/index.html');
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<h1>成功执行了语句</h1>
程序返回值为<?php echo $count;?>
</body>
</html>
人吐槽 | 人点赞 |
发表评论