最新要闻
- 女生从俄罗斯花2分钟回国吃麻辣烫 挑战全网最短留学距离:网友感慨真近
- 环球观点:文心一言升级版!百度发布企业级大模型服务平台“文心千帆”
- 当前速讯:太危险!女子驾驶保时捷玩具车上机动车道吓坏路人:自称为了好玩
- 承认造假丑闻!百年日企川崎重工形象崩塌:鞠躬道歉
- 资讯推荐:男子跑滴滴1单挣了3148元:光等待费就两千多元
- 每日视点!便宜香港主机推荐
- 环球速递!秒变大屏平板!三星将推新款折叠手机:双铰链、三折叠
- 天天报道:专家评中国为何没跟上ChatGPT浪潮:0-1的事情没人做
- 电动车价格还得降 宁德钠离子电池今年量产:高寒地区突出优势
- 广汽埃安新车慢充失灵 车主:4S店给补偿 但协议他不想签
- 天天热推荐:日本声优网络发文吐槽外送被打翻 网友:小心隐私
- 普京称嫉妒的人才说俄依赖中国 欧洲应该想想自己
- 甲醛滤芯永不更换!米家全效空气净化器评测:不仅除尘、还能杀死H1N1病毒
- 顺丰开通贵州茅台首条全货机航线 10余吨酒、茶特产首飞成功
- 每日资讯:飞机航班为何不卖站票?大V科普:并非航空公司良心
- 罕见5风扇设计!铭瑄RTX 4070 Ti MGG OC12G显卡图赏
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
新动态:CodeIgnitor 3.0.x 之 db 类实现机制
Codeignitor 的 db 类的说明,锻炼一下文字表达能力
一般的使用场景:
(资料图片)
class home extends Base_Controller{ public function test() { $this->load->model("my/User_model"); }}class User_model extend CI_Model { public function __construct() { $this->db = $this->load->database("my", TRUE); }}class CI_Model{ public function __get($key) { return get_instance()->$key; }}
在 controller 中加载 model 类
在 model 中加载 db,获得 db 对象,可以用来查询 sql
- model 中的 load 对象是从 controller 中获取的
- db 对象的类型是
CI_DB_mysqli_driver
,这是 load 对象根据默认配置创建的 mysql 数据库查询对象 - 默认配置文件在
/config/database.php
,按照框架约定配置好数据库参数
database.php 内容如下:
$active_group = "default"; $query_builder = TRUE;$db["default"] = array( $db["myche"] = array( "dsn" => "", "hostname" => $_SERVER["DB_MY_HOST"], "username" => $_SERVER["DB_MY_USER"], "password" => $_SERVER["DB_MY_PASS"], "database" => $_SERVER["DB_MY_NAME"], "dbdriver" => "mysqli", "dbprefix" => "", "pconnect" => FALSE, "db_debug" => (ENVIRONMENT !== "production"), "cache_on" => FALSE, "cachedir" => "", "char_set" => "utf8", "dbcollat" => "utf8_general_ci", "swap_pre" => "", "encrypt" => FALSE, "compress" => FALSE, "stricton" => FALSE, "failover" => array(), "save_queries" => (ENVIRONMENT !== "production") ););
CI_DB_mysqli_driver
继承自CI_DB
,CI_DB
类使用了一种奇怪的方式实现的,这个类是在一个叫做DB
的函数内声明的,根据$query_builder=true
的配置来决定声明CI_DB
的父类是CI_DB_driver
还是CI_DB_query_builder
,两者的区别就是后者继承自前者并在前者的基础上实现了常用语句的链式调用方法。按照声明处注释所说,CI_DB
类可以理解为CI_DB_driver
和CI_DB_query_builder
的别名。CI_DB_mysqli_driver
的创建过程:- 在 load 对象的 database 方法中调用 DB 函数
- 在 DB 函数中
- 声明
CI_DB
,根据$query_builder=true
的配置来决定CI_DB
的父类是CI_DB_driver
还是CI_DB_query_builder
。 - 根据
dbdriver
配置加载数据库驱动类文件,并实例化CI_DB_mysqli_driver
,并返回此对象。
- 声明
DB 函数的实现
function &DB($params = "", $query_builder_override = NULL) { require_once(BASEPATH."database/DB_driver.php"); if ( ! isset($query_builder) OR $query_builder === TRUE){require_once(BASEPATH."database/DB_query_builder.php");if ( ! class_exists("CI_DB", FALSE)){/** * CI_DB * * Acts as an alias for both CI_DB_driver and CI_DB_query_builder. * * @seeCI_DB_query_builder * @seeCI_DB_driver */class CI_DB extends CI_DB_query_builder { }}}elseif ( ! class_exists("CI_DB", FALSE)){class CI_DB extends CI_DB_driver { }} // Load the DB driver $driver_file = BASEPATH."database/drivers/".$params["dbdriver"]."/".$params["dbdriver"]."_driver.php"; require_once($driver_file); // Instantiate the DB adapter$driver = "CI_DB_".$params["dbdriver"]."_driver";$DB = new $driver($params); return $DB;}
CI_DB_mysqli_driver
最终是继承自CI_DB_driver
这个抽象类。CI_DB_driver
定义了数据库驱动类需要实现的一些通用方法,具体的驱动类比如CI_DB_mysqli_driver
则实现了这些方法。CI_DB_driver
关键方法定义
abstract class CI_DB_driver { // db 连接 function db_connect() {} // db 长连接 function db_pconnect() {} // 设置连接字符集编码 function _db_set_charset() {} // 选择数据库 function db_select() {} // 开始事务 function _trans_begin() {} // 回滚事务 function _trans_rollback() {} // 提交事务 function _trans_commit() {} // 执行查询 function _execute($sql) {}}
上面的描述总结为下图:
CI_DB_mysqli_driver
的部分实现
class CI_DB_mysqli_driver extends CI_DB { // 连接数据库 public function db_connect($persistent = FALSE) { // Do we have a socket path?if ($this->hostname[0] === "/"){$hostname = NULL;$port = NULL;$socket = $this->hostname;}else{// Persistent connection support was added in PHP 5.3.0$hostname = ($persistent === TRUE && is_php("5.3"))? "p:".$this->hostname : $this->hostname;$port = empty($this->port) ? NULL : $this->port;$socket = NULL;}$client_flags = ($this->compress === TRUE) ? MYSQLI_CLIENT_COMPRESS : 0;$this->_mysqli = mysqli_init();$this->_mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 10); // ... 此处省略一些设置的代码 if ($this->_mysqli->real_connect($hostname, $this->username, $this->password, $this->database, $port, $socket, $client_flags)){// Prior to version 5.7.3, MySQL silently downgrades to an unencrypted connection if SSL setup failsif (($client_flags & MYSQLI_CLIENT_SSL)&& version_compare($this->_mysqli->client_info, "5.7.3", "<=")&& empty($this->_mysqli->query("SHOW STATUS LIKE "ssl_cipher"")->fetch_object()->Value)){$this->_mysqli->close();$message = "MySQLi was configured for an SSL connection, but got an unencrypted connection instead!";log_message("error", $message);return ($this->db->db_debug) ? $this->db->display_error($message, "", TRUE) : FALSE;}return $this->_mysqli;}return FALSE; }}
这里
mysqli_init
函数是 php 扩展自带的函数,返回的是 php 的 resource 类型的对象,即 mysqli 对象,这个对象可以用来查询数据库。再看下
CI_DB_query_builder
的部分实现,主要的功能是基于 driver 的方法,实现很多人性化的、可以链式调用的方法。
abstract class CI_DB_query_builder extends CI_DB_driver{ public function limit($value, $offset = 0){is_null($value) OR $this->qb_limit = (int) $value;empty($offset) OR $this->qb_offset = (int) $offset;return $this;} public function offset($offset){empty($offset) OR $this->qb_offset = (int) $offset;return $this;} public function get($table = "", $limit = NULL, $offset = NULL){if ($table !== ""){$this->_track_aliases($table);$this->from($table);}if ( ! empty($limit)){$this->limit($limit, $offset);}$result = $this->query($this->_compile_select());$this->_reset_select();return $result;} function select() {} function distinct() {} function join() {} function from() {} function where() {} function or_where() {} function like() {} function group_by() {} function having() {} function update() {} // ...}
关键词:
-
新动态:CodeIgnitor 3.0.x 之 db 类实现机制
Codeignitor的db类的说明,锻炼一下文字表达能力一般的使用场景:classhomeextendsBase_Controller{publicfunctiontest(
来源: -
世界观速讯丨【原型设计工具】上海道宁为您提供Justinmind,助力您在几分钟内形成原型,并现场测试,无需编写任何代码
Justinmind是用于Web和应用程序的原型制作工具,在几分钟内形成原型,并在现场进行测试,无需编写任何代码
来源: 新动态:CodeIgnitor 3.0.x 之 db 类实现机制
第一次博客
环球热点评!小皮Windows web面板漏洞详解
世界观速讯丨【原型设计工具】上海道宁为您提供Justinmind,助力您在几分钟内形成原型,并现场测试,无需编写任何代码
女生从俄罗斯花2分钟回国吃麻辣烫 挑战全网最短留学距离:网友感慨真近
环球观点:文心一言升级版!百度发布企业级大模型服务平台“文心千帆”
当前速讯:太危险!女子驾驶保时捷玩具车上机动车道吓坏路人:自称为了好玩
承认造假丑闻!百年日企川崎重工形象崩塌:鞠躬道歉
资讯推荐:男子跑滴滴1单挣了3148元:光等待费就两千多元
环球要闻:从GPT-4、文心一言再到Copilot,AIGC卷出新赛道?
即时:【必须收藏】别再乱找TiDB 集群部署教程了,这篇保姆级教程来帮你!!| 博学谷狂野架构师
当前关注:C#多态性学习,虚方法、抽象方法、接口等用法举例
python中index()、find()方法
每日视点!便宜香港主机推荐
环球速递!秒变大屏平板!三星将推新款折叠手机:双铰链、三折叠
天天报道:专家评中国为何没跟上ChatGPT浪潮:0-1的事情没人做
电动车价格还得降 宁德钠离子电池今年量产:高寒地区突出优势
广汽埃安新车慢充失灵 车主:4S店给补偿 但协议他不想签
天天热推荐:日本声优网络发文吐槽外送被打翻 网友:小心隐私
天天精选!批量上传iOS应用程序截图的实用技巧
天天热头条丨OPPO发布新机|无感验证护航“黄牛党”退退退!
环球滚动:易基因:肠道菌群:早产儿出生后不同时间点肠道微生物定植的动态变化|项目文章
快播:Qt 博客汇总
天天热推荐:图片识别文字(批量图片文字查找分类)
普京称嫉妒的人才说俄依赖中国 欧洲应该想想自己
科创板收盘播报:科创50指数探底回升跌0.33% 软件服务类个股表现强势
甲醛滤芯永不更换!米家全效空气净化器评测:不仅除尘、还能杀死H1N1病毒
顺丰开通贵州茅台首条全货机航线 10余吨酒、茶特产首飞成功
每日资讯:飞机航班为何不卖站票?大V科普:并非航空公司良心
罕见5风扇设计!铭瑄RTX 4070 Ti MGG OC12G显卡图赏
三电升级、寿命翻倍!绿源液冷2.0系统升级上线:能骑十年
Transformer详解
全球速递!解决google翻译出错问题
世界通讯!【高端访谈】“开放的中国大市场蕴藏更多新机遇”——访马士基首席执行官柯文胜
以铜之名尽显千年风流
全球信息:打造中国ChatGPT 搜狗输入法之父马占凯加入王慧文AI团队
独一无二木星纹理见过么?一加11推出木星岩限定版:100%手工挑选
环球快看:曾被宣布“野外灭绝” 长江鲟时隔23年首次自然产卵
当前速读:ubuntu 使用vsftpd搭建FTP服务器
全球热议:6.824-lab2-Raft简述
环球滚动:Template模板类
全球讯息:【Visual Leak Detector】配置项 VLD
【速看料】火山引擎 DataTester:构建增长闭环,3-5 人即可搭建企业增长团队
【新要闻】曾因配料“双标”遭网友痛批 好丽友漏税22万被罚12万
全球时讯:空姐为美容注射玻尿酸:打进血管 险丧命
三星W799哪年上市的?三星W799可以安装微信吗?
诺基亚920还能用吗?诺基亚920手机参数
英雄联盟手游大师多少颗星上宗师?英雄联盟几级可以组队匹配?
总线上的音频设备前是感叹号是什么原因?总线上的音频设备前是感叹号怎么处理?
华为合约机是什么意思?华为合约机和官方标配区别有哪些?
C#遍历指定文件夹中所有文件的3种方法
天天热议:Sed 备忘清单_开发速查表分享
史上最严奶粉新国标实施逾月 贝因美又一款二注奶粉上新 哪些信号值得关注?
热推荐:甘肃将为兰州牛肉拉面立法 网友:建议牛肉有重量标准
热点在线丨《原神》地位不保?开放世界游戏《鸣潮》实机画面公布
环球简讯:曹德旺:大学生去送外卖 和在学校没学到东西有关
任性钻“夹缝”被撞旋转1080° 司机甩锅:都怪后车开太快了
当前快播:判赔370万!中创新航回应不正当竞争案判决:未曾挖角宁德时代 将上诉
天天百事通!OpenIddict使用教程
流量分析入门
全球观速讯丨MySql随笔记基础
【高端访谈】强化城投债与量化领域主动管理 打造私募“固收+”独特策略——专访国恩资本董事总经理杨先哲
通讯!旃怎么读音(旃怎么读)
36年前电脑用上AI:IBM 5155运行ChatGPT是什么样?
环球看热讯:清晰度和功耗完美平衡!真我GT Neo5系列宣布告别1080P:普及1.5K屏
罕见!超级火流星划过北京夜空被拍下:彩色拖尾 爆裂闪光
每日快讯!《生化危机4:重制版》阿什莉模型展示:物理晃动效果很优秀
全球快看点丨车评人曝奔驰4S维修黑幕:一个迈巴赫大灯小20万 故意损坏夸大车损
即时:数据库系统原理之SQL与关系数据库基本操作
每日焦点!【解答】如何保障ETL过程的数据正确性。这个过程会产生哪些问题?
世界要闻:DHCP snooping
全球快播:SSH配置别名登录
天天快报!越来越没人买了?雷克萨斯国内销量出炉:同比爆降36%
女子给猴子喂食被掌掴 景区回应:含保险、打疫苗可理赔
全球看热讯:去年火遍全网!贵州“村BA”现场水泄不通:村草村花“蹦苗迪”
热资讯!最高等级!英国最大陆上油田漏油:已成立黄金指挥部
头条焦点:消息称百度文心一言云服务发布会取消:延期对外发布
焦点快看:2023年底产能破30GW!协鑫集成阜宁12GW组件项目开工 -->
Spring源码核心剖析
焦点热门:计算机解决高中离子浓度计算
最新资讯:微软或提高Win12升级门槛:SSD成为刚需
19.48万元起 国产豪华轿车红旗H6预售:双中置排气着实罕见
焦点速看:赵长江:腾势D9新增订单一天破500台!别克GL8危险了
【世界播资讯】只差价格了 Redmi新机爆料汇总 1999元起交个朋友?
环球动态:市场震荡分化 软件行业红利不断
【全球独家】你不知道的ubuntu DIY发行版
全球快消息!2022年度十大科学辟谣榜出炉:O型血更招蚊子是谣言、变电站很危险?
男子爬树看邓紫棋演唱会致手臂骨折 省1千花1万:网友直呼追星也要注意安全
华海诚科网上发行最终中签率为0.0363%
专家解读消费基础设施纳入公募REITs试点:推动消费扩容提质 并非简单为房企提供资产处置渠道
天天最新:主板注册制新股开启申购 投资者打新须适应新规则
今日观点!国际金融市场早知道:3月27日
速读:票房破3亿!新海城电影《铃芽之旅》拿下2023年引进片票房冠军
新一轮国内油价将于3月底调整:目前分析大概率下调
今日播报!头部车企打架尾部遭殃 恒驰汽车北京仅剩一家门店营业
读Java性能权威指南(第2版)笔记29_线程和同步性能下
【热闻】95后夫妻摆摊日入9千网友让查税慌了 本人回应:当日是偶然 但生意也不错
【环球新视野】ctf反序列化练题
全球新资讯:win32com操作word 第十五 Find接口的使用
院士:抗流感特效药“达菲”原料为八角茴香、附加值提升1100多倍