在上一篇博客中我们简单实现了findOne方法,但我们可以看到,还是有一些问题的,下面我们来修正一下这些问题。

首先是返回的数据中,数字被转换成了字符串。我们需要的是数字啊。。。

PDO中有属性可以支持,PDO::ATTR_STRINGIFY_FETCHES 和 PDO::ATTR_EMULATE_PREPARES 属性。

  • PDO::ATTR_STRINGIFY_FETCHES: 提取的时候将数值转换为字符串。 需要 bool 类型。
  • PDO::ATTR_EMULATE_PREPARES 启用或禁用预处理语句的模拟。 有些驱动不支持或有限度地支持本地预处理。使用此设置强制PDO总是模拟预处理语句(如果为 TRUE ),或试着使用本地预处理语句(如果为 FALSE)。如果驱动不能成功预处理当前查询,它将总是回到模拟预处理语句上。 需要 bool 类型。

将这两个参数设置为false,应该就可以使返回的数据中的数字保持数字格式了。

相关详情可查看PDO预定义常量和PDO::setAttribute

getDb方法修改为如下内容:

    public static function getDb(){if (empty(static::$pdo)) {$host = 'localhost';$database = 'sf';$username = 'jun';$password = 'jun';$options = [PDO::ATTR_EMULATE_PREPARES => false,PDO::ATTR_STRINGIFY_FETCHES => false];static::$pdo = new PDO("mysql:host=$host;dbname=$database", $username, $password, $options);static::$pdo->exec("set names 'utf8'");}return static::$pdo;}

但是修改完,之后你可能发现,根本不起作用,那究竟是什么原因呢?其实是你用的是老的驱动php5-mysql,你应该换成php5-mysqlnd。执行如下代码更换驱动(Ubuntu环境下):

# Remove the old driver
sudo apt-get remove php5-mysql
# Install the new driver
sudo apt-get install php5-mysqlnd

关于这个问题的详情可点击此处查看

然后之前的代码里还有一个问题,当findOne的参数为空时,会挂掉。所以需要对$condition做一下判空。修正完之后的代码如下:

    public static function findOne($condition = null){$sql = 'select * from ' . static::tableName();$params = [];// 判空if (!empty($condition)) {$sql .= ' where ';$params = array_values($condition);$keys = [];foreach ($condition as $key => $value) {array_push($keys, "$key = ?");}$sql .= implode(' and ', $keys);}$stmt = static::getDb()->prepare($sql);$rs = $stmt->execute($params);if ($rs) {$row = $stmt->fetch(PDO::FETCH_ASSOC);if (!empty($row)) {$model = new static();foreach ($row as $rowKey => $rowValue) {$model->$rowKey = $rowValue;}return $model;}}return null;}

好了,今天就先到这里。项目内容和博客内容也都会放到Github上,欢迎大家提建议。

code:https://github.com/CraryPrimitiveMan/simple-framework/tree/0.6

blog project:https://github.com/CraryPrimitiveMan/create-your-own-php-framework

转载于:https://www.cnblogs.com/CraryPrimitiveMan/p/5227244.html

构建自己的PHP框架--实现Model类(2)相关推荐

  1. tp框架之Model类与命名空间

    1.获取系统常量信息 public function shuchu(){var_dump(get_defined_constants()); }2.跨控制器或跨模块调用 function diaoyo ...

  2. 知识图谱实战应用9-基于neo4j的知识图谱框架设计与类模型构建

    大家好,我是微学AI,今天给大家介绍一下知识图谱实战应用9-基于neo4j的知识图谱框架设计与类模型构建.我将构建KnowledgeGraphs的类,用于操作Neo4j图数据库中的知识图谱数据.方便管 ...

  3. 如何构建Android MVVM 应用框架

    本文转载自[http://tech.meituan.com/android_mvvm.htmlhmsr=toutiao.io&utm_medium=toutiao.io&utm_sou ...

  4. 设计php框架_利用 Composer 一步一步构建自己的 PHP 框架(三)——设计 MVC

    利用 Composer 一步一步构建自己的 PHP 框架(三)--设计 MVC 2014-10-14 / 阅读数:50438 / 分类: PHP 终于可以 "一次编写,到处发布" ...

  5. composer mysql_利用 Composer 一步一步构建自己的 PHP 框架(四)——使用 ORM

    利用 Composer 一步一步构建自己的 PHP 框架(四)--使用 ORM 2014-10-16 / 阅读数:65457 / 分类: PHP 回顾 经过前三篇文章 基础准备 . 构建路由 和 设计 ...

  6. Vue.js构建用户界面的渐进式框架(前端学习笔记1.0)

    文章目录 前言 一.Vue是什么? 二.前端核心分析 1.1.概述 1.2.前端三要素 1.3.结构层(HTML) 1.4.表现层(CSS) 1.5.行为层(JavaScript) 二.前端发展史 2 ...

  7. 构建Java并发模型框架

    2002 年 2 月 22 日 Java的多线程特性为构建高性能的应用提供了极大的方便,但是也带来了不少的麻烦.线程间同步.数据一致性等烦琐的问题需要细心的考虑,一不小心就会出现一些微妙的,难以调试的 ...

  8. Mybatis Plus 2 升到 Mybatis Plus 3 时,实体继承的Model类的的相关问题...

    一.更新依赖关系 当你把依赖从 <dependency><groupId>com.baomidou</groupId><artifactId>mybat ...

  9. tf.Keras.Model类总结

    文章目录 tf.keras.Model类 1. 创建一个tf.keras.Model类实例的方法 1.1 通过指定输入输出进行实例化 1.2 通过继承Model类进行实例化 2. tf.Keras.M ...

  10. 【文献翻译】构建网络安全知识库的框架-A Framework to Construct Knowledge Base for Cyber Security

    摘要--现在有一些针对不同方面的独立网络安全知识库.在互联网上,也有很多网络安全相关的内容以文字的形式存在.融合这些网络安全相关信息可以是一项有意义的工作.在本文中,我们提出了一个框架来整合现有的网络 ...

最新文章

  1. java final修饰符_java final修饰符详解,final修饰方法
  2. python进行linux编程,Python之函数进阶
  3. python 自定义函数和循环_Python循环语句——对for循环和while循环应用自定义函数公式的实践,套用,练习...
  4. Java多线程--list.parallelStream().forEach()使用实例
  5. PAT1069. The Black Hole of Numbers
  6. NYOJ 99单词拼接(有向图的欧拉(回)路)
  7. 【BZOJ1196】公路修建问题,二分+最小生成树
  8. Httpclient远程调用WebService示例
  9. cookie的封装删除修改
  10. HTML5 之 FileReader(图片上传)
  11. 教你在网吧“移”电影
  12. 开源项目工时系统_工时统计系统 - 服务端
  13. thinkpad x60安装WINDOWS2003SERVER
  14. Allegro模块镜像详细操作教程
  15. 转载:Fiddler 教程
  16. 2021年中国企业风险投资发展现状及未来发展趋势分析[图]
  17. 使用AutoJS实现2019天猫双11喵币自动领取
  18. PTC System Monitor
  19. Hexo博客使用腾讯云CDN加速及优化
  20. u盘插到电脑计算机里没有反应,U盘插在Windows7电脑上没反应怎么办?

热门文章

  1. js对于radio的处理
  2. Python3中一维数组和二维数组的输入
  3. MySql 安装 Win python3
  4. 综述:关系抽取,挑战与机遇并存!
  5. 真实场景下如何解决类别不平衡问题
  6. 《机器学习实战》读书笔记——Logistic回归
  7. 区块链的本质是什么?写给区块链的未来十年
  8. Windows驱动开发入门——从这里出发
  9. 数据苦库中的几种规范
  10. SaaS基础架构—云计算