zoukankan      html  css  js  c++  java
  • 构建自己的PHP框架--实现Model类(2)

    在上一篇博客中我们简单实现了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

  • 相关阅读:
    android中kl布局文件加载失败解决办法
    android系统输入按键流程
    linux键值转android键值配置文件
    linux键值到Android键值的转换与自定义
    linux中ioctl的应用与说明
    zabbix邮件告警
    linux 双网关双IP设置
    随笔
    记录一次事故
    python解析.yml/.yaml文件--pyyaml模块(第三方)
  • 原文地址:https://www.cnblogs.com/CraryPrimitiveMan/p/5227244.html
Copyright © 2011-2022 走看看