V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
RYAN0UP
V2EX  ›  问与答

网站后台设置选项储存在数据库的方案?

  •  
  •   RYAN0UP · 2017-12-21 22:33:22 +08:00 · 1718 次点击
    这是一个创建于 2289 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我在做一个学习项目的时候,碰到了一个困难,就是后台设置选项如何存储在数据库中,毕竟设置项那么多。

    比如网站标题,seo 关键字,seo 描述,什么的....

    看到很多网站的 option 表是以 key,value 的形式存储的。

    但是试了很久都不知道怎么把所有设置选项列在表单中,而且完成批量修改。

    对了,我用的框架是 SpringMVC,谢谢大家了。

    4 条回复    2017-12-22 07:12:47 +08:00
    whatsmyip
        1
    whatsmyip  
       2017-12-21 23:19:12 +08:00
    你自己已经回答了。key, value 对

    因为数据量不多,加上每个页面基本都需要,所以每次操作都是同时取出
    select key, value from option;

    修改的话只能是一个一个修改了。

    之前写过的代码

    ```
    class OptionManager
    {
    /*
    * do add option
    */
    public static function addOption($option)
    {
    $key = $option->get('key');
    $value = $option->get('value');
    $remark = $option->get('remark');
    $key_values = array( 'key' => '?', 'value' => '?', 'remark' => '?' );
    $builder = new SQLBuilder();
    $builder->insert('cr_option', $key_values);
    $sql = $builder->build();
    $params = array( $key, $value, $remark);
    $count = (new MysqlPDO())->execute($sql, $params);
    return $count==1;
    }
    /*
    */
    public static function getOptions($rule)
    {
    $selected_rows = array('key', 'value', 'remark');
    $where_arr = array();
    $builder = new SQLBuilder();
    $builder->select('cr_option', $selected_rows);
    $builder->where($where_arr);
    $sql = $builder->build();
    $params = array();
    $options = (new MysqlPDO())->executeQuery($sql, $params);
    if($rule->get('result_form')=='assoc'){
    $options = self::list2kv($options);
    }
    return $options;
    }
    /*
    * convert list to key-value
    */
    private static function list2kv($options)
    {
    $options_kv = array();
    foreach($options as $option){
    $options_kv[$option['key']] = $option['value'];
    }
    return $options_kv;
    }
    /*
    */
    public static function removeOption($option)
    {
    $key = $option->get('key');
    $where_arr = array('key' => '?');
    $builder = new SQLBuilder();
    $builder->delete('cr_option');
    $builder->where($where_arr);
    $sql = $builder->build();
    $params = array( $key );
    $count = (new MysqlPDO())->execute($sql, $params);
    return $count==1;
    }
    /*
    */
    public function updateOption($option)
    {
    $key = $option->get('key');
    $value = $option->get('value');
    $remark = $option->get('remark');
    $new_key_values = array( 'value' => '?', 'remark' => '?' );
    $where_arr = array( 'key'=>'?' );
    $builder = new SQLBuilder();
    $builder->update('cr_option', $new_key_values);
    $builder->where($where_arr);
    $sql = $builder->build();
    $params = array($value, $remark, $key);
    $cnt = (new MysqlPDO())->execute($sql, $params);
    return $cnt==1;
    }
    }
    ```
    RYAN0UP
        2
    RYAN0UP  
    OP
       2017-12-21 23:25:50 +08:00 via Android
    @whatsmyip 先谢谢你的回答,不过这 php 我看着有点蒙啊,我暂时已经把所有设置选项加载到表单里了,用的是 Map<key,value>,下一步我再想想怎么批量修改,谢谢啦!
    ihuotui
        3
    ihuotui  
       2017-12-22 00:41:57 +08:00 via iPhone
    俗称 eav 设计
    lhx2008
        4
    lhx2008  
       2017-12-22 07:12:47 +08:00 via Android
    用提交 list 的方法就行,后台再从数据库读出来,再把新的 value 塞进去,更新
    或者用 ajax,改一个提交一个
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3797 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 10:21 · PVG 18:21 · LAX 03:21 · JFK 06:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.