构建和谐的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

相关文章