管理存储在数据库

时间:2017-02-07 13:45:32

标签: php database class settings

我有一些设置存储在mysql数据库表"设置"用于php web应用程序。该表有两列,只需" option_name"和" option_value"。我已经构建了一个类来检索或更改这些设置(通常通过复选框进行更改),我想知道它是否可以被视为一种好方法:

class Settings {
    public function __construct(PDO $db_connection) {
        $this->db_connection = $db_connection;
    }

    public function getValue($setting_name) {
        $sql = "SELECT option_value FROM settings WHERE option_name = ?";
        $stmt = $this->db_connection->prepare($sql);
        $stmt->execute([$setting_name]);
        return $stmt->fetchColumn();
    }

    public function setValue($setting_name, $value) {
        // Some code here to sanitize value
        if (!is_bool($value)) {
            throw new InvalidArgumentException("value must be boolean");
        }
        $sql = "UPDATE settings SET option_value = ? WHERE option_name = ?";
        $stmt = $this->db_connection->prepare($sql);
        return $stmt->execute([$value, $option_name)];
    }
}

这种方式每次使用方法时,都会向数据库发送查询。这个班级也只是一个包装工具'对于查询。这被认为是管理设置的好方法吗?我很乐意听到一些建议

1 个答案:

答案 0 :(得分:1)

我使用的是这种解决方案,它在某些网络应用中对我很有用。

根据我的经验,当你开始在其中设置越来越多的设置时,对该表的查询数量和执行时间会增加,所以我通常为此目的制作某种内存缓存(如果框架没有这样做)为了你)。即使有人会说索引 option_name 会使查询无关紧要,但在分析方面,可以看到它们的影响。

该缓存在启动时填充,并在 setValue (和插入)上刷新,因此不需要在 getValue 上发出选择。唯一的问题是,如果您通过DB(或迁移脚本)手动更改值,则需要刷新缓存。单个应用程序的多个节点使这更加麻烦,但它可以完成。

即便如此,如果你的应用程序需要这种动态配置更改,或者你在应用程序的多个实例上有多个设置我会说它。您具有运行时灵活性,数据库转储将捕获这些设置,因此您不必从某些外部文件中提取它。

P.S。很抱歉,这是我在StackOverflow上的第一个答案。玩得开心!