任何人都可以帮助我吗?
如何以编程方式配置CI数据库设置?我在OSCommerce,Joomla,Wordpress等其他系统中看到了这一点。
用户需要提交包含数据库信息的表单。
答案 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();
}
然后,您可以将此扩展到需要数据库访问的所有控制器,确保排除运行安装程序的控制器。