diff --git a/phpBB/adm/style/install_install.html b/phpBB/adm/style/install_install.html index 1ba18adc5c..f83e73d143 100755 --- a/phpBB/adm/style/install_install.html +++ b/phpBB/adm/style/install_install.html @@ -21,6 +21,7 @@ + diff --git a/phpBB/install/install.php b/phpBB/install/install.php index 03b85ef0f4..eb02a0ec6b 100644 --- a/phpBB/install/install.php +++ b/phpBB/install/install.php @@ -753,9 +753,9 @@ if ($stage == 1) : - +
diff --git a/phpBB/install/install_install.php b/phpBB/install/install_install.php index 402e7d4c34..b09406ef2b 100755 --- a/phpBB/install/install_install.php +++ b/phpBB/install/install_install.php @@ -19,7 +19,7 @@ if (!empty($setmodules)) 'module_filename' => substr(basename(__FILE__), 0, -strlen($phpEx)-1), 'module_order' => 10, 'module_subs' => '', - 'module_stages' => array('INTRO', 'REQUIREMENTS', 'DATABASE', 'CONFIG_FILE', 'ADVANCED', 'FINAL'), + 'module_stages' => array('INTRO', 'REQUIREMENTS', 'DATABASE', 'ADMINISTRATOR', 'CONFIG_FILE', 'ADVANCED', 'FINAL'), 'module_reqs' => '' ); @@ -344,95 +344,129 @@ class install_install extends module $this->page_title = $lang['STAGE_DATABASE']; - // Has the user opted to test the connection? -/* if (isset($_POST['testdb'])) - { - // If the module for the selected database isn't loaded, let's try and load it now - if (!@extension_loaded($available_dbms[$dbms]['MODULE'])) - { - if (!$this->can_load_dll($available_dbms[$dbms]['MODULE'])) - { - $error['db'][] = $lang['INST_ERR_NO_DB'];; - } - } - - $this->connect_check_db(true, $error, $dbms, $table_prefix, $dbhost, $dbuser, $dbpasswd, $dbname, $dbport); - } -*/ - // Update the list of available DBMS modules to only contain those which can be used - $available_dbms_temp = array(); - foreach ($this->available_dbms as $type => $dbms_ary) - { - if (!extension_loaded($dbms_ary['MODULE'])) - { - if (!$this->can_load_dll($dbms_ary['MODULE'])) - { - continue; - } - } - - $available_dbms_temp[$type] = $dbms_ary; - } - - $this->available_dbms = &$available_dbms_temp; - // Obtain any submitted data foreach ($this->request_vars as $var) { $$var = request_var($var, ''); } - // And now for the main part of this page - $config_options = array( - 'legend' => 'DB_CONFIG', - 'dbms' => array('lang' => 'DBMS', 'type' => 'select', 'options' => '$this->module->dbms_select(\'{VALUE}\')', 'explain' => false), - 'dbhost' => array('lang' => 'DB_HOST', 'type' => 'text:25:100', 'explain' => true), - 'dbport' => array('lang' => 'DB_PORT', 'type' => 'text:25:100', 'explain' => true), - 'dbname' => array('lang' => 'DB_NAME', 'type' => 'text:25:100', 'explain' => false), - 'dbuser' => array('lang' => 'DB_USERNAME', 'type' => 'text:25:100', 'explain' => false), - 'dbpasswd' => array('lang' => 'DB_PASSWORD', 'type' => 'password:25:100', 'explain' => false), - 'table_prefix' => array('lang' => 'TABLE_PREFIX', 'type' => 'text:25:100', 'explain' => false), - ); + $connect_test = false; - $table_prefix = (!empty($table_prefix) ? $table_prefix : 'phpbb_'); - - foreach ($config_options as $config_key => $vars) + // Has the user opted to test the connection? + if (isset($_POST['testdb'])) { - if (!is_array($vars) && strpos($config_key, 'legend') === false) + // If the module for the selected database isn't loaded, let's try and load it now + if (!@extension_loaded($this->available_dbms[$dbms]['MODULE'])) { - continue; + if (!$this->can_load_dll($this->available_dbms[$dbms]['MODULE'])) + { + $error['db'][] = $lang['INST_ERR_NO_DB'];; + } } - if (strpos($config_key, 'legend') !== false) + $connect_test = $this->connect_check_db(true, $error, $dbms, $table_prefix, $dbhost, $dbuser, $dbpasswd, $dbname, $dbport); + + $template->assign_block_vars('checks', array( + 'S_LEGEND' => true, + 'S_FIRST_ROW' => true, + 'LEGEND' => $lang['DB_CONNECTION'], + 'LEGEND_EXPLAIN' => false, + )); + + if ($connect_test) { + $template->assign_block_vars('checks', array( + 'TITLE' => $lang['DB_TEST'], + 'RESULT' => '' . $lang['SUCCESSFUL_CONNECT'] . '', + + 'S_EXPLAIN' => false, + 'S_LEGEND' => false, + )); + } + else + { + $template->assign_block_vars('checks', array( + 'TITLE' => $lang['DB_TEST'], + 'RESULT' => '' . implode('
', $error) . '
', + + 'S_EXPLAIN' => false, + 'S_LEGEND' => false, + )); + } + } + + if (!$connect_test) + { + // Update the list of available DBMS modules to only contain those which can be used + $available_dbms_temp = array(); + foreach ($this->available_dbms as $type => $dbms_ary) + { + if (!extension_loaded($dbms_ary['MODULE'])) + { + if (!$this->can_load_dll($dbms_ary['MODULE'])) + { + continue; + } + } + + $available_dbms_temp[$type] = $dbms_ary; + } + + $this->available_dbms = &$available_dbms_temp; + + // And now for the main part of this page + $table_prefix = (!empty($table_prefix) ? $table_prefix : 'phpbb_'); + + foreach ($this->db_config_options as $config_key => $vars) + { + if (!is_array($vars) && strpos($config_key, 'legend') === false) + { + continue; + } + + if (strpos($config_key, 'legend') !== false) + { + $template->assign_block_vars('options', array( + 'S_LEGEND' => true, + 'LEGEND' => $lang[$vars]) + ); + + continue; + } + + $options = isset($vars['options']) ? $vars['options'] : ''; + $template->assign_block_vars('options', array( - 'S_LEGEND' => true, - 'LEGEND' => $lang[$vars]) + 'KEY' => $config_key, + 'TITLE' => $lang[$vars['lang']], + 'S_EXPLAIN' => $vars['explain'], + 'S_LEGEND' => false, + 'TITLE_EXPLAIN' => ($vars['explain']) ? $lang[$vars['lang'] . '_EXPLAIN'] : '', + 'CONTENT' => $this->p_master->input_field($config_key, $vars['type'], $$config_key, $options), + ) ); - - continue; } - - $options = isset($vars['options']) ? $vars['options'] : ''; - - $template->assign_block_vars('options', array( - 'KEY' => $config_key, - 'TITLE' => $lang[$vars['lang']], - 'S_EXPLAIN' => $vars['explain'], - 'S_LEGEND' => false, - 'TITLE_EXPLAIN' => ($vars['explain']) ? $lang[$vars['lang'] . '_EXPLAIN'] : '', - 'CONTENT' => $this->p_master->input_field($config_key, $vars['type'], $$config_key, $options), - ) - ); } // And finally where do we want to go next (well today is taken isn't it :P) $s_hidden_fields = ($img_imagick) ? '' : ''; + if ($connect_test) + { + foreach ($this->db_config_options as $config_key => $vars) + { + if (!is_array($vars)) + { + continue; + } + $s_hidden_fields .= ''; + } + } -// $url = $this->p_master->module_url . "?mode=$mode&sub=administrator"; +// $url = ($connect_test) ? $this->p_master->module_url . "?mode=$mode&sub=administrator" : $this->p_master->module_url . "?mode=$mode&sub=database"; // The road ahead is still under construction, follow the diversion back to the old installer..... ;) - $s_hidden_fields .= ''; - $url = "install.$phpEx?stage=1"; + $s_hidden_fields .= ($connect_test) ? '' : ''; + $url = ($connect_test) ? "install.$phpEx?stage=1" : $this->p_master->module_url . "?mode=$mode&sub=database"; + $submit = $lang['NEXT_STEP']; @@ -453,6 +487,103 @@ class install_install extends module return ((@ini_get('enable_dl') || strtolower(@ini_get('enable_dl')) == 'on') && (!@ini_get('safe_mode') || strtolower(@ini_get('safe_mode')) == 'off') && @dl($dll . ".$suffix")) ? true : false; } + /** + * Used to test whether we are able to connect to the database the user has specified + * and identify any problems (eg there are already tables with the names we want to use + */ + function connect_check_db($error_connect, &$error, $dbms, $table_prefix, $dbhost, $dbuser, $dbpasswd, $dbname, $dbport) + { + global $phpbb_root_path, $phpEx, $config, $lang; + + // Include the DB layer + include($phpbb_root_path . 'includes/db/' . $dbms . '.' . $phpEx); + + // Instantiate it and set return on error true + $sql_db = 'dbal_' . $dbms; + $db = new $sql_db(); + $db->sql_return_on_error(true); + + // Try and connect ... + if (is_array($db->sql_connect($dbhost, $dbuser, $dbpasswd, $dbname, $dbport, false))) + { + $db_error = $db->sql_error(); + $error[] = $lang['INST_ERR_DB_CONNECT'] . '
' . (($db_error['message']) ? $db_error['message'] : $lang['INST_ERR_DB_NO_ERROR']); + } + else + { + switch ($dbms) + { + case 'mysql': + case 'mysql4': + case 'mysqli': + case 'sqlite': + $sql = "SHOW TABLES"; + $field = "Tables_in_{$dbname}"; + break; + + case 'mssql': + case 'mssql_odbc': + $sql = "SELECT name + FROM sysobjects + WHERE type='U'"; + $field = "name"; + break; + + case 'postgres': + $sql = "SELECT relname + FROM pg_class + WHERE relkind = 'r' + AND relname NOT LIKE 'pg\_%'"; + $field = "relname"; + break; + + case 'firebird': + $sql = 'SELECT rdb$relation_name + FROM rdb$relations + WHERE rdb$view_source is null + AND rdb$system_flag = 0'; + $field = 'rdb$relation_name'; + break; + + case 'oracle': + $sql = 'SELECT table_name FROM USER_TABLES'; + $field = 'table_name'; + break; + } + $result = $db->sql_query($sql); + + if ($row = $db->sql_fetchrow($result)) + { + // Likely matches for an existing phpBB installation + $table_ary = array($table_prefix . 'attachments', $table_prefix . 'config', $table_prefix . 'sessions', $table_prefix . 'topics', $table_prefix . 'users'); + + do + { + // All phpBB installations will at least have config else it won't + // work + if (in_array(strtolower($row[$field]), $table_ary)) + { + $error[] = $lang['INST_ERR_PREFIX']; + break; + } + } + while ($row = $db->sql_fetchrow($result)); + } + $db->sql_freeresult($result); + + $db->sql_close(); + } + + if ($error_connect && (!isset($error) || !sizeof($error))) + { + return true; + } + return false; + } + + /** + * Generate the drop down of available database options + */ function dbms_select($default='') { $dbms_options = ''; @@ -470,6 +601,20 @@ class install_install extends module */ var $request_vars = array('language', 'dbms', 'dbhost', 'dbport', 'dbuser', 'dbpasswd', 'dbname', 'table_prefix', 'admin_name', 'admin_pass1', 'admin_pass2', 'board_email1', 'board_email2', 'server_name', 'server_port', 'script_path', 'img_imagick', 'ftp_path', 'ftp_user', 'ftp_pass'); + /** + * The information below will be used to build the input fields presented to the user + */ + var $db_config_options = array( + 'legend' => 'DB_CONFIG', + 'dbms' => array('lang' => 'DBMS', 'type' => 'select', 'options' => '$this->module->dbms_select(\'{VALUE}\')', 'explain' => false), + 'dbhost' => array('lang' => 'DB_HOST', 'type' => 'text:25:100', 'explain' => true), + 'dbport' => array('lang' => 'DB_PORT', 'type' => 'text:25:100', 'explain' => true), + 'dbname' => array('lang' => 'DB_NAME', 'type' => 'text:25:100', 'explain' => false), + 'dbuser' => array('lang' => 'DB_USERNAME', 'type' => 'text:25:100', 'explain' => false), + 'dbpasswd' => array('lang' => 'DB_PASSWORD', 'type' => 'password:25:100', 'explain' => false), + 'table_prefix' => array('lang' => 'TABLE_PREFIX', 'type' => 'text:25:100', 'explain' => false), + ); + /** * Specific PHP modules we may require for certain optional or extended features */ diff --git a/phpBB/language/en/install.php b/phpBB/language/en/install.php index a5463698f7..48118e244f 100755 --- a/phpBB/language/en/install.php +++ b/phpBB/language/en/install.php @@ -47,6 +47,7 @@ $lang = array_merge($lang, array( 'DBMS' => 'Database type', 'DB_CONFIG' => 'Database Configuration', + 'DB_CONNECTION' => 'Database Connection', 'DB_HOST' => 'Database server hostname or DSN', 'DB_HOST_EXPLAIN' => 'DSN stands for Data Source Name and is relevant only for ODBC installs.', 'DB_NAME' => 'Database name', @@ -97,7 +98,6 @@ $lang = array_merge($lang, array( 'INITIAL_CONFIG_EXPLAIN' => 'Now that install has determined your server can run phpBB you need to supply some specific information. If you do not know how to connect to your database please contact your hosting provider (in the first instance) or use the phpBB support forums. When entering data please ensure you check it thoroughly before continuing.', 'INSTALL_CONGRATS' => 'Congratulations', 'INSTALL_CONGRATS_EXPLAIN' => 'You have now successfully installed phpBB 3.0. Clicking the button below will take you to your Administration Control Panel (ACP). Take some time to examine the options available to you. Remember that help is available online via the Userguide and the phpBB support forums, see the %sREADME%s for further information.', - 'INSTALL_DB_CONNECT' => 'Successful Connection', 'INSTALL_INTRO' => 'Welcome to Installation', 'INSTALL_INTRO_BODY' => '

With this option, it is possible to install phpBB onto your server.

In order to proceed, you will need the following information to hand: