From 58bf1c792747cf7e6f3c291daf17563ed15e37cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A1bor=20Hojtsy?= Date: Wed, 19 Dec 2007 13:03:16 +0000 Subject: #178523 by scor, JirkaRybka, keith.smith: user facing errors should contain text for users, not text for developers; still keeping some debug information, if display_errors is turned on on the server --- includes/database.inc | 33 ++++++++++++++++++++++++++++----- includes/database.mysql.inc | 38 +++----------------------------------- includes/database.mysqli.inc | 39 +++------------------------------------ includes/database.pgsql.inc | 23 +++-------------------- 4 files changed, 37 insertions(+), 96 deletions(-) (limited to 'includes') diff --git a/includes/database.inc b/includes/database.inc index 0bdb115d7..a56e39490 100644 --- a/includes/database.inc +++ b/includes/database.inc @@ -146,11 +146,7 @@ function db_set_active($name = 'default') { include_once $handler; } else { - drupal_maintenance_theme(); - drupal_set_title('Unsupported database type'); - print theme('maintenance_page', '

The database type '. theme('placeholder', $db_type) .' is unsupported. Please use either mysql for MySQL 3.x & 4.0.x databases, mysqli for MySQL 4.1.x+ databases, or pgsql for PostgreSQL databases. The database information is in your settings.php file.

-

For more help, see the Installation and upgrading handbook. If you are unsure what these terms mean you should probably contact your hosting provider.

'); - exit; + _db_error_page("The database type '". $db_type ."' is unsupported. Please use either 'mysql' or 'mysqli' for MySQL, or 'pgsql' for PostgreSQL databases."); } $db_conns[$name] = db_connect($connect_url); @@ -163,6 +159,33 @@ function db_set_active($name = 'default') { return array_search($previous_db, $db_conns); } +/** + * Helper function to show fatal database errors. + * + * Prints a themed maintenance page with the 'Site off-line' text, + * adding the provided error message in the case of 'display_errors' + * set to on. Ends the page request; no return. + * + * @param $error + * The error message to be appended if 'display_errors' is on. + */ +function _db_error_page($error = '') { + global $db_type; + drupal_maintenance_theme(); + drupal_set_header('HTTP/1.1 503 Service Unavailable'); + drupal_set_title('Site off-line'); + + $message = '

The site is currently not available due to technical problems. Please try again later. Thank you for your understanding.

'; + $message .= '

If you are the maintainer of this site, please check your database settings in the settings.php file and ensure that your hosting provider\'s database server is running. For more help, see the handbook, or contact your hosting provider.

'; + + if ($error && ini_get('display_errors')) { + $message .= '

The '. theme('placeholder', $db_type) .' error was: '. theme('placeholder', $error) .'.

'; + } + + print theme('maintenance_page', $message); + exit; +} + /** * Returns a boolean depending on the availability of the database. */ diff --git a/includes/database.mysql.inc b/includes/database.mysql.inc index 854f737d5..2bb105161 100644 --- a/includes/database.mysql.inc +++ b/includes/database.mysql.inc @@ -53,11 +53,7 @@ function db_connect($url) { // Check if MySQL support is present in PHP if (!function_exists('mysql_connect')) { - drupal_maintenance_theme(); - drupal_set_title('PHP MySQL support not enabled'); - print theme('maintenance_page', '

We were unable to use the MySQL database because the MySQL extension for PHP is not installed. Check your PHP.ini to see how you can enable it.

-

For more help, see the Installation and upgrading handbook. If you are unsure what these terms mean you should probably contact your hosting provider.

'); - exit; + _db_error_page('Unable to use the MySQL database because the MySQL extension for PHP is not installed. Check your php.ini to see how you can enable it.'); } // Decode url-encoded information in the db connection string @@ -84,37 +80,9 @@ function db_connect($url) { // - 2 means CLIENT_FOUND_ROWS: return the number of found // (matched) rows, not the number of affected rows. $connection = @mysql_connect($url['host'], $url['user'], $url['pass'], TRUE, 2); - if (!$connection) { + if (!$connection || !mysql_select_db(substr($url['path'], 1))) { // Show error screen otherwise - drupal_maintenance_theme(); - drupal_set_header('HTTP/1.1 503 Service Unavailable'); - drupal_set_title('Unable to connect to database server'); - print theme('maintenance_page', '

If you still have to install Drupal, proceed to the installation page.

-

If you have already finished installing Drupal, this either means that the username and password information in your settings.php file is incorrect or that we can\'t connect to the MySQL database server. This could mean your hosting provider\'s database server is down.

-

The MySQL error was: '. theme('placeholder', mysql_error()) .'.

-

Currently, the username is '. theme('placeholder', $url['user']) .' and the database server is '. theme('placeholder', $url['host']) .'.

- -

For more help, see the Installation and upgrading handbook. If you are unsure what these terms mean you should probably contact your hosting provider.

'); - exit; - } - - if (!mysql_select_db(substr($url['path'], 1))) { - drupal_maintenance_theme(); - drupal_set_title('Unable to select database'); - print theme('maintenance_page', '

We were able to connect to the MySQL database server (which means your username and password are okay) but not able to select the database.

-

The MySQL error was: '. theme('placeholder', mysql_error($connection)) .'.

-

Currently, the database is '. theme('placeholder', substr($url['path'], 1)) .'. The username is '. theme('placeholder', $url['user']) .' and the database server is '. theme('placeholder', $url['host']) .'.

- -

For more help, see the Installation and upgrading handbook. If you are unsure what these terms mean you should probably contact your hosting provider.

'); - exit; + _db_error_page(mysql_error()); } /* On MySQL 4.1 and later, force UTF-8 */ diff --git a/includes/database.mysqli.inc b/includes/database.mysqli.inc index 9c00b3e9d..d6fd3aeda 100644 --- a/includes/database.mysqli.inc +++ b/includes/database.mysqli.inc @@ -58,11 +58,7 @@ function db_version() { function db_connect($url) { // Check if MySQLi support is present in PHP if (!function_exists('mysqli_init') && !extension_loaded('mysqli')) { - drupal_maintenance_theme(); - drupal_set_title('PHP MySQLi support not enabled'); - print theme('maintenance_page', '

We were unable to use the MySQLi database because the MySQLi extension for PHP is not installed. Check your PHP.ini to see how you can enable it.

-

For more help, see the Installation and upgrading handbook. If you are unsure what these terms mean you should probably contact your hosting provider.

'); - exit; + _db_error_page('Unable to use the MySQLi database because the MySQLi extension for PHP is not installed. Check your php.ini to see how you can enable it.'); } $url = parse_url($url); @@ -85,37 +81,8 @@ function db_connect($url) { $connection = mysqli_init(); @mysqli_real_connect($connection, $url['host'], $url['user'], $url['pass'], substr($url['path'], 1), $url['port'], NULL, MYSQLI_CLIENT_FOUND_ROWS); - // Find all database connection errors and error 1045 for access denied for user account - if (mysqli_connect_errno() >= 2000 || mysqli_connect_errno() == 1045) { - drupal_maintenance_theme(); - drupal_set_header('HTTP/1.1 503 Service Unavailable'); - drupal_set_title('Unable to connect to database server'); - print theme('maintenance_page', '

If you still have to install Drupal, proceed to the installation page.

-

If you have already finished installing Drupal, this either means that the username and password information in your settings.php file is incorrect or that we can\'t connect to the MySQL database server. This could mean your hosting provider\'s database server is down.

-

The MySQL error was: '. theme('placeholder', mysqli_connect_error()) .'.

-

Currently, the username is '. theme('placeholder', $url['user']) .' and the database server is '. theme('placeholder', $url['host']) .'.

- -

For more help, see the Installation and upgrading handbook. If you are unsure what these terms mean you should probably contact your hosting provider.

'); - exit; - } - else if (mysqli_connect_errno() > 0) { - drupal_maintenance_theme(); - drupal_set_title('Unable to select database'); - print theme('maintenance_page', '

We were able to connect to the MySQL database server (which means your username and password are okay) but not able to select the database.

-

The MySQL error was: '. theme('placeholder', mysqli_connect_error()) .'.

-

Currently, the database is '. theme('placeholder', substr($url['path'], 1)) .'. The username is '. theme('placeholder', $url['user']) .' and the database server is '. theme('placeholder', $url['host']) .'.

- -

For more help, see the Installation and upgrading handbook. If you are unsure what these terms mean you should probably contact your hosting provider.

'); - exit; + if (mysqli_connect_errno() > 0) { + _db_error_page(mysqli_connect_error()); } /* Force UTF-8 */ diff --git a/includes/database.pgsql.inc b/includes/database.pgsql.inc index b4eb19dcd..7ee350049 100644 --- a/includes/database.pgsql.inc +++ b/includes/database.pgsql.inc @@ -47,11 +47,7 @@ function db_version() { function db_connect($url) { // Check if PostgreSQL support is present in PHP if (!function_exists('pg_connect')) { - drupal_maintenance_theme(); - drupal_set_title('PHP PostgreSQL support not enabled'); - print theme('maintenance_page', '

We were unable to use the PostgreSQL database because the PostgreSQL extension for PHP is not installed. Check your PHP.ini to see how you can enable it.

-

For more help, see the Installation and upgrading handbook. If you are unsure what these terms mean you should probably contact your hosting provider.

'); - exit; + _db_error_page('Unable to use the PostgreSQL database because the PostgreSQL extension for PHP is not installed. Check your php.ini to see how you can enable it.'); } $url = parse_url($url); @@ -82,21 +78,8 @@ function db_connect($url) { $connection = @pg_connect($conn_string); if (!$connection) { - drupal_maintenance_theme(); - drupal_set_header('HTTP/1.1 503 Service Unavailable'); - drupal_set_title('Unable to connect to database'); - print theme('maintenance_page', '

If you still have to install Drupal, proceed to the installation page.

-

If you have already finished installing Drupal, this either means that the username and password information in your settings.php file is incorrect or that we can\'t connect to the PostgreSQL database server. This could mean your hosting provider\'s database server is down.

-

The PostgreSQL error was: '. theme('placeholder', decode_entities($php_errormsg)) .'

-

Currently, the database is '. theme('placeholder', substr($url['path'], 1)) .', the username is '. theme('placeholder', $url['user']) .', and the database server is '. theme('placeholder', $url['host']) .'.

- -

For more help, see the Installation and upgrading handbook. If you are unsure what these terms mean you should probably contact your hosting provider.

'); - exit; + require_once './includes/unicode.inc'; + _db_error_page(decode_entities($php_errormsg)); } // Restore error tracking setting -- cgit v1.2.3