aboutsummaryrefslogtreecommitdiffstats
path: root/phpBB/install
diff options
context:
space:
mode:
Diffstat (limited to 'phpBB/install')
-rw-r--r--phpBB/install/install.php4
-rwxr-xr-xphpBB/install/install_install.php267
2 files changed, 208 insertions, 63 deletions
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)
<td class="row1" width="50%"><b><?php echo $lang['TABLE_PREFIX']; ?>: </b></td>
<td class="row2"><input class="post" type="text" name="table_prefix" value="<?php echo (!empty($table_prefix)) ? $table_prefix : 'phpbb_'; ?>" /></td>
</tr>
- <tr>
+<!-- <tr>
<td class="cat" colspan="2" align="center"><input class="btnlite" type="submit" name="testdb" value="<?php echo $lang['DB_TEST']; ?>" /></td>
- </tr>
+ </tr>-->
</table>
<br clear="all" />
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'];
+ // Obtain any submitted data
+ foreach ($this->request_vars as $var)
+ {
+ $$var = request_var($var, '');
+ }
+
+ $connect_test = false;
+
// Has the user opted to test the connection?
-/* if (isset($_POST['testdb']))
+ 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 (!@extension_loaded($this->available_dbms[$dbms]['MODULE']))
{
- if (!$this->can_load_dll($available_dbms[$dbms]['MODULE']))
+ if (!$this->can_load_dll($this->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);
+ $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' => '<b style="color:green">' . $lang['SUCCESSFUL_CONNECT'] . '</b>',
+
+ 'S_EXPLAIN' => false,
+ 'S_LEGEND' => false,
+ ));
+ }
+ else
+ {
+ $template->assign_block_vars('checks', array(
+ 'TITLE' => $lang['DB_TEST'],
+ 'RESULT' => '<b style="color:red">' . implode('<br />', $error) . '</b>',
+
+ 'S_EXPLAIN' => false,
+ 'S_LEGEND' => false,
+ ));
+ }
}
-*/
- // 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 (!$connect_test)
{
- if (!extension_loaded($dbms_ary['MODULE']))
+ // 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 (!$this->can_load_dll($dbms_ary['MODULE']))
+ if (!extension_loaded($dbms_ary['MODULE']))
{
- continue;
+ if (!$this->can_load_dll($dbms_ary['MODULE']))
+ {
+ continue;
+ }
}
+
+ $available_dbms_temp[$type] = $dbms_ary;
}
- $available_dbms_temp[$type] = $dbms_ary;
- }
+ $this->available_dbms = &$available_dbms_temp;
- $this->available_dbms = &$available_dbms_temp;
+ // And now for the main part of this page
+ $table_prefix = (!empty($table_prefix) ? $table_prefix : 'phpbb_');
- // 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),
- );
-
- $table_prefix = (!empty($table_prefix) ? $table_prefix : 'phpbb_');
-
- foreach ($config_options as $config_key => $vars)
- {
- if (!is_array($vars) && strpos($config_key, 'legend') === false)
+ foreach ($this->db_config_options as $config_key => $vars)
{
- continue;
- }
+ 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'] : '';
- if (strpos($config_key, 'legend') !== false)
- {
$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) ? '<input type="hidden" name="img_imagick" value="' . addslashes($img_imagick) . '" />' : '';
+ if ($connect_test)
+ {
+ foreach ($this->db_config_options as $config_key => $vars)
+ {
+ if (!is_array($vars))
+ {
+ continue;
+ }
+ $s_hidden_fields .= '<input type="hidden" name="' . $config_key . '" value="' . $$config_key . '" />';
+ }
+ }
-// $url = $this->p_master->module_url . "?mode=$mode&amp;sub=administrator";
+// $url = ($connect_test) ? $this->p_master->module_url . "?mode=$mode&amp;sub=administrator" : $this->p_master->module_url . "?mode=$mode&amp;sub=database";
// The road ahead is still under construction, follow the diversion back to the old installer..... ;)
- $s_hidden_fields .= '<input type="hidden" name="testdb" value="true" />';
- $url = "install.$phpEx?stage=1";
+ $s_hidden_fields .= ($connect_test) ? '' : '<input type="hidden" name="testdb" value="true" />';
+ $url = ($connect_test) ? "install.$phpEx?stage=1" : $this->p_master->module_url . "?mode=$mode&amp;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'] . '<br />' . (($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 = '';
@@ -471,6 +602,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
*/
var $php_dlls_other = array('zlib', 'ftp', 'xml');