构建自己的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

你可能感兴趣的:(构建自己的PHP框架--实现Model类(2))