构建和谐的PHP框架–完结Model类(2)

在上一篇博客中大家简要落成了findOne方法,但大家得以看来,依旧有一些题指标,上边大家来核对一下那几个难点。

第③是回去的数码中,数字被转换到了字符串。大家须求的是数字啊。。。

PDO中有品质能够支持,PDO::ATT奥迪Q7_STRINGIFY_FETCHES 和
PDO::ATTR_EMULATE_PREPARES 属性。

  • PDO::ATTR_STRINGIFY_FETCHES: 提取的时候将数值转换为字符串。 须要bool 类型。
  • PDO::ATTR_PHP,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

有关这一个题指标详情可点击这里查看

接下来从前的代码里还有3个难点,当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

相关文章