php教程--案例33(模型类)
发布日期:2021-05-06 21:10:34 浏览次数:25 分类:精选文章

本文共 7818 字,大约阅读时间需要 26 分钟。

这个代码有点多,比较复杂;

先在工程项目里,添加一个文件夹(library_1),然后将下面的代码都建立在这个文件夹中统一管理。

首页 index.php

field('emp_name,emp_dept')->select();echo "
";var_dump($data);echo "
";//调用model方法$emp_1 = model('emp_info');//准备插入数据的数组$emp_data = array( 'emp_name'=>'x', 'emp_dept'=>'d', 'date_birth'=>'2020-09-01', 'date_entry'=>'2020-09-02');//插入数据if($emp_id = $emp_1->add($emp_data)){ $emp_res = $emp_1->getById($emp_id); echo "
";    var_dump($emp_res);    echo "
";}

自动加载类页面 init.php

'localhost', 'user'=>'root', 'pwd'=>'mysql123', 'dbname'=>'test');//自动加载函数function my_autoload($className){ require_once "./{$className}.class.php";}//注册自动加载函数spl_autoload_register("my_autoload");//模型调用方法function model($tableName){ $model = $tableName.'Model'; return new $model($tableName);}

emp_infoModel.class.php

tableName where emp_id=$id"; if($data = $this->db->fetchRow($sql)) { return $data; } return false; }}

模型基类 model.class.php

tableName = $tableName; //调用数据操作类的静态方法,获取数据库连接id $this->db = mysqldb::getInstance($GLOBALS['db_config1']); } //字段 public function field($fields) { $this->fields = $fields; return $this; } //整理字段 private function parseFields() { if(is_string($this->fields)) { $this->fields = explode(',',$this->fields); } foreach ($this->fields as $k=>$v) { $this->fields[$k]="$v"; } return implode(',',$this->fields); } //查询 public function select() { if(empty($this->fields)) { $sql = "select * from $this->tableName"; } else { $fields = $this->parseFields(); $sql = "select $fields from $this->tableName"; $this->fields = null; } return $this->db->fetchAll($sql); } //设置属性器 public function __set($name, $value) { $this->data[$name] = $value; } //获取属性器 public function __get($name) { return isset($this->data[$name])?$this->data[$name]:null; } //整理插入数据 private function parseData() { $field = array(); $value = array(); foreach ($this->data as $k=>$v) { $field[] = "$k"; $value[] = "'".$this->db->escapeString($v)."'"; } return array( 'field'=>implode(',',$field), 'value'=>implode(',',$value), ); } //保存函数 public function add($data = array()) { $this->data = array_merge($this->data,$data); $data = $this->parseData(); $this->data = array(); $sql = "insert into $this->tableName({$data['field']}) values ({$data['value']})"; if($this->db->query($sql)) { // } return false; }}

数据库操作类 mysqldb.class.php

'localhost', 'port'=>'3306', 'user'=>'root', 'pwd'=>'mysql123', 'charset'=>'utf8', 'dbname'=>'test', ); //私有,数据库连接id private $link; //私有,数据库静态实例 private static $instance; /** * @param $params */ //合并配置 private function initAttr($params) { $this->db_config = array_merge($this->db_config,$params); } /** * */ //连接函数 private function connectServer() { $host = $this->db_config['host']; $port = $this->db_config['port']; $user = $this->db_config['user']; $pwd = $this->db_config['pwd']; $dbname = $this->db_config['dbname']; if ($link = mysqli_connect("$host:$port","$user","$pwd","$dbname")) { $this->link = $link; } else { die('数据库连接失败'.mysqli_error($this->link)); } } /** * */ //设置字符集 private function setCharset() { $sql = "set names {$this->db_config['charset']}"; $this->query($sql); //mysqli_query($this->link,$sql); } /** * @return bool */ //选择默认库 private function selectDefaultDb() { if($this->db_config['dbname'] == '') { return false; } $sql = "use {$this->db_config['dbname']}"; $this->query($sql); //mysqli_query($this->link,$sql); } /** * mysqldb constructor. * @param array $params * */ //构造函数 private function __construct($params = array()) { $this->initAttr($params); $this->connectServer(); $this->setCharset(); $this->selectDefaultDb(); } /** * @param $sql * @return bool|mysqli_result */ //查询 public function query($sql) { if($result = mysqli_query($this->link,$sql)) { return $result; } else { echo 'SQL执行失败:
'; echo '错误的SQL为'.$sql.'
'; echo '错误的代码为:',mysqli_errno($this->link),'
'; echo '错误的信息为:',mysqli_error($this->link),'
'; die(); } } /** * @param $sql * @return array|bool|null */ //取单行数据 public function fetchRow($sql) { if($result = $this->query($sql)) { $row = mysqli_fetch_array($result,MYSQLI_ASSOC); return $row; } else { return false; } } /** * @param $sql * @return array|bool */ //取多行数据 public function fetchAll($sql) { if($result = $this->query($sql)) { $rows = array(); while($row = mysqli_fetch_array($result,MYSQLI_ASSOC)) { $rows[] = $row; } mysqli_free_result($result); return $rows; } else { return false; } } /** * @param $data * @return string */ //防sql注入 public function escapeString($data) { return mysqli_real_escape_string($this->link,$data); } /** * @param array $params * @return mysqldb */ //静态方法,获取实例 public static function getInstance($params=array()) { if(!self::$instance instanceof self) { self::$instance = new self($params); } return self::$instance; } //复制 public function __clone() { die('禁止复制此类'); }}

过程:

index.php中,先引入init.php自动加载页面类,在调用model("emp_info")方法时,传入的是数据库中数据表的名称;

init.php中的model函数,在接收到调用时,先在传入的数据表名后加字符串“Model”,然后调用new,实例化emp_infoModel类;

为了能够自动加载类的代码,我们需要自己写一个加载函数my_autoload,此函数随意命名,传入的参数就是emp_infoModel,

由spl_autoload_register方法将加载函数my_autoload,注册至循环队列中,发生new class时,自动调用相应的页面代码进入;

emp_infoModel类继承自基类model,可以自动调用model父类中的方法,model类中使用mysqldb类的静态方法getInstance方法,获取数据库连接;

数据表emp_info:

CREATE TABLE `emp_info`  (  `emp_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,  `emp_name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,  `emp_dept` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,  `date_birth` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0),  `date_entry` timestamp(0) NOT NULL,  PRIMARY KEY (`emp_id`) USING BTREE) INSERT INTO `emp_info` VALUES (1, '张三', '市场部', '1980-05-01 00:00:00', '2020-01-10 00:00:00');INSERT INTO `emp_info` VALUES (2, '李四', '人资部', '1980-05-01 00:00:00', '2020-01-10 00:00:00');INSERT INTO `emp_info` VALUES (3, '王五', '公关部', '1980-05-01 00:00:00', '2020-01-10 00:00:00');INSERT INTO `emp_info` VALUES (4, '麻六', '销售部', '1980-05-01 00:00:00', '2020-01-10 00:00:00');INSERT INTO `emp_info` VALUES (5, '小兰', '人事部', '1989-04-05 00:00:00', '2015-01-04 00:00:00');INSERT INTO `emp_info` VALUES (6, '小新', '广告部', '1993-08-19 00:00:00', '2016-02-24 00:00:00');INSERT INTO `emp_info` VALUES (7, '小白', '财务部', '1991-10-05 00:00:00', '2017-08-14 00:00:00');INSERT INTO `emp_info` VALUES (8, '小智', '运维部', '1978-11-25 00:00:00', '2000-03-19 00:00:00');INSERT INTO `emp_info` VALUES (49, 'x', 'd', '2020-09-01 00:00:00', '2020-09-02 00:00:00');

 

 

上一篇:php教程--案例34(抽象类)
下一篇:php教程--案例32(类库自动加载)

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年04月08日 15时15分21秒