codeigniter数据库配置以编程方式形成用户输入

时间:2011-08-25 08:28:06

标签: database codeigniter configuration

任何人都可以帮助我吗?

如何以编程方式配置CI数据库设置?我在OSCommerce,Joomla,Wordpress等其他系统中看到了这一点。

用户需要提交包含数据库信息的表单。

4 个答案:

答案 0 :(得分:2)

我找到了两个解决方案,尽管我还没有测试过。

有许多基于Codeigniter框架的项目都有某种安装程序。就像“Repox”写的那样,你可以在MojoMotor中找到它,有一个核心/ Config.php扩展类来处理这个特定的任务,Expression Engine也有这个。可悲的是,这些都是商业许可证,不能使用。

使用此类解决方案的一个免费应用程序是Ionize CMS。

看一下这堂课:https://github.com/ionize/ionize/blob/master/install/class/Config.php

第二个是名为“文件”的火花。您可以在此处找到它:http://getsparks.org/packages/files/versions/HEAD/show

明显的限制是它重写了配置文件。

有人甚至在“codeigniter github issue 1058”中指出了这一点(google指的是链接)但遗憾的是开发人员决定关闭它。

我个人不明白为什么这个功能没有在框架中实现,它不仅可以用于在安装时编辑配置文件,而且还可以在控制面板中使用。

答案 1 :(得分:1)

由于有no automated CI installer类似于Joomla,Wordpress等,这是不可能的。所以,如果你需要这样的机会,你必须自己创建这样的安装程序。如果您这样做,请不要忘记与社区分享。

答案 2 :(得分:0)

这实际上是一个非常复杂的过程。

基于CI的

MojoMotor有一个安装脚本,可以添加application/config/database.php,这意味着它并非不可能。

MM的许可协议禁止我发布实际的安装脚本,但您应该能够创建有效的内容。

否则,想象一下这样的事情:

    // Data from user input
    $db_config['hostname'] = $this->input->post('db_host');
    $db_config['username'] = $this->input->post('db_user');
    $db_config['password'] = $this->input->post('db_password');
    $db_config['database'] = $this->input->post('db_name');
    $db_config['dbdriver'] = $this->db_driver;
    $db_config['dbprefix'] = $this->db_prefix;
    $db_config['pconnect'] = ($this->input->post('pconnect')) ? TRUE : FALSE;

    $this->CI =& get_instance();
    $this->CI->load->helper('file');

    $prototype = array(
                        'hostname'  => 'localhost',
                        'username'  => '',
                        'password'  => '',
                        'database'  => '',
                        'dbdriver'  => 'mysql',
                        'dbprefix'  => 'mojo_',
                        'pconnect'  => TRUE,
                        'db_debug'  => FALSE,
                        'cache_on'  => FALSE,
                        'cachedir'  => '',
                        'char_set'  => 'utf8',
                        'dbcollat'  => 'utf8_general_ci'
                    );

    // Now we read the file data as a string
    $config_file = read_file(APPPATH.'config/database'.EXT);

    // Dollar signs seem to create a problem with our preg_replace
    // so we'll temporarily swap them out
    $config_file = str_replace('$', '@s@', $config_file);

    // Cycle through the newconfig array and swap out the data
    if (count($dbconfig) > 0)
    {
        foreach ($dbconfig as $key => $val)
        {
            if ($val === 'y')
            {
                $val = TRUE;
            }
            elseif ($val == 'n')
            {
                $val = FALSE;
            }

            if (is_bool($val))
            {
                $val = ($val == TRUE) ? 'TRUE' : 'FALSE';
            }
            else
            {
                $val = '\''.$val.'\'';
            }

            $val .= ';';

            // Update the value
            $config_file = preg_replace("#(\@s\@db\[(['\"])".$active_group."\\2\]\[(['\"])".$key."\\3\]\s*=\s*).*?;#", "\\1$val", $config_file);
        }
    }

    // Put the dollar signs back
    $config_file = str_replace('@s@', '$', $config_file);

    // Just to make sure we don't have any unwanted whitespace
    $config_file = trim($config_file);

    // Write the file
    $fp = fopen($this->database_path, FOPEN_WRITE_CREATE_DESTRUCTIVE);

    flock($fp, LOCK_EX);
    fwrite($fp, $config_file, strlen($config_file));
    flock($fp, LOCK_UN);
    fclose($fp);

我没有对此进行测试,但我正在尝试实现与我自己的项目类似的东西。

我希望这可以让你更近一点。

答案 3 :(得分:0)

这种方法应该没问题。您需要做的就是避免在autoload.php文件中自动加载DB库,因为每次尝试加载页面时都会抛出错误。

$autoload['libraries'] = array(<strike>'database',</strike> 'form_validation', 'cart','session');

然后你可以拥有一个MY_Controller,其中包含:

function __construct()
{
    $this->load->database();
}

然后,您可以将此扩展到需要数据库访问的所有控制器,确保排除运行安装程序的控制器。