【问题标题】:Reading CodeIgniter config values from database instead of config file从数据库而不是配置文件中读取 CodeIgniter 配置值
【发布时间】:2012-05-20 14:39:39
【问题描述】:

您可能知道,当您使用 CI 创建一个新项目时,您必须在 config/config.php 中手动输入基本 url、加密密钥。我正在努力克服这个问题,因此正在寻找一种方法来读取这些值从数据库中 - 为客户进行安装和设置时间整体减少很多。

客户无法编辑 PHP 文件的变量,但很可能在一些指导下能够输入基本 url 并让系统自动填写加密密钥。

有没有办法做到这一点?

【问题讨论】:

  • Zar,从第 2 版开始,您完全不必在配置文件中输入基本 URL。此外,您无法在没有加密密钥的情况下启动会话,因此您不妨使用不需要会话/登录的安装脚本将该值写入文件,这意味着您可能不需要从数据库。

标签: database codeigniter config


【解决方案1】:

当然!添加hook - post_controller 并通过该文件设置这些配置值。

config/hooks.php

$hook['pre_controller'][] = array(  'class'    => 'MyOtherClass',
                                    'function' => 'MyOtherfunction',
                                    'filename' => 'Myotherclass.php',
                                    'filepath' => 'hooks');

hooks/myotherclass.php

<?

class MyOtherClass {

    function MyOtherfunction() {

        $CI =& get_instance();

        $row = $CI->db->get_where('configs', array('site_id' => 1))->row();

        $CI->config->set_item('base_url', $row->base_url);

    }

}

基本上,您在将这些值用于任何控制器或类似设备之前设置这些值。

【讨论】:

  • 我想缓存这些值会提高性能吗?谢谢!
  • 好吧,但它基本上只是在每个页面加载时运行的唯一简单查询。我怀疑您是否会达到值得缓存的地步,因为站点的数量可能不会扩展到数百万? :) 将获得的结果保存为全局值是值得的,因此您可以将其重复用于您网站的其他部分。
  • @Zar:您应该在用户保存这些值后立即将它们直接写入文件/缓存。你真的根本不需要数据库。
【解决方案2】:

目前Codeigniter 3.1.7 pre_controller 不起作用,因为它会在初始化 $CI =&amp; get_instance(); 时返回 NULL

解决这个问题:

将挂钩点从 pre_controller 更改为 post_controller_constructor

修改来源:

config/hooks.php

$hook['post_controller_constructor'][] = array(  'class'    => 'MyOtherClass',
                                'function' => 'MyOtherfunction',
                                'filename' => 'Myotherclass.php',
                                'filepath' => 'hooks');

hooks/myotherclass.php

<?

class MyOtherClass {

    function MyOtherfunction() {

        $CI =& get_instance();

        $row = $CI->db->get_where('configs', array('site_id' => 1))->row();

        $CI->config->set_item('base_url', $row->base_url);

    }

}

现在它可以工作了!

【讨论】:

  • 如果您想在控制器中使用这些配置设置,post controller 是无用的。因为从你的方法中它不会设置配置,直到它完成执行控制器代码。
【解决方案3】:
 class name extends CI_Controller {
    public $DB1;
    public $MSSQL;
    public function __construct()
     {
    parent::__construct();
        $userid = $this->session->userdata('userids');
          $this->load->model('kubix');
          $result = $this->kubix->databaseconncetion($userid);
        foreach ($result as $deta)
          {

      $this->MSSQL=$db['MSSQL'] = array(
      'hostname' => $deta["Db_base_ip"],
      'username' => $deta["Db_username"],
      'password' => $deta["db_password"],
      'database' => $deta["Db_base_name"],
      'dbdriver' => 'sqlsrv',
      'dbprefix' => '',
      'pconnect' => FALSE,
      'db_debug' => (ENVIRONMENT !== 'production'),
      'cache_on' => FALSE,
      'cachedir' => '',
      'char_set' => 'utf8',
      'dbcollat' => 'utf8_general_ci',
      'swap_pre' => '',
      'encrypt' => FALSE,
      'compress' => FALSE,
      'stricton' => FALSE,
      'failover' => array(),
      'save_queries' => TRUE);
      $this->DB1 = $this->load->database($this->MSSQL, TRUE);
    $sql = "SELECT  TOP 1 * FROM AccountsFinancialYearMaster where Active=1 ";
        $query = $this->DB1->query( $sql);
        $result= $query->result_array();
RETURN $result;     

【讨论】:

    猜你喜欢
    • 2021-09-30
    • 2020-10-18
    • 2018-04-06
    • 1970-01-01
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    相关资源
    最近更新 更多