Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/phpmyadmin/phpmyadmin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--browse_foreigners.php2
-rw-r--r--calendar.php2
-rw-r--r--chk_rel.php2
-rw-r--r--db_create.php2
-rw-r--r--db_datadict.php2
-rw-r--r--db_export.php2
-rw-r--r--db_import.php2
-rw-r--r--db_operations.php2
-rw-r--r--db_printview.php2
-rw-r--r--db_qbe.php2
-rw-r--r--db_search.php2
-rw-r--r--db_sql.php2
-rw-r--r--db_structure.php2
-rw-r--r--export.php2
-rw-r--r--import.php2
-rw-r--r--index.php8
-rw-r--r--libraries/Config.class.php2
-rw-r--r--libraries/check_user_privileges.lib.php2
-rw-r--r--libraries/common.inc.php869
-rw-r--r--libraries/common.lib.php4964
-rw-r--r--libraries/core.lib.php449
-rw-r--r--libraries/db_common.inc.php2
-rw-r--r--libraries/db_info.inc.php2
-rw-r--r--libraries/db_links.inc.php2
-rw-r--r--libraries/header.inc.php4
-rw-r--r--libraries/header_printview.inc.php2
-rw-r--r--libraries/server_common.inc.php2
-rw-r--r--libraries/server_links.inc.php2
-rw-r--r--libraries/sql_query_form.lib.php2
-rw-r--r--libraries/tbl_common.php2
-rw-r--r--libraries/tbl_info.inc.php2
-rw-r--r--libraries/tbl_links.inc.php2
-rw-r--r--libraries/tbl_properties.inc.php2
-rw-r--r--libraries/tbl_replace_fields.inc.php2
-rw-r--r--main.php2
-rw-r--r--navigation.php2
-rw-r--r--pdf_pages.php2
-rw-r--r--pdf_schema.php2
-rw-r--r--phpinfo.php2
-rw-r--r--phpmyadmin.css.php2
-rw-r--r--pmd_common.php2
-rw-r--r--querywindow.php2
-rw-r--r--scripts/setup.php2
-rw-r--r--server_binlog.php2
-rw-r--r--server_collations.php2
-rw-r--r--server_databases.php2
-rw-r--r--server_engines.php2
-rw-r--r--server_export.php2
-rw-r--r--server_import.php2
-rw-r--r--server_privileges.php2
-rw-r--r--server_processlist.php2
-rw-r--r--server_sql.php2
-rw-r--r--server_status.php2
-rw-r--r--server_variables.php2
-rw-r--r--sql.php2
-rw-r--r--tbl_addfield.php2
-rw-r--r--tbl_alter.php2
-rw-r--r--tbl_change.php2
-rw-r--r--tbl_create.php2
-rw-r--r--tbl_export.php2
-rw-r--r--tbl_import.php2
-rw-r--r--tbl_indexes.php2
-rw-r--r--tbl_move_copy.php2
-rw-r--r--tbl_operations.php2
-rw-r--r--tbl_printview.php2
-rw-r--r--tbl_relation.php2
-rw-r--r--tbl_replace.php2
-rw-r--r--tbl_row_action.php2
-rw-r--r--tbl_select.php2
-rw-r--r--tbl_sql.php2
-rw-r--r--tbl_structure.php2
-rw-r--r--test/FailTest.php1
-rw-r--r--test/PMA_get_real_size_test.php2
-rw-r--r--test/theme.php4
-rw-r--r--themes.php2
-rw-r--r--transformation_overview.php2
-rw-r--r--transformation_wrapper.php2
-rw-r--r--user_password.php2
-rw-r--r--view_create.php2
79 files changed, 3227 insertions, 3216 deletions
diff --git a/browse_foreigners.php b/browse_foreigners.php
index 6c2be738ba..ea981d7efe 100644
--- a/browse_foreigners.php
+++ b/browse_foreigners.php
@@ -9,7 +9,7 @@
/**
* Gets a core script and starts output buffering work
*/
-require_once('./libraries/common.lib.php');
+require_once('./libraries/common.inc.php');
PMA_checkParameters(array('db', 'table', 'field'));
diff --git a/calendar.php b/calendar.php
index f971f7a32a..fe46fc35e2 100644
--- a/calendar.php
+++ b/calendar.php
@@ -8,7 +8,7 @@
/**
*
*/
-require_once('./libraries/common.lib.php');
+require_once('./libraries/common.inc.php');
require_once('./libraries/header_http.inc.php');
$page_title = $strCalendar;
require('./libraries/header_meta_style.inc.php');
diff --git a/chk_rel.php b/chk_rel.php
index 71889a6c29..9c0bcf747e 100644
--- a/chk_rel.php
+++ b/chk_rel.php
@@ -8,7 +8,7 @@
/**
* Gets some core libraries
*/
-require_once('./libraries/common.lib.php');
+require_once('./libraries/common.inc.php');
require_once('./libraries/db_common.inc.php');
require_once('./libraries/relation.lib.php');
diff --git a/db_create.php b/db_create.php
index 5e7e8d4ecf..35542cc49a 100644
--- a/db_create.php
+++ b/db_create.php
@@ -8,7 +8,7 @@
/**
* Gets some core libraries
*/
-require_once('./libraries/common.lib.php');
+require_once('./libraries/common.inc.php');
$js_to_run = 'functions.js';
require_once('./libraries/header.inc.php');
require_once('./libraries/mysql_charsets.lib.php');
diff --git a/db_datadict.php b/db_datadict.php
index e88c3e401e..10fff38055 100644
--- a/db_datadict.php
+++ b/db_datadict.php
@@ -8,7 +8,7 @@
/**
* Gets the variables sent or posted to this script, then displays headers
*/
-require_once('./libraries/common.lib.php');
+require_once('./libraries/common.inc.php');
if (!isset($selected_tbl)) {
require_once('./libraries/header.inc.php');
diff --git a/db_export.php b/db_export.php
index f87d2a237e..180e082b23 100644
--- a/db_export.php
+++ b/db_export.php
@@ -13,7 +13,7 @@
/**
* Gets some core libraries
*/
-require_once('./libraries/common.lib.php');
+require_once('./libraries/common.inc.php');
$sub_part = '_export';
require_once('./libraries/db_common.inc.php');
diff --git a/db_import.php b/db_import.php
index 9d9893980c..f5fbe7d237 100644
--- a/db_import.php
+++ b/db_import.php
@@ -8,7 +8,7 @@
/**
*
*/
-require_once('./libraries/common.lib.php');
+require_once('./libraries/common.inc.php');
/**
* Gets tables informations and displays top links
diff --git a/db_operations.php b/db_operations.php
index b28c9e2c52..210b2f5edc 100644
--- a/db_operations.php
+++ b/db_operations.php
@@ -15,7 +15,7 @@
/**
* requirements
*/
-require_once './libraries/common.lib.php';
+require_once './libraries/common.inc.php';
require_once './libraries/Table.class.php';
require_once './libraries/mysql_charsets.lib.php';
diff --git a/db_printview.php b/db_printview.php
index a32b44fa60..d164a46b1a 100644
--- a/db_printview.php
+++ b/db_printview.php
@@ -8,7 +8,7 @@
/**
*
*/
-require_once './libraries/common.lib.php';
+require_once './libraries/common.inc.php';
/**
* Gets the variables sent or posted to this script, then displays headers
diff --git a/db_qbe.php b/db_qbe.php
index b780a5c167..996e9d2a5a 100644
--- a/db_qbe.php
+++ b/db_qbe.php
@@ -9,7 +9,7 @@
/**
* requirements
*/
-require_once './libraries/common.lib.php';
+require_once './libraries/common.inc.php';
require_once './libraries/Table.class.php';
require_once './libraries/relation.lib.php';
diff --git a/db_search.php b/db_search.php
index 3886f91d29..878e7c90ca 100644
--- a/db_search.php
+++ b/db_search.php
@@ -52,7 +52,7 @@
/**
*
*/
-require_once './libraries/common.lib.php';
+require_once './libraries/common.inc.php';
/**
* Gets some core libraries and send headers
diff --git a/db_sql.php b/db_sql.php
index a1174fa4e2..77aeef90e8 100644
--- a/db_sql.php
+++ b/db_sql.php
@@ -8,7 +8,7 @@
/**
*
*/
-require_once('./libraries/common.lib.php');
+require_once('./libraries/common.inc.php');
/**
* Runs common work
diff --git a/db_structure.php b/db_structure.php
index 390208d3aa..95bea781a8 100644
--- a/db_structure.php
+++ b/db_structure.php
@@ -8,7 +8,7 @@
/**
*
*/
-require_once './libraries/common.lib.php';
+require_once './libraries/common.inc.php';
require_once './libraries/Table.class.php';
/**
diff --git a/export.php b/export.php
index f68675b314..78320d4717 100644
--- a/export.php
+++ b/export.php
@@ -8,7 +8,7 @@
/**
* Get the variables sent or posted to this script and a core script
*/
-require_once './libraries/common.lib.php';
+require_once './libraries/common.inc.php';
require_once './libraries/zip.lib.php';
require_once './libraries/plugin_interface.lib.php';
diff --git a/import.php b/import.php
index b721148a4f..30ee721024 100644
--- a/import.php
+++ b/import.php
@@ -9,7 +9,7 @@
/**
* Get the variables sent or posted to this script and a core script
*/
-require_once('./libraries/common.lib.php');
+require_once('./libraries/common.inc.php');
$js_to_run = 'functions.js';
// default values
diff --git a/index.php b/index.php
index a85af76dd1..0d837b6712 100644
--- a/index.php
+++ b/index.php
@@ -4,8 +4,6 @@
* forms frameset
*
* @version $Id$
- * @uses libraries/common.lib.php global fnctions
- * @uses libraries/relation.lib.php table relations
* @uses $GLOBALS['strNoFrames']
* @uses $GLOBALS['cfg']['QueryHistoryDB']
* @uses $GLOBALS['cfg']['Server']['user']
@@ -13,8 +11,8 @@
* @uses $GLOBALS['cfg']['DefaultTabDatabase'] as src for the mainframe
* @uses $GLOBALS['cfg']['NaviWidth'] for navi frame width
* @uses $GLOBALS['collation_connection'] from $_REQUEST (grab_globals.lib.php)
- * or common.lib.php
- * @uses $GLOBALS['available_languages'] from common.lib.php (select_lang.lib.php)
+ * or common.inc.php
+ * @uses $GLOBALS['available_languages'] from common.inc.php (select_lang.lib.php)
* @uses $GLOBALS['db']
* @uses $GLOBALS['charset']
* @uses $GLOBALS['lang']
@@ -33,7 +31,7 @@
/**
* Gets core libraries and defines some variables
*/
-require_once './libraries/common.lib.php';
+require_once './libraries/common.inc.php';
/**
* Includes the ThemeManager if it hasn't been included yet
diff --git a/libraries/Config.class.php b/libraries/Config.class.php
index 368da045a4..b20b502207 100644
--- a/libraries/Config.class.php
+++ b/libraries/Config.class.php
@@ -420,7 +420,7 @@ class PMA_Config
// Now, a collation information could come from REQUEST
// (an example of this: the collation selector in main.php)
// so the following handles the setting of collation_connection
- // and later, in common.lib.php, the cookie will be set
+ // and later, in common.inc.php, the cookie will be set
// according to this.
$this->checkCollationConnection();
diff --git a/libraries/check_user_privileges.lib.php b/libraries/check_user_privileges.lib.php
index 38eb5bec4d..93f477901a 100644
--- a/libraries/check_user_privileges.lib.php
+++ b/libraries/check_user_privileges.lib.php
@@ -2,7 +2,7 @@
/* vim: set expandtab sw=4 ts=4 sts=4: */
/**
* Get user's global privileges and some db-specific privileges
- * ($controllink and $userlink are links to MySQL defined in the "common.lib.php" library)
+ * ($controllink and $userlink are links to MySQL defined in the "common.inc.php" library)
* Note: if no controluser is defined, $controllink contains $userlink
*
* @version $Id$
diff --git a/libraries/common.inc.php b/libraries/common.inc.php
new file mode 100644
index 0000000000..65e6a88e37
--- /dev/null
+++ b/libraries/common.inc.php
@@ -0,0 +1,869 @@
+<?php
+/* vim: set expandtab sw=4 ts=4 sts=4: */
+/**
+ * Misc stuff and REQUIRED by ALL the scripts.
+ * MUST be included by every script
+ *
+ * Among other things, it contains the advanced authentication work.
+ *
+ * Order of sections for common.inc.php:
+ *
+ * the include of libraries/defines_mysql.lib.php must be after the connection
+ * to db to get the MySql version
+ *
+ * the authentication libraries must be before the connection to db
+ *
+ * ... so the required order is:
+ *
+ * LABEL_variables_init
+ * - init some variables always needed
+ * LABEL_parsing_config_file
+ * - parsing of the config file
+ * LABEL_loading_language_file
+ * - loading language file
+ * LABEL_theme_setup
+ * - setting up themes
+ *
+ * - load of mysql extension (if necessary) label_loading_mysql
+ * - loading of an authentication library label_
+ * - db connection
+ * - authentication work
+ * - load of the libraries/defines_mysql.lib.php library to get the MySQL
+ * release number
+ *
+ * @version $Id$
+ */
+
+/**
+ * For now, avoid warnings of E_STRICT mode
+ * (this must be done before function definitions)
+ */
+if (defined('E_STRICT')) {
+ $old_error_reporting = error_reporting(0);
+ if ($old_error_reporting & E_STRICT) {
+ error_reporting($old_error_reporting ^ E_STRICT);
+ } else {
+ error_reporting($old_error_reporting);
+ }
+ unset($old_error_reporting);
+}
+
+/**
+ * Avoid object cloning errors
+ */
+@ini_set('zend.ze1_compatibility_mode', false);
+
+/**
+ * Avoid problems with magic_quotes_runtime
+ */
+@ini_set('magic_quotes_runtime', false);
+
+/**
+ * core functions
+ */
+require_once './libraries/core.lib.php';
+
+/**
+ * Input sanitizing
+ */
+require_once './libraries/sanitizing.lib.php';
+
+/**
+ * the PMA_Theme class
+ */
+require_once './libraries/Theme.class.php';
+
+/**
+ * the PMA_Theme_Manager class
+ */
+require_once './libraries/Theme_Manager.class.php';
+
+/**
+ * the PMA_Config class
+ */
+require_once './libraries/Config.class.php';
+
+/**
+ * the PMA_Table class
+ */
+require_once './libraries/Table.class.php';
+
+if (!defined('PMA_MINIMUM_COMMON')) {
+ /**
+ * common functions
+ */
+ require_once './libraries/common.lib.php';
+
+ /**
+ * Java script escaping.
+ */
+ require_once './libraries/js_escape.lib.php';
+
+ /**
+ * Include URL/hidden inputs generating.
+ */
+ require_once './libraries/url_generating.lib.php';
+}
+
+/******************************************************************************/
+/* start procedural code label_start_procedural */
+
+/**
+ * protect against older PHP versions' bug about GLOBALS overwrite
+ * (no need to localize this message :))
+ * but what if script.php?GLOBALS[admin]=1&GLOBALS[_REQUEST]=1 ???
+ */
+if (isset($_REQUEST['GLOBALS']) || isset($_FILES['GLOBALS'])
+ || isset($_SERVER['GLOBALS']) || isset($_COOKIE['GLOBALS'])
+ || isset($_ENV['GLOBALS'])) {
+ die('GLOBALS overwrite attempt');
+}
+
+/**
+ * protect against possible exploits - there is no need to have so much vars
+ */
+if (count($_REQUEST) > 1000) {
+ die('possible exploit');
+}
+
+/**
+ * Check for numeric keys
+ * (if register_globals is on, numeric key can be found in $GLOBALS)
+ */
+foreach ($GLOBALS as $key => $dummy) {
+ if (is_numeric($key)) {
+ die('numeric key detected');
+ }
+}
+
+/**
+ * just to be sure there was no import (registering) before here
+ * we empty the global space
+ */
+$variables_whitelist = array (
+ 'GLOBALS',
+ '_SERVER',
+ '_GET',
+ '_POST',
+ '_REQUEST',
+ '_FILES',
+ '_ENV',
+ '_COOKIE',
+ '_SESSION',
+);
+
+foreach (get_defined_vars() as $key => $value) {
+ if (! in_array($key, $variables_whitelist)) {
+ unset($$key);
+ }
+}
+unset($key, $value, $variables_whitelist);
+
+
+/**
+ * Subforms - some functions need to be called by form, cause of the limited url
+ * length, but if this functions inside another form you cannot just open a new
+ * form - so phpMyAdmin uses 'arrays' inside this form
+ *
+ * <code>
+ * <form ...>
+ * ... main form elments ...
+ * <intput type="hidden" name="subform[action1][id]" value="1" />
+ * ... other subform data ...
+ * <intput type="submit" name="usesubform[action1]" value="do action1" />
+ * ... other subforms ...
+ * <intput type="hidden" name="subform[actionX][id]" value="X" />
+ * ... other subform data ...
+ * <intput type="submit" name="usesubform[actionX]" value="do actionX" />
+ * ... main form elments ...
+ * <intput type="submit" name="main_action" value="submit form" />
+ * </form>
+ * </code
+ *
+ * so we now check if a subform is submitted
+ */
+$__redirect = null;
+if (isset($_POST['usesubform'])) {
+ // if a subform is present and should be used
+ // the rest of the form is deprecated
+ $subform_id = key($_POST['usesubform']);
+ $subform = $_POST['subform'][$subform_id];
+ $_POST = $subform;
+ $_REQUEST = $subform;
+ /**
+ * some subforms need another page than the main form, so we will just
+ * include this page at the end of this script - we use $__redirect to
+ * track this
+ */
+ if (isset($_POST['redirect'])
+ && $_POST['redirect'] != basename(PMA_getenv('PHP_SELF'))) {
+ $__redirect = $_POST['redirect'];
+ unset($_POST['redirect']);
+ }
+ unset($subform_id, $subform);
+}
+// end check if a subform is submitted
+
+// remove quotes added by php
+if (get_magic_quotes_gpc()) {
+ PMA_arrayWalkRecursive($_GET, 'stripslashes', true);
+ PMA_arrayWalkRecursive($_POST, 'stripslashes', true);
+ PMA_arrayWalkRecursive($_COOKIE, 'stripslashes', true);
+ PMA_arrayWalkRecursive($_REQUEST, 'stripslashes', true);
+}
+
+/**
+ * clean cookies on new install or upgrade
+ * when changing something with increment the cookie version
+ */
+$pma_cookie_version = 4;
+if (isset($_COOKIE)
+ && (! isset($_COOKIE['pmaCookieVer'])
+ || $_COOKIE['pmaCookieVer'] < $pma_cookie_version)) {
+ // delete all cookies
+ foreach($_COOKIE as $cookie_name => $tmp) {
+ PMA_removeCookie($cookie_name);
+ }
+ $_COOKIE = array();
+ PMA_setCookie('pmaCookieVer', $pma_cookie_version);
+}
+
+/**
+ * include deprecated grab_globals only if required
+ */
+if (empty($__redirect) && !defined('PMA_NO_VARIABLES_IMPORT')) {
+ require './libraries/grab_globals.lib.php';
+}
+
+/**
+ * include session handling after the globals, to prevent overwriting
+ */
+require_once './libraries/session.inc.php';
+
+/**
+ * init some variables LABEL_variables_init
+ */
+
+/**
+ * holds errors
+ * @global array $GLOBALS['PMA_errors']
+ */
+$GLOBALS['PMA_errors'] = array();
+
+/**
+ * holds params to be passed to next page
+ * @global array $GLOBALS['url_params']
+ */
+$GLOBALS['url_params'] = array();
+
+/**
+ * the whitelist for $GLOBALS['goto']
+ * @global array $goto_whitelist
+ */
+$goto_whitelist = array(
+ //'browse_foreigners.php',
+ //'calendar.php',
+ //'changelog.php',
+ //'chk_rel.php',
+ 'db_create.php',
+ 'db_datadict.php',
+ 'db_sql.php',
+ 'db_export.php',
+ 'db_importdocsql.php',
+ 'db_qbe.php',
+ 'db_structure.php',
+ 'db_import.php',
+ 'db_operations.php',
+ 'db_printview.php',
+ 'db_search.php',
+ //'Documentation.html',
+ //'error.php',
+ 'export.php',
+ 'import.php',
+ //'index.php',
+ //'navigation.php',
+ //'license.php',
+ 'main.php',
+ 'pdf_pages.php',
+ 'pdf_schema.php',
+ //'phpinfo.php',
+ 'querywindow.php',
+ //'readme.php',
+ 'server_binlog.php',
+ 'server_collations.php',
+ 'server_databases.php',
+ 'server_engines.php',
+ 'server_export.php',
+ 'server_import.php',
+ 'server_privileges.php',
+ 'server_processlist.php',
+ 'server_sql.php',
+ 'server_status.php',
+ 'server_variables.php',
+ 'sql.php',
+ 'tbl_addfield.php',
+ 'tbl_alter.php',
+ 'tbl_change.php',
+ 'tbl_create.php',
+ 'tbl_import.php',
+ 'tbl_indexes.php',
+ 'tbl_move_copy.php',
+ 'tbl_printview.php',
+ 'tbl_sql.php',
+ 'tbl_export.php',
+ 'tbl_operations.php',
+ 'tbl_structure.php',
+ 'tbl_relation.php',
+ 'tbl_replace.php',
+ 'tbl_row_action.php',
+ 'tbl_select.php',
+ //'themes.php',
+ 'transformation_overview.php',
+ 'transformation_wrapper.php',
+ 'translators.html',
+ 'user_password.php',
+);
+
+/**
+ * check $__redirect against whitelist
+ */
+if (! PMA_checkPageValidity($__redirect, $goto_whitelist)) {
+ $__redirect = null;
+}
+
+/**
+ * holds page that should be displayed
+ * @global string $GLOBALS['goto']
+ */
+$GLOBALS['goto'] = '';
+// Security fix: disallow accessing serious server files via "?goto="
+if (PMA_checkPageValidity($_REQUEST['goto'], $goto_whitelist)) {
+ $GLOBALS['goto'] = $_REQUEST['goto'];
+ $GLOBALS['url_params']['goto'] = $_REQUEST['goto'];
+} else {
+ unset($_REQUEST['goto'], $_GET['goto'], $_POST['goto'], $_COOKIE['goto']);
+}
+
+/**
+ * returning page
+ * @global string $GLOBALS['back']
+ */
+if (PMA_checkPageValidity($_REQUEST['back'], $goto_whitelist)) {
+ $GLOBALS['back'] = $_REQUEST['back'];
+} else {
+ unset($_REQUEST['back'], $_GET['back'], $_POST['back'], $_COOKIE['back']);
+}
+
+/**
+ * Check whether user supplied token is valid, if not remove any possibly
+ * dangerous stuff from request.
+ *
+ * remember that some objects in the session with session_start and __wakeup()
+ * could access this variables before we reach this point
+ * f.e. PMA_Config: fontsize
+ *
+ * @todo variables should be handled by their respective owners (objects)
+ * f.e. lang, server, convcharset, collation_connection in PMA_Config
+ */
+if ((isset($_REQUEST['token']) && !is_string($_REQUEST['token'])) || empty($_REQUEST['token']) || $_SESSION[' PMA_token '] != $_REQUEST['token']) {
+ /**
+ * List of parameters which are allowed from unsafe source
+ */
+ $allow_list = array(
+ 'db', 'table', 'lang', 'server', 'convcharset', 'collation_connection', 'target',
+ /* Session ID */
+ 'phpMyAdmin',
+ /* Cookie preferences */
+ 'pma_lang', 'pma_charset', 'pma_collation_connection',
+ /* Possible login form */
+ 'pma_servername', 'pma_username', 'pma_password',
+ );
+ /**
+ * Require cleanup functions
+ */
+ require_once('./libraries/cleanup.lib.php');
+ /**
+ * Do actual cleanup
+ */
+ PMA_remove_request_vars($allow_list);
+
+}
+
+
+/**
+ * @global string $convcharset
+ * @see select_lang.lib.php
+ */
+if (isset($_REQUEST['convcharset'])) {
+ $convcharset = strip_tags($_REQUEST['convcharset']);
+}
+
+/**
+ * current selected database
+ * @global string $GLOBALS['db']
+ */
+$GLOBALS['db'] = '';
+if (isset($_REQUEST['db']) && is_string($_REQUEST['db'])) {
+ // can we strip tags from this?
+ // only \ and / is not allowed in db names for MySQL
+ $GLOBALS['db'] = $_REQUEST['db'];
+ $GLOBALS['url_params']['db'] = $GLOBALS['db'];
+}
+
+/**
+ * current selected table
+ * @global string $GLOBALS['table']
+ */
+$GLOBALS['table'] = '';
+if (isset($_REQUEST['table']) && is_string($_REQUEST['table'])) {
+ // can we strip tags from this?
+ // only \ and / is not allowed in table names for MySQL
+ $GLOBALS['table'] = $_REQUEST['table'];
+ $GLOBALS['url_params']['table'] = $GLOBALS['table'];
+}
+
+/**
+ * sql query to be executed
+ * @global string $GLOBALS['sql_query']
+ */
+if (isset($_REQUEST['sql_query']) && is_string($_REQUEST['sql_query'])) {
+ $GLOBALS['sql_query'] = $_REQUEST['sql_query'];
+}
+
+//$_REQUEST['set_theme'] // checked later in this file LABEL_theme_setup
+//$_REQUEST['server']; // checked later in this file
+//$_REQUEST['lang']; // checked by LABEL_loading_language_file
+
+
+
+/******************************************************************************/
+/* parsing config file LABEL_parsing_config_file */
+
+if (empty($_SESSION['PMA_Config'])) {
+ /**
+ * We really need this one!
+ */
+ if (! function_exists('preg_replace')) {
+ PMA_fatalError('strCantLoad', 'pcre');
+ }
+
+ /**
+ * @global PMA_Config $_SESSION['PMA_Config']
+ */
+ $_SESSION['PMA_Config'] = new PMA_Config('./config.inc.php');
+
+} elseif (version_compare(phpversion(), '5', 'lt')) {
+ /**
+ * @todo move all __wakeup() functionality into session.inc.php
+ */
+ $_SESSION['PMA_Config']->__wakeup();
+}
+
+if (!defined('PMA_MINIMUM_COMMON')) {
+ $_SESSION['PMA_Config']->checkPmaAbsoluteUri();
+}
+
+/**
+ * BC - enable backward compatibility
+ * exports all config settings into $GLOBALS ($GLOBALS['cfg'])
+ */
+$_SESSION['PMA_Config']->enableBc();
+
+
+/**
+ * check https connection
+ */
+if ($_SESSION['PMA_Config']->get('ForceSSL')
+ && !$_SESSION['PMA_Config']->get('is_https')) {
+ PMA_sendHeaderLocation(
+ preg_replace('/^http/', 'https',
+ $_SESSION['PMA_Config']->get('PmaAbsoluteUri'))
+ . PMA_generate_common_url($_GET));
+ exit;
+}
+
+
+/******************************************************************************/
+/* loading language file LABEL_loading_language_file */
+
+/**
+ * Added messages while developing:
+ */
+if (file_exists('./lang/added_messages.php')) {
+ include './lang/added_messages.php';
+}
+
+/**
+ * Includes the language file if it hasn't been included yet
+ */
+require './libraries/language.lib.php';
+
+
+/**
+ * check for errors occured while loading config
+ * this check is done here after loading lang files to present errors in locale
+ */
+if ($_SESSION['PMA_Config']->error_config_file) {
+ $GLOBALS['PMA_errors'][] = $strConfigFileError
+ . '<br /><br />'
+ . ($_SESSION['PMA_Config']->getSource() == './config.inc.php' ?
+ '<a href="show_config_errors.php"'
+ .' target="_blank">' . $_SESSION['PMA_Config']->getSource() . '</a>'
+ :
+ '<a href="' . $_SESSION['PMA_Config']->getSource() . '"'
+ .' target="_blank">' . $_SESSION['PMA_Config']->getSource() . '</a>');
+}
+if ($_SESSION['PMA_Config']->error_config_default_file) {
+ $GLOBALS['PMA_errors'][] = sprintf($strConfigDefaultFileError,
+ $_SESSION['PMA_Config']->default_source);
+}
+if ($_SESSION['PMA_Config']->error_pma_uri) {
+ $GLOBALS['PMA_errors'][] = sprintf($strPmaUriError);
+}
+
+/**
+ * current server
+ * @global integer $GLOBALS['server']
+ */
+$GLOBALS['server'] = 0;
+
+/**
+ * Servers array fixups.
+ * $default_server comes from PMA_Config::enableBc()
+ * @todo merge into PMA_Config
+ */
+// Do we have some server?
+if (!isset($cfg['Servers']) || count($cfg['Servers']) == 0) {
+ // No server => create one with defaults
+ $cfg['Servers'] = array(1 => $default_server);
+} else {
+ // We have server(s) => apply default config
+ $new_servers = array();
+
+ foreach ($cfg['Servers'] as $server_index => $each_server) {
+
+ // Detect wrong configuration
+ if (!is_int($server_index) || $server_index < 1) {
+ $GLOBALS['PMA_errors'][] = sprintf($strInvalidServerIndex, $server_index);
+ }
+
+ $each_server = array_merge($default_server, $each_server);
+
+ // Don't use servers with no hostname
+ if ($each_server['connect_type'] == 'tcp' && empty($each_server['host'])) {
+ $GLOBALS['PMA_errors'][] = sprintf($strInvalidServerHostname, $server_index);
+ }
+
+ // Final solution to bug #582890
+ // If we are using a socket connection
+ // and there is nothing in the verbose server name
+ // or the host field, then generate a name for the server
+ // in the form of "Server 2", localized of course!
+ if ($each_server['connect_type'] == 'socket' && empty($each_server['host']) && empty($each_server['verbose'])) {
+ $each_server['verbose'] = $GLOBALS['strServer'] . $server_index;
+ }
+
+ $new_servers[$server_index] = $each_server;
+ }
+ $cfg['Servers'] = $new_servers;
+ unset($new_servers, $server_index, $each_server);
+}
+
+// Cleanup
+unset($default_server);
+
+
+/******************************************************************************/
+/* setup themes LABEL_theme_setup */
+
+/**
+ * @global PMA_Theme_Manager $_SESSION['PMA_Theme_Manager']
+ */
+if (! isset($_SESSION['PMA_Theme_Manager'])) {
+ $_SESSION['PMA_Theme_Manager'] = new PMA_Theme_Manager;
+} else {
+ /**
+ * @todo move all __wakeup() functionality into session.inc.php
+ */
+ $_SESSION['PMA_Theme_Manager']->checkConfig();
+}
+
+// for the theme per server feature
+if (isset($_REQUEST['server']) && !isset($_REQUEST['set_theme'])) {
+ $GLOBALS['server'] = $_REQUEST['server'];
+ $tmp = $_SESSION['PMA_Theme_Manager']->getThemeCookie();
+ if (empty($tmp)) {
+ $tmp = $_SESSION['PMA_Theme_Manager']->theme_default;
+ }
+ $_SESSION['PMA_Theme_Manager']->setActiveTheme($tmp);
+ unset($tmp);
+}
+/**
+ * @todo move into PMA_Theme_Manager::__wakeup()
+ */
+if (isset($_REQUEST['set_theme'])) {
+ // if user selected a theme
+ $_SESSION['PMA_Theme_Manager']->setActiveTheme($_REQUEST['set_theme']);
+}
+
+/**
+ * the theme object
+ * @global PMA_Theme $_SESSION['PMA_Theme']
+ */
+$_SESSION['PMA_Theme'] = $_SESSION['PMA_Theme_Manager']->theme;
+
+// BC
+/**
+ * the active theme
+ * @global string $GLOBALS['theme']
+ */
+$GLOBALS['theme'] = $_SESSION['PMA_Theme']->getName();
+/**
+ * the theme path
+ * @global string $GLOBALS['pmaThemePath']
+ */
+$GLOBALS['pmaThemePath'] = $_SESSION['PMA_Theme']->getPath();
+/**
+ * the theme image path
+ * @global string $GLOBALS['pmaThemeImage']
+ */
+$GLOBALS['pmaThemeImage'] = $_SESSION['PMA_Theme']->getImgPath();
+
+/**
+ * load layout file if exists
+ */
+if (@file_exists($_SESSION['PMA_Theme']->getLayoutFile())) {
+ include $_SESSION['PMA_Theme']->getLayoutFile();
+ /**
+ * @todo remove if all themes are update use Navi instead of Left as frame name
+ */
+ if (! isset($GLOBALS['cfg']['NaviWidth'])
+ && isset($GLOBALS['cfg']['LeftWidth'])) {
+ $GLOBALS['cfg']['NaviWidth'] = $GLOBALS['cfg']['LeftWidth'];
+ }
+}
+
+if (! defined('PMA_MINIMUM_COMMON')) {
+ /**
+ * Charset conversion.
+ */
+ require_once './libraries/charset_conversion.lib.php';
+
+ /**
+ * String handling
+ */
+ require_once './libraries/string.lib.php';
+
+ /**
+ * Lookup server by name
+ * by Arnold - Helder Hosting
+ * (see FAQ 4.8)
+ */
+ if (! empty($_REQUEST['server']) && is_string($_REQUEST['server']) && ! ctype_digit($_REQUEST['server'])) {
+ foreach ($cfg['Servers'] as $i => $server) {
+ if ($server['host'] == $_REQUEST['server']) {
+ $_REQUEST['server'] = $i;
+ break;
+ }
+ }
+ if (is_string($_REQUEST['server'])) {
+ unset($_REQUEST['server']);
+ }
+ unset($i);
+ }
+
+ /**
+ * If no server is selected, make sure that $cfg['Server'] is empty (so
+ * that nothing will work), and skip server authentication.
+ * We do NOT exit here, but continue on without logging into any server.
+ * This way, the welcome page will still come up (with no server info) and
+ * present a choice of servers in the case that there are multiple servers
+ * and '$cfg['ServerDefault'] = 0' is set.
+ */
+
+ if (isset($_REQUEST['server']) && (is_string($_REQUEST['server']) || is_numeric($_REQUEST['server'])) && ! empty($_REQUEST['server']) && ! empty($cfg['Servers'][$_REQUEST['server']])) {
+ $GLOBALS['server'] = $_REQUEST['server'];
+ $cfg['Server'] = $cfg['Servers'][$GLOBALS['server']];
+ } else {
+ if (!empty($cfg['Servers'][$cfg['ServerDefault']])) {
+ $GLOBALS['server'] = $cfg['ServerDefault'];
+ $cfg['Server'] = $cfg['Servers'][$GLOBALS['server']];
+ } else {
+ $GLOBALS['server'] = 0;
+ $cfg['Server'] = array();
+ }
+ }
+ $GLOBALS['url_params']['server'] = $GLOBALS['server'];
+
+ if (! empty($cfg['Server'])) {
+
+ /**
+ * Loads the proper database interface for this server
+ */
+ require_once './libraries/database_interface.lib.php';
+
+ // Gets the authentication library that fits the $cfg['Server'] settings
+ // and run authentication
+
+ // (for a quick check of path disclosure in auth/cookies:)
+ $coming_from_common = true;
+
+ // to allow HTTP or http
+ $cfg['Server']['auth_type'] = strtolower($cfg['Server']['auth_type']);
+ if (! file_exists('./libraries/auth/' . $cfg['Server']['auth_type'] . '.auth.lib.php')) {
+ PMA_fatalError($strInvalidAuthMethod . ' ' . $cfg['Server']['auth_type']);
+ }
+ /**
+ * the required auth type plugin
+ */
+ require_once './libraries/auth/' . $cfg['Server']['auth_type'] . '.auth.lib.php';
+
+ if (!PMA_auth_check()) {
+ PMA_auth();
+ } else {
+ PMA_auth_set_user();
+ }
+
+ // Check IP-based Allow/Deny rules as soon as possible to reject the
+ // user
+ // Based on mod_access in Apache:
+ // http://cvs.apache.org/viewcvs.cgi/httpd-2.0/modules/aaa/mod_access.c?rev=1.37&content-type=text/vnd.viewcvs-markup
+ // Look at: "static int check_dir_access(request_rec *r)"
+ // Robbat2 - May 10, 2002
+ if (isset($cfg['Server']['AllowDeny'])
+ && isset($cfg['Server']['AllowDeny']['order'])) {
+
+ /**
+ * ip based access library
+ */
+ require_once './libraries/ip_allow_deny.lib.php';
+
+ $allowDeny_forbidden = false; // default
+ if ($cfg['Server']['AllowDeny']['order'] == 'allow,deny') {
+ $allowDeny_forbidden = true;
+ if (PMA_allowDeny('allow')) {
+ $allowDeny_forbidden = false;
+ }
+ if (PMA_allowDeny('deny')) {
+ $allowDeny_forbidden = true;
+ }
+ } elseif ($cfg['Server']['AllowDeny']['order'] == 'deny,allow') {
+ if (PMA_allowDeny('deny')) {
+ $allowDeny_forbidden = true;
+ }
+ if (PMA_allowDeny('allow')) {
+ $allowDeny_forbidden = false;
+ }
+ } elseif ($cfg['Server']['AllowDeny']['order'] == 'explicit') {
+ if (PMA_allowDeny('allow')
+ && !PMA_allowDeny('deny')) {
+ $allowDeny_forbidden = false;
+ } else {
+ $allowDeny_forbidden = true;
+ }
+ } // end if ... elseif ... elseif
+
+ // Ejects the user if banished
+ if ($allowDeny_forbidden) {
+ PMA_auth_fails();
+ }
+ unset($allowDeny_forbidden); //Clean up after you!
+ } // end if
+
+ // is root allowed?
+ if (!$cfg['Server']['AllowRoot'] && $cfg['Server']['user'] == 'root') {
+ $allowDeny_forbidden = true;
+ PMA_auth_fails();
+ unset($allowDeny_forbidden); //Clean up after you!
+ }
+
+ $bkp_track_err = @ini_set('track_errors', 1);
+
+ // Try to connect MySQL with the control user profile (will be used to
+ // get the privileges list for the current user but the true user link
+ // must be open after this one so it would be default one for all the
+ // scripts)
+ $controllink = false;
+ if ($cfg['Server']['controluser'] != '') {
+ $controllink = PMA_DBI_connect($cfg['Server']['controluser'],
+ $cfg['Server']['controlpass'], true);
+ }
+ if (! $controllink) {
+ $controllink = PMA_DBI_connect($cfg['Server']['user'],
+ $cfg['Server']['password'], true);
+ } // end if ... else
+
+ // Pass #1 of DB-Config to read in master level DB-Config will go here
+ // Robbat2 - May 11, 2002
+
+ // Connects to the server (validates user's login)
+ $userlink = PMA_DBI_connect($cfg['Server']['user'],
+ $cfg['Server']['password'], false);
+
+ // Pass #2 of DB-Config to read in user level DB-Config will go here
+ // Robbat2 - May 11, 2002
+
+ @ini_set('track_errors', $bkp_track_err);
+ unset($bkp_track_err);
+
+ /**
+ * If we auto switched to utf-8 we need to reread messages here
+ */
+ if (defined('PMA_LANG_RELOAD')) {
+ require './libraries/language.lib.php';
+ }
+
+ /**
+ * SQL Parser code
+ */
+ require_once './libraries/sqlparser.lib.php';
+
+ /**
+ * SQL Validator interface code
+ */
+ require_once './libraries/sqlvalidator.lib.php';
+
+ /**
+ * the PMA_List_Database class
+ */
+ require_once './libraries/PMA_List_Database.class.php';
+ $PMA_List_Database = new PMA_List_Database($userlink, $controllink);
+
+ } // end server connecting
+
+ /**
+ * Kanji encoding convert feature appended by Y.Kawada (2002/2/20)
+ */
+ if (@function_exists('mb_convert_encoding')
+ && strpos(' ' . $lang, 'ja-')
+ && file_exists('./libraries/kanji-encoding.lib.php')) {
+ require_once './libraries/kanji-encoding.lib.php';
+ /**
+ * enable multibyte string support
+ */
+ define('PMA_MULTIBYTE_ENCODING', 1);
+ } // end if
+
+ /**
+ * save some settings in cookies
+ * @todo should be done in PMA_Config
+ */
+ PMA_setCookie('pma_lang', $GLOBALS['lang']);
+ PMA_setCookie('pma_charset', $GLOBALS['convcharset']);
+ PMA_setCookie('pma_collation_connection', $GLOBALS['collation_connection']);
+
+ $_SESSION['PMA_Theme_Manager']->setThemeCookie();
+} // end if !defined('PMA_MINIMUM_COMMON')
+
+if (!empty($__redirect) && in_array($__redirect, $goto_whitelist)) {
+ // to handle bug #1388167
+ if (isset($_GET['is_js_confirmed'])) {
+ $is_js_confirmed = 1;
+ }
+ /**
+ * include subform target page
+ */
+ require $__redirect;
+ exit();
+}
+?>
diff --git a/libraries/common.lib.php b/libraries/common.lib.php
index 2e5b70e58b..2f77de6a8e 100644
--- a/libraries/common.lib.php
+++ b/libraries/common.lib.php
@@ -1,1458 +1,927 @@
<?php
/* vim: set expandtab sw=4 ts=4 sts=4: */
/**
- * Misc stuff and functions used by ALL the scripts.
- * MUST be included by every script
- *
- * Among other things, it contains the advanced authentication work.
- *
- * Order of sections for common.lib.php:
- *
- * the include of libraries/defines_mysql.lib.php must be after the connection
- * to db to get the MySql version
- *
- * the authentication libraries must be before the connection to db
- *
- * ... so the required order is:
- *
- * LABEL_definition_of_functions
- * - definition of functions
- * LABEL_variables_init
- * - init some variables always needed
- * LABEL_parsing_config_file
- * - parsing of the config file
- * LABEL_loading_language_file
- * - loading language file
- * LABEL_theme_setup
- * - setting up themes
- *
- * - load of mysql extension (if necessary) label_loading_mysql
- * - loading of an authentication library label_
- * - db connection
- * - authentication work
- * - load of the libraries/defines_mysql.lib.php library to get the MySQL
- * release number
+ * Misc functions used all over the scripts.
*
* @version $Id$
*/
/**
- * For now, avoid warnings of E_STRICT mode
- * (this must be done before function definitions)
+ * Exponential expression / raise number into power
+ *
+ * @uses function_exists()
+ * @uses bcpow()
+ * @uses gmp_pow()
+ * @uses gmp_strval()
+ * @uses pow()
+ * @param number $base
+ * @param number $exp
+ * @param string pow function use, or false for auto-detect
+ * @return mixed string or float
*/
-if (defined('E_STRICT')) {
- $old_error_reporting = error_reporting(0);
- if ($old_error_reporting & E_STRICT) {
- error_reporting($old_error_reporting ^ E_STRICT);
- } else {
- error_reporting($old_error_reporting);
+function PMA_pow($base, $exp, $use_function = false)
+{
+ static $pow_function = null;
+ if (null == $pow_function) {
+ if (function_exists('bcpow')) {
+ // BCMath Arbitrary Precision Mathematics Function
+ $pow_function = 'bcpow';
+ } elseif (function_exists('gmp_pow')) {
+ // GMP Function
+ $pow_function = 'gmp_pow';
+ } else {
+ // PHP function
+ $pow_function = 'pow';
+ }
+ }
+
+ if (! $use_function) {
+ $use_function = $pow_function;
+ }
+
+ switch ($use_function) {
+ case 'bcpow' :
+ $pow = bcpow($base, $exp);
+ break;
+ case 'gmp_pow' :
+ $pow = gmp_strval(gmp_pow($base, $exp));
+ break;
+ case 'pow' :
+ $base = (float) $base;
+ $exp = (int) $exp;
+ if ($exp < 0) {
+ return false;
+ }
+ $pow = pow($base, $exp);
+ break;
+ default:
+ $pow = $use_function($base, $exp);
}
- unset($old_error_reporting);
+
+ return $pow;
}
/**
- * Avoid object cloning errors
+ * string PMA_getIcon(string $icon)
+ *
+ * @uses $GLOBALS['pmaThemeImage']
+ * @param $icon name of icon
+ * @return html img tag
*/
-@ini_set('zend.ze1_compatibility_mode', false);
+function PMA_getIcon($icon, $alternate = '')
+{
+ if ($GLOBALS['cfg']['PropertiesIconic']) {
+ return '<img src="' . $GLOBALS['pmaThemeImage'] . $icon . '"'
+ . ' title="' . $alternate . '" alt="' . $alternate . '"'
+ . ' class="icon" width="16" height="16" />';
+ } else {
+ return $alternate;
+ }
+}
/**
- * Avoid problems with magic_quotes_runtime
+ * Displays the maximum size for an upload
+ *
+ * @uses $GLOBALS['strMaximumSize']
+ * @uses PMA_formatByteDown()
+ * @uses sprintf()
+ * @param integer the size
+ *
+ * @return string the message
+ *
+ * @access public
*/
-@ini_set('magic_quotes_runtime', false);
-
+function PMA_displayMaximumUploadSize($max_upload_size)
+{
+ list($max_size, $max_unit) = PMA_formatByteDown($max_upload_size);
+ return '(' . sprintf($GLOBALS['strMaximumSize'], $max_size, $max_unit) . ')';
+}
-/******************************************************************************/
-/* definition of functions LABEL_definition_of_functions */
/**
- * Removes insecure parts in a path; used before include() or
- * require() when a part of the path comes from an insecure source
- * like a cookie or form.
+ * Generates a hidden field which should indicate to the browser
+ * the maximum size for upload
*
- * @param string The path to check
+ * @param integer the size
*
- * @return string The secured path
+ * @return string the INPUT field
*
* @access public
- * @author Marc Delisle (lem9@users.sourceforge.net)
*/
-function PMA_securePath($path)
-{
- // change .. to .
- $path = preg_replace('@\.\.*@', '.', $path);
-
- return $path;
-} // end function
+ function PMA_generateHiddenMaxFileSize($max_size)
+ {
+ return '<input type="hidden" name="MAX_FILE_SIZE" value="' .$max_size . '" />';
+ }
/**
- * displays the given error message on phpMyAdmin error page in foreign language,
- * ends script execution and closes session
+ * Add slashes before "'" and "\" characters so a value containing them can
+ * be used in a sql comparison.
*
- * @todo use detected argument separator (PMA_Config)
- * @uses $GLOBALS['session_name']
- * @uses $GLOBALS['text_dir']
- * @uses $GLOBALS['strError']
- * @uses $GLOBALS['available_languages']
- * @uses $GLOBALS['lang']
- * @uses PMA_removeCookie()
- * @uses select_lang.lib.php
- * @uses $_COOKIE
- * @uses substr()
- * @uses header()
- * @uses urlencode()
- * @param string $error_message the error message or named error message
+ * @uses str_replace()
+ * @param string the string to slash
+ * @param boolean whether the string will be used in a 'LIKE' clause
+ * (it then requires two more escaped sequences) or not
+ * @param boolean whether to treat cr/lfs as escape-worthy entities
+ * (converts \n to \\n, \r to \\r)
+ *
+ * @param boolean whether this function is used as part of the
+ * "Create PHP code" dialog
+ *
+ * @return string the slashed string
+ *
+ * @access public
*/
-function PMA_fatalError($error_message, $message_args = null)
+function PMA_sqlAddslashes($a_string = '', $is_like = false, $crlf = false, $php_code = false)
{
- if (! isset($GLOBALS['available_languages'])) {
- $GLOBALS['cfg'] = array('DefaultLang' => 'en-iso-8859-1',
- 'AllowAnywhereRecoding' => false);
- // Loads the language file
- require_once './libraries/select_lang.lib.php';
- if (isset($strError)) {
- $GLOBALS['strError'] = $strError;
- }
- if (isset($text_dir)) {
- $GLOBALS['text_dir'] = $text_dir;
- }
+ if ($is_like) {
+ $a_string = str_replace('\\', '\\\\\\\\', $a_string);
+ } else {
+ $a_string = str_replace('\\', '\\\\', $a_string);
}
- if (substr($error_message, 0, 3) === 'str') {
- if (isset($$error_message)) {
- $error_message = $$error_message;
- } elseif (isset($GLOBALS[$error_message])) {
- $error_message = $GLOBALS[$error_message];
- }
+ if ($crlf) {
+ $a_string = str_replace("\n", '\n', $a_string);
+ $a_string = str_replace("\r", '\r', $a_string);
+ $a_string = str_replace("\t", '\t', $a_string);
}
- if (is_string($message_args)) {
- $error_message = sprintf($error_message, $message_args);
- } elseif (is_array($message_args)) {
- $error_message = vsprintf($error_message, $message_args);
+ if ($php_code) {
+ $a_string = str_replace('\'', '\\\'', $a_string);
+ } else {
+ $a_string = str_replace('\'', '\'\'', $a_string);
}
- $error_message = strtr($error_message, array('<br />' => '[br]'));
-
- // Displays the error message
- // (do not use &amp; for parameters sent by header)
- header('Location: error.php'
- . '?lang=' . urlencode($GLOBALS['available_languages'][$GLOBALS['lang']][2])
- . '&dir=' . urlencode($GLOBALS['text_dir'])
- . '&type=' . urlencode($GLOBALS['strError'])
- . '&error=' . urlencode($error_message));
- // on fatal errors it cannot hurt to always delete the current session
- if (isset($GLOBALS['session_name']) && isset($_COOKIE[$GLOBALS['session_name']])) {
- PMA_removeCookie($GLOBALS['session_name']);
- }
+ return $a_string;
+} // end of the 'PMA_sqlAddslashes()' function
- exit;
-}
/**
- * returns count of tables in given db
+ * Add slashes before "_" and "%" characters for using them in MySQL
+ * database, table and field names.
+ * Note: This function does not escape backslashes!
*
- * @uses PMA_DBI_try_query()
- * @uses PMA_backquote()
- * @uses PMA_DBI_QUERY_STORE()
- * @uses PMA_DBI_num_rows()
- * @uses PMA_DBI_free_result()
- * @param string $db database to count tables for
- * @return integer count of tables in $db
+ * @uses str_replace()
+ * @param string the string to escape
+ *
+ * @return string the escaped string
+ *
+ * @access public
*/
-function PMA_getTableCount($db)
+function PMA_escape_mysql_wildcards($name)
{
- $tables = PMA_DBI_try_query(
- 'SHOW TABLES FROM ' . PMA_backquote($db) . ';',
- null, PMA_DBI_QUERY_STORE);
- if ($tables) {
- $num_tables = PMA_DBI_num_rows($tables);
- PMA_DBI_free_result($tables);
- } else {
- $num_tables = 0;
- }
+ $name = str_replace('_', '\\_', $name);
+ $name = str_replace('%', '\\%', $name);
- return $num_tables;
-}
+ return $name;
+} // end of the 'PMA_escape_mysql_wildcards()' function
/**
- * Converts numbers like 10M into bytes
- * Used with permission from Moodle (http://moodle.org) by Martin Dougiamas
- * (renamed with PMA prefix to avoid double definition when embedded
- * in Moodle)
+ * removes slashes before "_" and "%" characters
+ * Note: This function does not unescape backslashes!
*
- * @uses each()
- * @uses strlen()
- * @uses substr()
- * @param string $size
- * @return integer $size
+ * @uses str_replace()
+ * @param string $name the string to escape
+ * @return string the escaped string
+ * @access public
*/
-function PMA_get_real_size($size = 0)
+function PMA_unescape_mysql_wildcards($name)
{
- if (! $size) {
- return 0;
- }
-
- $scan['gb'] = 1073741824; //1024 * 1024 * 1024;
- $scan['g'] = 1073741824; //1024 * 1024 * 1024;
- $scan['mb'] = 1048576;
- $scan['m'] = 1048576;
- $scan['kb'] = 1024;
- $scan['k'] = 1024;
- $scan['b'] = 1;
-
- foreach ($scan as $unit => $factor) {
- if (strlen($size) > strlen($unit)
- && strtolower(substr($size, strlen($size) - strlen($unit))) == $unit) {
- return substr($size, 0, strlen($size) - strlen($unit)) * $factor;
- }
- }
+ $name = str_replace('\\_', '_', $name);
+ $name = str_replace('\\%', '%', $name);
- return $size;
-} // end function PMA_get_real_size()
+ return $name;
+} // end of the 'PMA_unescape_mysql_wildcards()' function
/**
- * loads php module
+ * removes quotes (',",`) from a quoted string
*
- * @uses PHP_OS
- * @uses extension_loaded()
- * @uses ini_get()
- * @uses function_exists()
- * @uses ob_start()
- * @uses phpinfo()
- * @uses strip_tags()
- * @uses ob_get_contents()
- * @uses ob_end_clean()
- * @uses preg_match()
- * @uses strtoupper()
+ * checks if the sting is quoted and removes this quotes
+ *
+ * @uses str_replace()
* @uses substr()
- * @uses dl()
- * @param string $module name if module to load
- * @return boolean success loading module
+ * @param string $quoted_string string to remove quotes from
+ * @param string $quote type of quote to remove
+ * @return string unqoted string
*/
-function PMA_dl($module)
+function PMA_unQuote($quoted_string, $quote = null)
{
- static $dl_allowed = null;
-
- if (extension_loaded($module)) {
- return true;
- }
-
- if (null === $dl_allowed) {
- if (!@ini_get('safe_mode')
- && @ini_get('enable_dl')
- && @function_exists('dl')) {
- ob_start();
- phpinfo(INFO_GENERAL); /* Only general info */
- $a = strip_tags(ob_get_contents());
- ob_end_clean();
- if (preg_match('@Thread Safety[[:space:]]*enabled@', $a)) {
- if (preg_match('@Server API[[:space:]]*\(CGI\|CLI\)@', $a)) {
- $dl_allowed = true;
- } else {
- $dl_allowed = false;
- }
- } else {
- $dl_allowed = true;
- }
- } else {
- $dl_allowed = false;
- }
- }
+ $quotes = array();
- if (!$dl_allowed) {
- return false;
+ if (null === $quote) {
+ $quotes[] = '`';
+ $quotes[] = '"';
+ $quotes[] = "'";
+ } else {
+ $quotes[] = $quote;
}
- /* Once we require PHP >= 4.3, we might use PHP_SHLIB_SUFFIX here */
- if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
- $module_file = 'php_' . $module . '.dll';
- } elseif (PHP_OS=='HP-UX') {
- $module_file = $module . '.sl';
- } else {
- $module_file = $module . '.so';
+ foreach ($quotes as $quote) {
+ if (substr($quoted_string, 0, 1) === $quote
+ && substr($quoted_string, -1, 1) === $quote ) {
+ $unquoted_string = substr($quoted_string, 1, -1);
+ // replace escaped quotes
+ $unquoted_string = str_replace($quote . $quote, $quote, $unquoted_string);
+ return $unquoted_string;
+ }
}
- return @dl($module_file);
+ return $quoted_string;
}
/**
- * merges array recursive like array_merge_recursive() but keyed-values are
- * always overwritten.
+ * format sql strings
*
- * array PMA_array_merge_recursive(array $array1[, array $array2[, array ...]])
- *
- * @see http://php.net/array_merge
- * @see http://php.net/array_merge_recursive
- * @uses func_num_args()
- * @uses func_get_arg()
+ * @todo move into PMA_Sql
+ * @uses PMA_SQP_isError()
+ * @uses PMA_SQP_formatHtml()
+ * @uses PMA_SQP_formatNone()
* @uses is_array()
- * @uses call_user_func_array()
- * @param array array to merge
- * @param array array to merge
- * @param array ...
- * @return array merged array
+ * @param mixed pre-parsed SQL structure
+ *
+ * @return string the formatted sql
+ *
+ * @global array the configuration array
+ * @global boolean whether the current statement is a multiple one or not
+ *
+ * @access public
+ *
+ * @author Robin Johnson <robbat2@users.sourceforge.net>
*/
-function PMA_array_merge_recursive()
+function PMA_formatSql($parsed_sql, $unparsed_sql = '')
{
- switch(func_num_args()) {
- case 0 :
- return false;
+ global $cfg;
+
+ // Check that we actually have a valid set of parsed data
+ // well, not quite
+ // first check for the SQL parser having hit an error
+ if (PMA_SQP_isError()) {
+ return $parsed_sql;
+ }
+ // then check for an array
+ if (!is_array($parsed_sql)) {
+ // We don't so just return the input directly
+ // This is intended to be used for when the SQL Parser is turned off
+ $formatted_sql = '<pre>' . "\n"
+ . (($cfg['SQP']['fmtType'] == 'none' && $unparsed_sql != '') ? $unparsed_sql : $parsed_sql) . "\n"
+ . '</pre>';
+ return $formatted_sql;
+ }
+
+ $formatted_sql = '';
+
+ switch ($cfg['SQP']['fmtType']) {
+ case 'none':
+ if ($unparsed_sql != '') {
+ $formatted_sql = "<pre>\n" . PMA_SQP_formatNone(array('raw' => $unparsed_sql)) . "\n</pre>";
+ } else {
+ $formatted_sql = PMA_SQP_formatNone($parsed_sql);
+ }
break;
- case 1 :
- // when does that happen?
- return func_get_arg(0);
+ case 'html':
+ $formatted_sql = PMA_SQP_formatHtml($parsed_sql, 'color');
break;
- case 2 :
- $args = func_get_args();
- if (!is_array($args[0]) || !is_array($args[1])) {
- return $args[1];
- }
- foreach ($args[1] as $key2 => $value2) {
- if (isset($args[0][$key2]) && !is_int($key2)) {
- $args[0][$key2] = PMA_array_merge_recursive($args[0][$key2],
- $value2);
- } else {
- // we erase the parent array, otherwise we cannot override a directive that
- // contains array elements, like this:
- // (in config.default.php) $cfg['ForeignKeyDropdownOrder'] = array('id-content','content-id');
- // (in config.inc.php) $cfg['ForeignKeyDropdownOrder'] = array('content-id');
- if (is_int($key2) && $key2 == 0) {
- unset($args[0]);
- }
- $args[0][$key2] = $value2;
- }
- }
- return $args[0];
+ case 'text':
+ //$formatted_sql = PMA_SQP_formatText($parsed_sql);
+ $formatted_sql = PMA_SQP_formatHtml($parsed_sql, 'text');
break;
- default :
- $args = func_get_args();
- $args[1] = PMA_array_merge_recursive($args[0], $args[1]);
- array_shift($args);
- return call_user_func_array('PMA_array_merge_recursive', $args);
+ default:
break;
- }
-}
+ } // end switch
+
+ return $formatted_sql;
+} // end of the "PMA_formatSql()" function
+
/**
- * calls $function vor every element in $array recursively
+ * Displays a link to the official MySQL documentation
*
- * this function is protected against deep recursion attack CVE-2006-1549,
- * 1000 seems to be more than enough
+ * @uses $cfg['MySQLManualType']
+ * @uses $cfg['MySQLManualBase']
+ * @uses $cfg['ReplaceHelpImg']
+ * @uses $GLOBALS['mysql_4_1_doc_lang']
+ * @uses $GLOBALS['mysql_5_1_doc_lang']
+ * @uses $GLOBALS['mysql_5_0_doc_lang']
+ * @uses $GLOBALS['strDocu']
+ * @uses $GLOBALS['pmaThemeImage']
+ * @uses PMA_MYSQL_INT_VERSION
+ * @uses strtolower()
+ * @uses str_replace()
+ * @param string chapter of "HTML, one page per chapter" documentation
+ * @param string contains name of page/anchor that is being linked
+ * @param bool whether to use big icon (like in left frame)
*
- * @see http://www.php-security.org/MOPB/MOPB-02-2007.html
- * @see http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2006-1549
+ * @return string the html link
*
- * @uses PMA_arrayWalkRecursive()
- * @uses is_array()
- * @uses is_string()
- * @param array $array array to walk
- * @param string $function function to call for every array element
+ * @access public
*/
-function PMA_arrayWalkRecursive(&$array, $function, $apply_to_keys_also = false)
+function PMA_showMySQLDocu($chapter, $link, $big_icon = false)
{
- static $recursive_counter = 0;
- if (++$recursive_counter > 1000) {
- die('possible deep recursion attack');
- }
- foreach ($array as $key => $value) {
- if (is_array($value)) {
- PMA_arrayWalkRecursive($array[$key], $function, $apply_to_keys_also);
- } else {
- $array[$key] = $function($value);
- }
+ global $cfg;
- if ($apply_to_keys_also && is_string($key)) {
- $new_key = $function($key);
- if ($new_key != $key) {
- $array[$new_key] = $array[$key];
- unset($array[$key]);
- }
- }
+ if ($cfg['MySQLManualType'] == 'none' || empty($cfg['MySQLManualBase'])) {
+ return '';
}
- $recursive_counter++;
-}
-/**
- * boolean phpMyAdmin.PMA_checkPageValidity(string &$page, array $whitelist)
- *
- * checks given given $page against given $whitelist and returns true if valid
- * it ignores optionaly query paramters in $page (script.php?ignored)
- *
- * @uses in_array()
- * @uses urldecode()
- * @uses substr()
- * @uses strpos()
- * @param string &$page page to check
- * @param array $whitelist whitelist to check page against
- * @return boolean whether $page is valid or not (in $whitelist or not)
- */
-function PMA_checkPageValidity(&$page, $whitelist)
-{
- if (! isset($page) || !is_string($page)) {
- return false;
+ // Fixup for newly used names:
+ $chapter = str_replace('_', '-', strtolower($chapter));
+ $link = str_replace('_', '-', strtolower($link));
+
+ switch ($cfg['MySQLManualType']) {
+ case 'chapters':
+ if (empty($chapter)) {
+ $chapter = 'index';
+ }
+ $url = $cfg['MySQLManualBase'] . '/' . $chapter . '.html#' . $link;
+ break;
+ case 'big':
+ $url = $cfg['MySQLManualBase'] . '#' . $link;
+ break;
+ case 'searchable':
+ if (empty($link)) {
+ $link = 'index';
+ }
+ $url = $cfg['MySQLManualBase'] . '/' . $link . '.html';
+ break;
+ case 'viewable':
+ default:
+ if (empty($link)) {
+ $link = 'index';
+ }
+ $mysql = '5.0';
+ $lang = 'en';
+ if (defined('PMA_MYSQL_INT_VERSION')) {
+ if (PMA_MYSQL_INT_VERSION < 50000) {
+ $mysql = '4.1';
+ if (!empty($GLOBALS['mysql_4_1_doc_lang'])) {
+ $lang = $GLOBALS['mysql_4_1_doc_lang'];
+ }
+ } elseif (PMA_MYSQL_INT_VERSION >= 50100) {
+ $mysql = '5.1';
+ if (!empty($GLOBALS['mysql_5_1_doc_lang'])) {
+ $lang = $GLOBALS['mysql_5_1_doc_lang'];
+ }
+ } elseif (PMA_MYSQL_INT_VERSION >= 50000) {
+ $mysql = '5.0';
+ if (!empty($GLOBALS['mysql_5_0_doc_lang'])) {
+ $lang = $GLOBALS['mysql_5_0_doc_lang'];
+ }
+ }
+ }
+ $url = $cfg['MySQLManualBase'] . '/' . $mysql . '/' . $lang . '/' . $link . '.html';
+ break;
}
- if (in_array($page, $whitelist)) {
- return true;
- } elseif (in_array(substr($page, 0, strpos($page . '?', '?')), $whitelist)) {
- return true;
+ if ($big_icon) {
+ return '<a href="' . $url . '" target="mysql_doc"><img class="icon" src="' . $GLOBALS['pmaThemeImage'] . 'b_sqlhelp.png" width="16" height="16" alt="' . $GLOBALS['strDocu'] . '" title="' . $GLOBALS['strDocu'] . '" /></a>';
+ } elseif ($GLOBALS['cfg']['ReplaceHelpImg']) {
+ return '<a href="' . $url . '" target="mysql_doc"><img class="icon" src="' . $GLOBALS['pmaThemeImage'] . 'b_help.png" width="11" height="11" alt="' . $GLOBALS['strDocu'] . '" title="' . $GLOBALS['strDocu'] . '" /></a>';
} else {
- $_page = urldecode($page);
- if (in_array(substr($_page, 0, strpos($_page . '?', '?')), $whitelist)) {
- return true;
- }
+ return '[<a href="' . $url . '" target="mysql_doc">' . $GLOBALS['strDocu'] . '</a>]';
}
- return false;
-}
+} // end of the 'PMA_showMySQLDocu()' function
/**
- * trys to find the value for the given environment vriable name
+ * Displays a hint icon, on mouse over show the hint
*
- * searchs in $_SERVER, $_ENV than trys getenv() and apache_getenv()
- * in this order
+ * @uses $GLOBALS['pmaThemeImage']
+ * @uses PMA_jsFormat()
+ * @param string the error message
*
- * @uses $_SERVER
- * @uses $_ENV
- * @uses getenv()
- * @uses function_exists()
- * @uses apache_getenv()
- * @param string $var_name variable name
- * @return string value of $var or empty string
- */
-function PMA_getenv($var_name) {
- if (isset($_SERVER[$var_name])) {
- return $_SERVER[$var_name];
- } elseif (isset($_ENV[$var_name])) {
- return $_ENV[$var_name];
- } elseif (getenv($var_name)) {
- return getenv($var_name);
- } elseif (function_exists('apache_getenv')
- && apache_getenv($var_name, true)) {
- return apache_getenv($var_name, true);
- }
-
- return '';
-}
-
-/**
- * removes cookie
- *
- * @uses PMA_Config::isHttps()
- * @uses PMA_Config::getCookiePath()
- * @uses setcookie()
- * @uses time()
- * @param string $cookie name of cookie to remove
- * @return boolean result of setcookie()
+ * @access public
*/
-function PMA_removeCookie($cookie)
+function PMA_showHint($hint_message)
{
- return setcookie($cookie, '', time() - 3600,
- PMA_Config::getCookiePath(), '', PMA_Config::isHttps());
+ //return '<img class="lightbulb" src="' . $GLOBALS['pmaThemeImage'] . 'b_tipp.png" width="16" height="16" border="0" alt="' . $hint_message . '" title="' . $hint_message . '" align="middle" onclick="alert(\'' . PMA_jsFormat($hint_message, false) . '\');" />';
+ return '<img class="lightbulb" src="' . $GLOBALS['pmaThemeImage']
+ . 'b_tipp.png" width="16" height="16" alt="Tip" title="Tip" onmouseover="pmaTooltip(\''
+ . PMA_jsFormat($hint_message, false) . '\'); return false;" onmouseout="swapTooltip(\'default\'); return false;" />';
}
/**
- * sets cookie if value is different from current cokkie value,
- * or removes if value is equal to default
- *
- * @uses PMA_Config::isHttps()
- * @uses PMA_Config::getCookiePath()
- * @uses $_COOKIE
- * @uses PMA_removeCookie()
- * @uses setcookie()
- * @uses time()
- * @param string $cookie name of cookie to remove
- * @param mixed $value new cookie value
- * @param string $default default value
- * @param int $validity validity of cookie in seconds (default is one month)
- * @param bool $httponlt whether cookie is only for HTTP (and not for scripts)
- * @return boolean result of setcookie()
+ * Displays a MySQL error message in the right frame.
+ *
+ * @uses footer.inc.php
+ * @uses header.inc.php
+ * @uses $GLOBALS['sql_query']
+ * @uses $GLOBALS['strError']
+ * @uses $GLOBALS['strSQLQuery']
+ * @uses $GLOBALS['pmaThemeImage']
+ * @uses $GLOBALS['strEdit']
+ * @uses $GLOBALS['strMySQLSaid']
+ * @uses $cfg['PropertiesIconic']
+ * @uses PMA_backquote()
+ * @uses PMA_DBI_getError()
+ * @uses PMA_formatSql()
+ * @uses PMA_generate_common_hidden_inputs()
+ * @uses PMA_generate_common_url()
+ * @uses PMA_showMySQLDocu()
+ * @uses PMA_sqlAddslashes()
+ * @uses PMA_SQP_isError()
+ * @uses PMA_SQP_parse()
+ * @uses PMA_SQP_getErrorString()
+ * @uses strtolower()
+ * @uses urlencode()
+ * @uses str_replace()
+ * @uses nl2br()
+ * @uses substr()
+ * @uses preg_replace()
+ * @uses preg_match()
+ * @uses explode()
+ * @uses implode()
+ * @uses is_array()
+ * @uses function_exists()
+ * @uses htmlspecialchars()
+ * @uses trim()
+ * @uses strstr()
+ * @param string the error message
+ * @param string the sql query that failed
+ * @param boolean whether to show a "modify" link or not
+ * @param string the "back" link url (full path is not required)
+ * @param boolean EXIT the page?
+ *
+ * @global string the curent table
+ * @global string the current db
+ *
+ * @access public
*/
-function PMA_setCookie($cookie, $value, $default = null, $validity = null, $httponly = true)
+function PMA_mysqlDie($error_message = '', $the_query = '',
+ $is_modify_link = true, $back_url = '', $exit = true)
{
- if ($validity == null) {
- $validity = 2592000;
- }
- if (strlen($value) && null !== $default && $value === $default
- && isset($_COOKIE[$cookie])) {
- // remove cookie, default value is used
- return PMA_removeCookie($cookie);
- }
-
- if (! strlen($value) && isset($_COOKIE[$cookie])) {
- // remove cookie, value is empty
- return PMA_removeCookie($cookie);
- }
-
- if (! isset($_COOKIE[$cookie]) || $_COOKIE[$cookie] !== $value) {
- // set cookie with new value
- /* Calculate cookie validity */
- if ($validity == 0) {
- $v = 0;
- } else {
- $v = time() + $validity;
- }
- /* Use native support for httponly cookies if available */
- if (version_compare(PHP_VERSION, '5.2.0', 'ge')) {
- return setcookie($cookie, $value, $v,
- PMA_Config::getCookiePath(), '', PMA_Config::isHttps(), $httponly);
- } else {
- return setcookie($cookie, $value, $v,
- PMA_Config::getCookiePath() . ($httponly ? '; HttpOnly' : ''), '', PMA_Config::isHttps());
- }
- }
-
- // cookie has already $value as value
- return true;
-}
-
-/**
- * include here only libraries which contain only function definitions
- * no code in main()!
- */
-/**
- * Input sanitizing
- */
-require_once './libraries/sanitizing.lib.php';
-/**
- * the PMA_Theme class
- */
-require_once './libraries/Theme.class.php';
-/**
- * the PMA_Theme_Manager class
- */
-require_once './libraries/Theme_Manager.class.php';
-/**
- * the PMA_Config class
- */
-require_once './libraries/Config.class.php';
-/**
- * the PMA_Table class
- */
-require_once './libraries/Table.class.php';
-
-
-if (!defined('PMA_MINIMUM_COMMON')) {
+ global $table, $db;
/**
- * Java script escaping.
+ * start http output, display html headers
*/
- require_once './libraries/js_escape.lib.php';
+ require_once './libraries/header.inc.php';
- /**
- * Exponential expression / raise number into power
- *
- * @uses function_exists()
- * @uses bcpow()
- * @uses gmp_pow()
- * @uses gmp_strval()
- * @uses pow()
- * @param number $base
- * @param number $exp
- * @param string pow function use, or false for auto-detect
- * @return mixed string or float
- */
- function PMA_pow($base, $exp, $use_function = false)
- {
- static $pow_function = null;
- if (null == $pow_function) {
- if (function_exists('bcpow')) {
- // BCMath Arbitrary Precision Mathematics Function
- $pow_function = 'bcpow';
- } elseif (function_exists('gmp_pow')) {
- // GMP Function
- $pow_function = 'gmp_pow';
- } else {
- // PHP function
- $pow_function = 'pow';
- }
- }
-
- if (! $use_function) {
- $use_function = $pow_function;
- }
-
- switch ($use_function) {
- case 'bcpow' :
- $pow = bcpow($base, $exp);
- break;
- case 'gmp_pow' :
- $pow = gmp_strval(gmp_pow($base, $exp));
- break;
- case 'pow' :
- $base = (float) $base;
- $exp = (int) $exp;
- if ($exp < 0) {
- return false;
- }
- $pow = pow($base, $exp);
- break;
- default:
- $pow = $use_function($base, $exp);
- }
-
- return $pow;
+ if (!$error_message) {
+ $error_message = PMA_DBI_getError();
}
-
- /**
- * string PMA_getIcon(string $icon)
- *
- * @uses $GLOBALS['pmaThemeImage']
- * @param $icon name of icon
- * @return html img tag
- */
- function PMA_getIcon($icon, $alternate = '')
- {
- if ($GLOBALS['cfg']['PropertiesIconic']) {
- return '<img src="' . $GLOBALS['pmaThemeImage'] . $icon . '"'
- . ' title="' . $alternate . '" alt="' . $alternate . '"'
- . ' class="icon" width="16" height="16" />';
- } else {
- return $alternate;
- }
- }
-
- /**
- * Displays the maximum size for an upload
- *
- * @uses $GLOBALS['strMaximumSize']
- * @uses PMA_formatByteDown()
- * @uses sprintf()
- * @param integer the size
- *
- * @return string the message
- *
- * @access public
- */
- function PMA_displayMaximumUploadSize($max_upload_size)
- {
- list($max_size, $max_unit) = PMA_formatByteDown($max_upload_size);
- return '(' . sprintf($GLOBALS['strMaximumSize'], $max_size, $max_unit) . ')';
- }
-
- /**
- * Generates a hidden field which should indicate to the browser
- * the maximum size for upload
- *
- * @param integer the size
- *
- * @return string the INPUT field
- *
- * @access public
- */
- function PMA_generateHiddenMaxFileSize($max_size)
- {
- return '<input type="hidden" name="MAX_FILE_SIZE" value="' .$max_size . '" />';
- }
-
- /**
- * Add slashes before "'" and "\" characters so a value containing them can
- * be used in a sql comparison.
- *
- * @uses str_replace()
- * @param string the string to slash
- * @param boolean whether the string will be used in a 'LIKE' clause
- * (it then requires two more escaped sequences) or not
- * @param boolean whether to treat cr/lfs as escape-worthy entities
- * (converts \n to \\n, \r to \\r)
- *
- * @param boolean whether this function is used as part of the
- * "Create PHP code" dialog
- *
- * @return string the slashed string
- *
- * @access public
- */
- function PMA_sqlAddslashes($a_string = '', $is_like = false, $crlf = false, $php_code = false)
- {
- if ($is_like) {
- $a_string = str_replace('\\', '\\\\\\\\', $a_string);
- } else {
- $a_string = str_replace('\\', '\\\\', $a_string);
- }
-
- if ($crlf) {
- $a_string = str_replace("\n", '\n', $a_string);
- $a_string = str_replace("\r", '\r', $a_string);
- $a_string = str_replace("\t", '\t', $a_string);
- }
-
- if ($php_code) {
- $a_string = str_replace('\'', '\\\'', $a_string);
- } else {
- $a_string = str_replace('\'', '\'\'', $a_string);
- }
-
- return $a_string;
- } // end of the 'PMA_sqlAddslashes()' function
-
-
- /**
- * Add slashes before "_" and "%" characters for using them in MySQL
- * database, table and field names.
- * Note: This function does not escape backslashes!
- *
- * @uses str_replace()
- * @param string the string to escape
- *
- * @return string the escaped string
- *
- * @access public
- */
- function PMA_escape_mysql_wildcards($name)
- {
- $name = str_replace('_', '\\_', $name);
- $name = str_replace('%', '\\%', $name);
-
- return $name;
- } // end of the 'PMA_escape_mysql_wildcards()' function
-
- /**
- * removes slashes before "_" and "%" characters
- * Note: This function does not unescape backslashes!
- *
- * @uses str_replace()
- * @param string $name the string to escape
- * @return string the escaped string
- * @access public
- */
- function PMA_unescape_mysql_wildcards($name)
- {
- $name = str_replace('\\_', '_', $name);
- $name = str_replace('\\%', '%', $name);
-
- return $name;
- } // end of the 'PMA_unescape_mysql_wildcards()' function
-
- /**
- * removes quotes (',",`) from a quoted string
- *
- * checks if the sting is quoted and removes this quotes
- *
- * @uses str_replace()
- * @uses substr()
- * @param string $quoted_string string to remove quotes from
- * @param string $quote type of quote to remove
- * @return string unqoted string
- */
- function PMA_unQuote($quoted_string, $quote = null)
- {
- $quotes = array();
-
- if (null === $quote) {
- $quotes[] = '`';
- $quotes[] = '"';
- $quotes[] = "'";
- } else {
- $quotes[] = $quote;
- }
-
- foreach ($quotes as $quote) {
- if (substr($quoted_string, 0, 1) === $quote
- && substr($quoted_string, -1, 1) === $quote ) {
- $unquoted_string = substr($quoted_string, 1, -1);
- // replace escaped quotes
- $unquoted_string = str_replace($quote . $quote, $quote, $unquoted_string);
- return $unquoted_string;
- }
- }
-
- return $quoted_string;
+ if (!$the_query && !empty($GLOBALS['sql_query'])) {
+ $the_query = $GLOBALS['sql_query'];
}
- /**
- * format sql strings
- *
- * @todo move into PMA_Sql
- * @uses PMA_SQP_isError()
- * @uses PMA_SQP_formatHtml()
- * @uses PMA_SQP_formatNone()
- * @uses is_array()
- * @param mixed pre-parsed SQL structure
- *
- * @return string the formatted sql
- *
- * @global array the configuration array
- * @global boolean whether the current statement is a multiple one or not
- *
- * @access public
- *
- * @author Robin Johnson <robbat2@users.sourceforge.net>
- */
- function PMA_formatSql($parsed_sql, $unparsed_sql = '')
- {
- global $cfg;
-
- // Check that we actually have a valid set of parsed data
- // well, not quite
- // first check for the SQL parser having hit an error
- if (PMA_SQP_isError()) {
- return $parsed_sql;
- }
- // then check for an array
- if (!is_array($parsed_sql)) {
- // We don't so just return the input directly
- // This is intended to be used for when the SQL Parser is turned off
- $formatted_sql = '<pre>' . "\n"
- . (($cfg['SQP']['fmtType'] == 'none' && $unparsed_sql != '') ? $unparsed_sql : $parsed_sql) . "\n"
- . '</pre>';
- return $formatted_sql;
- }
-
- $formatted_sql = '';
-
- switch ($cfg['SQP']['fmtType']) {
- case 'none':
- if ($unparsed_sql != '') {
- $formatted_sql = "<pre>\n" . PMA_SQP_formatNone(array('raw' => $unparsed_sql)) . "\n</pre>";
- } else {
- $formatted_sql = PMA_SQP_formatNone($parsed_sql);
- }
- break;
- case 'html':
- $formatted_sql = PMA_SQP_formatHtml($parsed_sql, 'color');
- break;
- case 'text':
- //$formatted_sql = PMA_SQP_formatText($parsed_sql);
- $formatted_sql = PMA_SQP_formatHtml($parsed_sql, 'text');
- break;
- default:
- break;
- } // end switch
-
- return $formatted_sql;
- } // end of the "PMA_formatSql()" function
-
-
- /**
- * Displays a link to the official MySQL documentation
- *
- * @uses $cfg['MySQLManualType']
- * @uses $cfg['MySQLManualBase']
- * @uses $cfg['ReplaceHelpImg']
- * @uses $GLOBALS['mysql_4_1_doc_lang']
- * @uses $GLOBALS['mysql_5_1_doc_lang']
- * @uses $GLOBALS['mysql_5_0_doc_lang']
- * @uses $GLOBALS['strDocu']
- * @uses $GLOBALS['pmaThemeImage']
- * @uses PMA_MYSQL_INT_VERSION
- * @uses strtolower()
- * @uses str_replace()
- * @param string chapter of "HTML, one page per chapter" documentation
- * @param string contains name of page/anchor that is being linked
- * @param bool whether to use big icon (like in left frame)
- *
- * @return string the html link
- *
- * @access public
- */
- function PMA_showMySQLDocu($chapter, $link, $big_icon = false)
- {
- global $cfg;
-
- if ($cfg['MySQLManualType'] == 'none' || empty($cfg['MySQLManualBase'])) {
- return '';
- }
-
- // Fixup for newly used names:
- $chapter = str_replace('_', '-', strtolower($chapter));
- $link = str_replace('_', '-', strtolower($link));
-
- switch ($cfg['MySQLManualType']) {
- case 'chapters':
- if (empty($chapter)) {
- $chapter = 'index';
- }
- $url = $cfg['MySQLManualBase'] . '/' . $chapter . '.html#' . $link;
- break;
- case 'big':
- $url = $cfg['MySQLManualBase'] . '#' . $link;
- break;
- case 'searchable':
- if (empty($link)) {
- $link = 'index';
- }
- $url = $cfg['MySQLManualBase'] . '/' . $link . '.html';
- break;
- case 'viewable':
- default:
- if (empty($link)) {
- $link = 'index';
- }
- $mysql = '5.0';
- $lang = 'en';
- if (defined('PMA_MYSQL_INT_VERSION')) {
- if (PMA_MYSQL_INT_VERSION < 50000) {
- $mysql = '4.1';
- if (!empty($GLOBALS['mysql_4_1_doc_lang'])) {
- $lang = $GLOBALS['mysql_4_1_doc_lang'];
- }
- } elseif (PMA_MYSQL_INT_VERSION >= 50100) {
- $mysql = '5.1';
- if (!empty($GLOBALS['mysql_5_1_doc_lang'])) {
- $lang = $GLOBALS['mysql_5_1_doc_lang'];
- }
- } elseif (PMA_MYSQL_INT_VERSION >= 50000) {
- $mysql = '5.0';
- if (!empty($GLOBALS['mysql_5_0_doc_lang'])) {
- $lang = $GLOBALS['mysql_5_0_doc_lang'];
- }
- }
- }
- $url = $cfg['MySQLManualBase'] . '/' . $mysql . '/' . $lang . '/' . $link . '.html';
- break;
- }
-
- if ($big_icon) {
- return '<a href="' . $url . '" target="mysql_doc"><img class="icon" src="' . $GLOBALS['pmaThemeImage'] . 'b_sqlhelp.png" width="16" height="16" alt="' . $GLOBALS['strDocu'] . '" title="' . $GLOBALS['strDocu'] . '" /></a>';
- } elseif ($GLOBALS['cfg']['ReplaceHelpImg']) {
- return '<a href="' . $url . '" target="mysql_doc"><img class="icon" src="' . $GLOBALS['pmaThemeImage'] . 'b_help.png" width="11" height="11" alt="' . $GLOBALS['strDocu'] . '" title="' . $GLOBALS['strDocu'] . '" /></a>';
- } else {
- return '[<a href="' . $url . '" target="mysql_doc">' . $GLOBALS['strDocu'] . '</a>]';
- }
- } // end of the 'PMA_showMySQLDocu()' function
-
- /**
- * Displays a hint icon, on mouse over show the hint
- *
- * @uses $GLOBALS['pmaThemeImage']
- * @uses PMA_jsFormat()
- * @param string the error message
- *
- * @access public
- */
- function PMA_showHint($hint_message)
- {
- //return '<img class="lightbulb" src="' . $GLOBALS['pmaThemeImage'] . 'b_tipp.png" width="16" height="16" border="0" alt="' . $hint_message . '" title="' . $hint_message . '" align="middle" onclick="alert(\'' . PMA_jsFormat($hint_message, false) . '\');" />';
- return '<img class="lightbulb" src="' . $GLOBALS['pmaThemeImage']
- . 'b_tipp.png" width="16" height="16" alt="Tip" title="Tip" onmouseover="pmaTooltip(\''
- . PMA_jsFormat($hint_message, false) . '\'); return false;" onmouseout="swapTooltip(\'default\'); return false;" />';
+ // --- Added to solve bug #641765
+ // Robbat2 - 12 January 2003, 9:46PM
+ // Revised, Robbat2 - 13 January 2003, 2:59PM
+ if (!function_exists('PMA_SQP_isError') || PMA_SQP_isError()) {
+ $formatted_sql = htmlspecialchars($the_query);
+ } elseif (empty($the_query) || trim($the_query) == '') {
+ $formatted_sql = '';
+ } else {
+ $formatted_sql = PMA_formatSql(PMA_SQP_parse($the_query), $the_query);
}
-
- /**
- * Displays a MySQL error message in the right frame.
- *
- * @uses footer.inc.php
- * @uses header.inc.php
- * @uses $GLOBALS['sql_query']
- * @uses $GLOBALS['strError']
- * @uses $GLOBALS['strSQLQuery']
- * @uses $GLOBALS['pmaThemeImage']
- * @uses $GLOBALS['strEdit']
- * @uses $GLOBALS['strMySQLSaid']
- * @uses $cfg['PropertiesIconic']
- * @uses PMA_backquote()
- * @uses PMA_DBI_getError()
- * @uses PMA_formatSql()
- * @uses PMA_generate_common_hidden_inputs()
- * @uses PMA_generate_common_url()
- * @uses PMA_showMySQLDocu()
- * @uses PMA_sqlAddslashes()
- * @uses PMA_SQP_isError()
- * @uses PMA_SQP_parse()
- * @uses PMA_SQP_getErrorString()
- * @uses strtolower()
- * @uses urlencode()
- * @uses str_replace()
- * @uses nl2br()
- * @uses substr()
- * @uses preg_replace()
- * @uses preg_match()
- * @uses explode()
- * @uses implode()
- * @uses is_array()
- * @uses function_exists()
- * @uses htmlspecialchars()
- * @uses trim()
- * @uses strstr()
- * @param string the error message
- * @param string the sql query that failed
- * @param boolean whether to show a "modify" link or not
- * @param string the "back" link url (full path is not required)
- * @param boolean EXIT the page?
- *
- * @global string the curent table
- * @global string the current db
- *
- * @access public
- */
- function PMA_mysqlDie($error_message = '', $the_query = '',
- $is_modify_link = true, $back_url = '', $exit = true)
- {
- global $table, $db;
-
- /**
- * start http output, display html headers
- */
- require_once './libraries/header.inc.php';
-
- if (!$error_message) {
- $error_message = PMA_DBI_getError();
- }
- if (!$the_query && !empty($GLOBALS['sql_query'])) {
- $the_query = $GLOBALS['sql_query'];
- }
-
+ // ---
+ echo "\n" . '<!-- PMA-SQL-ERROR -->' . "\n";
+ echo ' <div class="error"><h1>' . $GLOBALS['strError'] . '</h1>' . "\n";
+ // if the config password is wrong, or the MySQL server does not
+ // respond, do not show the query that would reveal the
+ // username/password
+ if (!empty($the_query) && !strstr($the_query, 'connect')) {
// --- Added to solve bug #641765
// Robbat2 - 12 January 2003, 9:46PM
// Revised, Robbat2 - 13 January 2003, 2:59PM
- if (!function_exists('PMA_SQP_isError') || PMA_SQP_isError()) {
- $formatted_sql = htmlspecialchars($the_query);
- } elseif (empty($the_query) || trim($the_query) == '') {
- $formatted_sql = '';
- } else {
- $formatted_sql = PMA_formatSql(PMA_SQP_parse($the_query), $the_query);
+ if (function_exists('PMA_SQP_isError') && PMA_SQP_isError()) {
+ echo PMA_SQP_getErrorString() . "\n";
+ echo '<br />' . "\n";
}
// ---
- echo "\n" . '<!-- PMA-SQL-ERROR -->' . "\n";
- echo ' <div class="error"><h1>' . $GLOBALS['strError'] . '</h1>' . "\n";
- // if the config password is wrong, or the MySQL server does not
- // respond, do not show the query that would reveal the
- // username/password
- if (!empty($the_query) && !strstr($the_query, 'connect')) {
- // --- Added to solve bug #641765
- // Robbat2 - 12 January 2003, 9:46PM
- // Revised, Robbat2 - 13 January 2003, 2:59PM
- if (function_exists('PMA_SQP_isError') && PMA_SQP_isError()) {
- echo PMA_SQP_getErrorString() . "\n";
- echo '<br />' . "\n";
+ // modified to show me the help on sql errors (Michael Keck)
+ echo ' <p><strong>' . $GLOBALS['strSQLQuery'] . ':</strong>' . "\n";
+ if (strstr(strtolower($formatted_sql), 'select')) { // please show me help to the error on select
+ echo PMA_showMySQLDocu('SQL-Syntax', 'SELECT');
+ }
+ if ($is_modify_link && isset($db)) {
+ if (isset($table)) {
+ $doedit_goto = '<a href="tbl_sql.php?' . PMA_generate_common_url($db, $table) . '&amp;sql_query=' . urlencode($the_query) . '&amp;show_query=1">';
+ } else {
+ $doedit_goto = '<a href="db_sql.php?' . PMA_generate_common_url($db) . '&amp;sql_query=' . urlencode($the_query) . '&amp;show_query=1">';
}
- // ---
- // modified to show me the help on sql errors (Michael Keck)
- echo ' <p><strong>' . $GLOBALS['strSQLQuery'] . ':</strong>' . "\n";
- if (strstr(strtolower($formatted_sql), 'select')) { // please show me help to the error on select
- echo PMA_showMySQLDocu('SQL-Syntax', 'SELECT');
+ if ($GLOBALS['cfg']['PropertiesIconic']) {
+ echo $doedit_goto
+ . '<img class="icon" src=" '. $GLOBALS['pmaThemeImage'] . 'b_edit.png" width="16" height="16" alt="' . $GLOBALS['strEdit'] .'" />'
+ . '</a>';
+ } else {
+ echo ' ['
+ . $doedit_goto . $GLOBALS['strEdit'] . '</a>'
+ . ']' . "\n";
}
- if ($is_modify_link && isset($db)) {
- if (isset($table)) {
- $doedit_goto = '<a href="tbl_sql.php?' . PMA_generate_common_url($db, $table) . '&amp;sql_query=' . urlencode($the_query) . '&amp;show_query=1">';
- } else {
- $doedit_goto = '<a href="db_sql.php?' . PMA_generate_common_url($db) . '&amp;sql_query=' . urlencode($the_query) . '&amp;show_query=1">';
- }
- if ($GLOBALS['cfg']['PropertiesIconic']) {
- echo $doedit_goto
- . '<img class="icon" src=" '. $GLOBALS['pmaThemeImage'] . 'b_edit.png" width="16" height="16" alt="' . $GLOBALS['strEdit'] .'" />'
- . '</a>';
- } else {
- echo ' ['
- . $doedit_goto . $GLOBALS['strEdit'] . '</a>'
- . ']' . "\n";
- }
- } // end if
- echo ' </p>' . "\n"
- .' <p>' . "\n"
- .' ' . $formatted_sql . "\n"
- .' </p>' . "\n";
} // end if
+ echo ' </p>' . "\n"
+ .' <p>' . "\n"
+ .' ' . $formatted_sql . "\n"
+ .' </p>' . "\n";
+ } // end if
- $tmp_mysql_error = ''; // for saving the original $error_message
- if (!empty($error_message)) {
- $tmp_mysql_error = strtolower($error_message); // save the original $error_message
- $error_message = htmlspecialchars($error_message);
- $error_message = preg_replace("@((\015\012)|(\015)|(\012)){3,}@", "\n\n", $error_message);
- }
- // modified to show me the help on error-returns (Michael Keck)
- // (now error-messages-server)
- echo '<p>' . "\n"
- . ' <strong>' . $GLOBALS['strMySQLSaid'] . '</strong>'
- . PMA_showMySQLDocu('Error-messages-server', 'Error-messages-server')
- . "\n"
- . '</p>' . "\n";
-
- // The error message will be displayed within a CODE segment.
- // To preserve original formatting, but allow wordwrapping, we do a couple of replacements
-
- // Replace all non-single blanks with their HTML-counterpart
- $error_message = str_replace(' ', '&nbsp;&nbsp;', $error_message);
- // Replace TAB-characters with their HTML-counterpart
- $error_message = str_replace("\t", '&nbsp;&nbsp;&nbsp;&nbsp;', $error_message);
- // Replace linebreaks
- $error_message = nl2br($error_message);
-
- echo '<code>' . "\n"
- . $error_message . "\n"
- . '</code><br />' . "\n";
-
- // feature request #1036254:
- // Add a link by MySQL-Error #1062 - Duplicate entry
- // 2004-10-20 by mkkeck
- // 2005-01-17 modified by mkkeck bugfix
- if (substr($error_message, 1, 4) == '1062') {
- // get the duplicate entry
-
- // get table name
- /**
- * @todo what would be the best delimiter, while avoiding special
- * characters that can become high-ascii after editing, depending
- * upon which editor is used by the developer?
- */
- $error_table = array();
- if (preg_match('@ALTER\s*TABLE\s*\`([^\`]+)\`@iu', $the_query, $error_table)) {
- $error_table = $error_table[1];
- } elseif (preg_match('@INSERT\s*INTO\s*\`([^\`]+)\`@iu', $the_query, $error_table)) {
- $error_table = $error_table[1];
- } elseif (preg_match('@UPDATE\s*\`([^\`]+)\`@iu', $the_query, $error_table)) {
- $error_table = $error_table[1];
- } elseif (preg_match('@INSERT\s*\`([^\`]+)\`@iu', $the_query, $error_table)) {
- $error_table = $error_table[1];
- }
-
- // get fields
- $error_fields = array();
- if (preg_match('@\(([^\)]+)\)@i', $the_query, $error_fields)) {
- $error_fields = explode(',', $error_fields[1]);
- } elseif (preg_match('@(`[^`]+`)\s*=@i', $the_query, $error_fields)) {
- $error_fields = explode(',', $error_fields[1]);
- }
- if (is_array($error_table) || is_array($error_fields)) {
-
- // duplicate value
- $duplicate_value = array();
- preg_match('@\'([^\']+)\'@i', $tmp_mysql_error, $duplicate_value);
- $duplicate_value = $duplicate_value[1];
-
- $sql = '
- SELECT *
- FROM ' . PMA_backquote($error_table) . '
- WHERE CONCAT_WS("-", ' . implode(', ', $error_fields) . ')
- = "' . PMA_sqlAddslashes($duplicate_value) . '"
- ORDER BY ' . implode(', ', $error_fields);
- unset($error_table, $error_fields, $duplicate_value);
-
- echo ' <form method="post" action="import.php" style="padding: 0; margin: 0">' ."\n"
- .' <input type="hidden" name="sql_query" value="' . htmlspecialchars($sql) . '" />' . "\n"
- .' ' . PMA_generate_common_hidden_inputs($db, $table) . "\n"
- .' <input type="submit" name="submit" value="' . $GLOBALS['strBrowse'] . '" />' . "\n"
- .' </form>' . "\n";
- unset($sql);
- }
- } // end of show duplicate entry
-
- echo '</div>';
- echo '<fieldset class="tblFooters">';
-
- if (!empty($back_url) && $exit) {
- $goto_back_url='<a href="' . (strstr($back_url, '?') ? $back_url . '&amp;no_history=true' : $back_url . '?no_history=true') . '">';
- echo '[ ' . $goto_back_url . $GLOBALS['strBack'] . '</a> ]';
- }
- echo ' </fieldset>' . "\n\n";
- if ($exit) {
- /**
- * display footer and exit
- */
- require_once './libraries/footer.inc.php';
- }
- } // end of the 'PMA_mysqlDie()' function
+ $tmp_mysql_error = ''; // for saving the original $error_message
+ if (!empty($error_message)) {
+ $tmp_mysql_error = strtolower($error_message); // save the original $error_message
+ $error_message = htmlspecialchars($error_message);
+ $error_message = preg_replace("@((\015\012)|(\015)|(\012)){3,}@", "\n\n", $error_message);
+ }
+ // modified to show me the help on error-returns (Michael Keck)
+ // (now error-messages-server)
+ echo '<p>' . "\n"
+ . ' <strong>' . $GLOBALS['strMySQLSaid'] . '</strong>'
+ . PMA_showMySQLDocu('Error-messages-server', 'Error-messages-server')
+ . "\n"
+ . '</p>' . "\n";
+
+ // The error message will be displayed within a CODE segment.
+ // To preserve original formatting, but allow wordwrapping, we do a couple of replacements
+
+ // Replace all non-single blanks with their HTML-counterpart
+ $error_message = str_replace(' ', '&nbsp;&nbsp;', $error_message);
+ // Replace TAB-characters with their HTML-counterpart
+ $error_message = str_replace("\t", '&nbsp;&nbsp;&nbsp;&nbsp;', $error_message);
+ // Replace linebreaks
+ $error_message = nl2br($error_message);
+
+ echo '<code>' . "\n"
+ . $error_message . "\n"
+ . '</code><br />' . "\n";
+
+ // feature request #1036254:
+ // Add a link by MySQL-Error #1062 - Duplicate entry
+ // 2004-10-20 by mkkeck
+ // 2005-01-17 modified by mkkeck bugfix
+ if (substr($error_message, 1, 4) == '1062') {
+ // get the duplicate entry
+
+ // get table name
+ /**
+ * @todo what would be the best delimiter, while avoiding special
+ * characters that can become high-ascii after editing, depending
+ * upon which editor is used by the developer?
+ */
+ $error_table = array();
+ if (preg_match('@ALTER\s*TABLE\s*\`([^\`]+)\`@iu', $the_query, $error_table)) {
+ $error_table = $error_table[1];
+ } elseif (preg_match('@INSERT\s*INTO\s*\`([^\`]+)\`@iu', $the_query, $error_table)) {
+ $error_table = $error_table[1];
+ } elseif (preg_match('@UPDATE\s*\`([^\`]+)\`@iu', $the_query, $error_table)) {
+ $error_table = $error_table[1];
+ } elseif (preg_match('@INSERT\s*\`([^\`]+)\`@iu', $the_query, $error_table)) {
+ $error_table = $error_table[1];
+ }
+
+ // get fields
+ $error_fields = array();
+ if (preg_match('@\(([^\)]+)\)@i', $the_query, $error_fields)) {
+ $error_fields = explode(',', $error_fields[1]);
+ } elseif (preg_match('@(`[^`]+`)\s*=@i', $the_query, $error_fields)) {
+ $error_fields = explode(',', $error_fields[1]);
+ }
+ if (is_array($error_table) || is_array($error_fields)) {
+
+ // duplicate value
+ $duplicate_value = array();
+ preg_match('@\'([^\']+)\'@i', $tmp_mysql_error, $duplicate_value);
+ $duplicate_value = $duplicate_value[1];
+
+ $sql = '
+ SELECT *
+ FROM ' . PMA_backquote($error_table) . '
+ WHERE CONCAT_WS("-", ' . implode(', ', $error_fields) . ')
+ = "' . PMA_sqlAddslashes($duplicate_value) . '"
+ ORDER BY ' . implode(', ', $error_fields);
+ unset($error_table, $error_fields, $duplicate_value);
+
+ echo ' <form method="post" action="import.php" style="padding: 0; margin: 0">' ."\n"
+ .' <input type="hidden" name="sql_query" value="' . htmlspecialchars($sql) . '" />' . "\n"
+ .' ' . PMA_generate_common_hidden_inputs($db, $table) . "\n"
+ .' <input type="submit" name="submit" value="' . $GLOBALS['strBrowse'] . '" />' . "\n"
+ .' </form>' . "\n";
+ unset($sql);
+ }
+ } // end of show duplicate entry
+
+ echo '</div>';
+ echo '<fieldset class="tblFooters">';
+
+ if (!empty($back_url) && $exit) {
+ $goto_back_url='<a href="' . (strstr($back_url, '?') ? $back_url . '&amp;no_history=true' : $back_url . '?no_history=true') . '">';
+ echo '[ ' . $goto_back_url . $GLOBALS['strBack'] . '</a> ]';
+ }
+ echo ' </fieldset>' . "\n\n";
+ if ($exit) {
+ /**
+ * display footer and exit
+ */
+ require_once './libraries/footer.inc.php';
+ }
+} // end of the 'PMA_mysqlDie()' function
- /**
- * Returns a string formatted with CONVERT ... USING
- * if MySQL supports it
- *
- * @uses PMA_MYSQL_INT_VERSION
- * @uses $GLOBALS['collation_connection']
- * @uses explode()
- * @param string the string itself
- * @param string the mode: quoted or unquoted (this one by default)
- *
- * @return the formatted string
- *
- * @access private
- */
- function PMA_convert_using($string, $mode='unquoted')
- {
- if ($mode == 'quoted') {
- $possible_quote = "'";
- } else {
- $possible_quote = "";
- }
+/**
+ * Returns a string formatted with CONVERT ... USING
+ * if MySQL supports it
+ *
+ * @uses PMA_MYSQL_INT_VERSION
+ * @uses $GLOBALS['collation_connection']
+ * @uses explode()
+ * @param string the string itself
+ * @param string the mode: quoted or unquoted (this one by default)
+ *
+ * @return the formatted string
+ *
+ * @access private
+ */
+function PMA_convert_using($string, $mode='unquoted')
+{
+ if ($mode == 'quoted') {
+ $possible_quote = "'";
+ } else {
+ $possible_quote = "";
+ }
- if (PMA_MYSQL_INT_VERSION >= 40100) {
- list($conn_charset) = explode('_', $GLOBALS['collation_connection']);
- $converted_string = "CONVERT(" . $possible_quote . $string . $possible_quote . " USING " . $conn_charset . ")";
- } else {
- $converted_string = $possible_quote . $string . $possible_quote;
- }
- return $converted_string;
- } // end function
+ if (PMA_MYSQL_INT_VERSION >= 40100) {
+ list($conn_charset) = explode('_', $GLOBALS['collation_connection']);
+ $converted_string = "CONVERT(" . $possible_quote . $string . $possible_quote . " USING " . $conn_charset . ")";
+ } else {
+ $converted_string = $possible_quote . $string . $possible_quote;
+ }
+ return $converted_string;
+} // end function
- /**
- * Send HTTP header, taking IIS limits into account (600 seems ok)
- *
- * @uses PMA_IS_IIS
- * @uses PMA_COMING_FROM_COOKIE_LOGIN
- * @uses PMA_get_arg_separator()
- * @uses SID
- * @uses strlen()
- * @uses strpos()
- * @uses header()
- * @uses session_write_close()
- * @uses headers_sent()
- * @uses function_exists()
- * @uses debug_print_backtrace()
- * @uses trigger_error()
- * @uses defined()
- * @param string $uri the header to send
- * @return boolean always true
- */
- function PMA_sendHeaderLocation($uri)
- {
- if (PMA_IS_IIS && strlen($uri) > 600) {
-
- echo '<html><head><title>- - -</title>' . "\n";
- echo '<meta http-equiv="expires" content="0">' . "\n";
- echo '<meta http-equiv="Pragma" content="no-cache">' . "\n";
- echo '<meta http-equiv="Cache-Control" content="no-cache">' . "\n";
- echo '<meta http-equiv="Refresh" content="0;url=' .$uri . '">' . "\n";
- echo '<script type="text/javascript" language="javascript">' . "\n";
- echo '//<![CDATA[' . "\n";
- echo 'setTimeout ("window.location = unescape(\'"' . $uri . '"\')",2000); </script>' . "\n";
- echo '//]]>' . "\n";
- echo '</head>' . "\n";
- echo '<body>' . "\n";
- echo '<script type="text/javascript" language="javascript">' . "\n";
- echo '//<![CDATA[' . "\n";
- echo 'document.write (\'<p><a href="' . $uri . '">' . $GLOBALS['strGo'] . '</a></p>\');' . "\n";
- echo '//]]>' . "\n";
- echo '</script></body></html>' . "\n";
+/**
+ * Send HTTP header, taking IIS limits into account (600 seems ok)
+ *
+ * @uses PMA_IS_IIS
+ * @uses PMA_COMING_FROM_COOKIE_LOGIN
+ * @uses PMA_get_arg_separator()
+ * @uses SID
+ * @uses strlen()
+ * @uses strpos()
+ * @uses header()
+ * @uses session_write_close()
+ * @uses headers_sent()
+ * @uses function_exists()
+ * @uses debug_print_backtrace()
+ * @uses trigger_error()
+ * @uses defined()
+ * @param string $uri the header to send
+ * @return boolean always true
+ */
+function PMA_sendHeaderLocation($uri)
+{
+ if (PMA_IS_IIS && strlen($uri) > 600) {
+
+ echo '<html><head><title>- - -</title>' . "\n";
+ echo '<meta http-equiv="expires" content="0">' . "\n";
+ echo '<meta http-equiv="Pragma" content="no-cache">' . "\n";
+ echo '<meta http-equiv="Cache-Control" content="no-cache">' . "\n";
+ echo '<meta http-equiv="Refresh" content="0;url=' .$uri . '">' . "\n";
+ echo '<script type="text/javascript" language="javascript">' . "\n";
+ echo '//<![CDATA[' . "\n";
+ echo 'setTimeout ("window.location = unescape(\'"' . $uri . '"\')",2000); </script>' . "\n";
+ echo '//]]>' . "\n";
+ echo '</head>' . "\n";
+ echo '<body>' . "\n";
+ echo '<script type="text/javascript" language="javascript">' . "\n";
+ echo '//<![CDATA[' . "\n";
+ echo 'document.write (\'<p><a href="' . $uri . '">' . $GLOBALS['strGo'] . '</a></p>\');' . "\n";
+ echo '//]]>' . "\n";
+ echo '</script></body></html>' . "\n";
+ } else {
+ if (SID) {
+ if (strpos($uri, '?') === false) {
+ header('Location: ' . $uri . '?' . SID);
+ } else {
+ $separator = PMA_get_arg_separator();
+ header('Location: ' . $uri . $separator . SID);
+ }
} else {
- if (SID) {
- if (strpos($uri, '?') === false) {
- header('Location: ' . $uri . '?' . SID);
- } else {
- $separator = PMA_get_arg_separator();
- header('Location: ' . $uri . $separator . SID);
+ session_write_close();
+ if (headers_sent()) {
+ if (function_exists('debug_print_backtrace')) {
+ echo '<pre>';
+ debug_print_backtrace();
+ echo '</pre>';
}
+ trigger_error('PMA_sendHeaderLocation called when headers are already sent!', E_USER_ERROR);
+ }
+ // bug #1523784: IE6 does not like 'Refresh: 0', it
+ // results in a blank page
+ // but we need it when coming from the cookie login panel)
+ if (PMA_IS_IIS && defined('PMA_COMING_FROM_COOKIE_LOGIN')) {
+ header('Refresh: 0; ' . $uri);
} else {
- session_write_close();
- if (headers_sent()) {
- if (function_exists('debug_print_backtrace')) {
- echo '<pre>';
- debug_print_backtrace();
- echo '</pre>';
- }
- trigger_error('PMA_sendHeaderLocation called when headers are already sent!', E_USER_ERROR);
- }
- // bug #1523784: IE6 does not like 'Refresh: 0', it
- // results in a blank page
- // but we need it when coming from the cookie login panel)
- if (PMA_IS_IIS && defined('PMA_COMING_FROM_COOKIE_LOGIN')) {
- header('Refresh: 0; ' . $uri);
- } else {
- header('Location: ' . $uri);
- }
+ header('Location: ' . $uri);
}
}
}
+}
- /**
- * returns array with tables of given db with extended infomation and grouped
- *
- * @uses $cfg['LeftFrameTableSeparator']
- * @uses $cfg['LeftFrameTableLevel']
- * @uses $cfg['ShowTooltipAliasTB']
- * @uses $cfg['NaturalOrder']
- * @uses PMA_backquote()
- * @uses count()
- * @uses array_merge
- * @uses uksort()
- * @uses strstr()
- * @uses explode()
- * @param string $db name of db
- * return array (rekursive) grouped table list
- */
- function PMA_getTableList($db, $tables = null)
- {
- $sep = $GLOBALS['cfg']['LeftFrameTableSeparator'];
-
- if ( null === $tables ) {
- $tables = PMA_DBI_get_tables_full($db);
- if ($GLOBALS['cfg']['NaturalOrder']) {
- uksort($tables, 'strnatcasecmp');
- }
- }
+/**
+ * returns array with tables of given db with extended infomation and grouped
+ *
+ * @uses $cfg['LeftFrameTableSeparator']
+ * @uses $cfg['LeftFrameTableLevel']
+ * @uses $cfg['ShowTooltipAliasTB']
+ * @uses $cfg['NaturalOrder']
+ * @uses PMA_backquote()
+ * @uses count()
+ * @uses array_merge
+ * @uses uksort()
+ * @uses strstr()
+ * @uses explode()
+ * @param string $db name of db
+ * return array (rekursive) grouped table list
+ */
+function PMA_getTableList($db, $tables = null)
+{
+ $sep = $GLOBALS['cfg']['LeftFrameTableSeparator'];
- if (count($tables) < 1) {
- return $tables;
+ if ( null === $tables ) {
+ $tables = PMA_DBI_get_tables_full($db);
+ if ($GLOBALS['cfg']['NaturalOrder']) {
+ uksort($tables, 'strnatcasecmp');
}
+ }
- $default = array(
- 'Name' => '',
- 'Rows' => 0,
- 'Comment' => '',
- 'disp_name' => '',
- );
+ if (count($tables) < 1) {
+ return $tables;
+ }
+
+ $default = array(
+ 'Name' => '',
+ 'Rows' => 0,
+ 'Comment' => '',
+ 'disp_name' => '',
+ );
- $table_groups = array();
+ $table_groups = array();
- foreach ($tables as $table_name => $table) {
+ foreach ($tables as $table_name => $table) {
- // check for correct row count
- if (null === $table['Rows']) {
- // Do not check exact row count here,
- // if row count is invalid possibly the table is defect
- // and this would break left frame;
- // but we can check row count if this is a view,
- // since PMA_Table::countRecords() returns a limited row count
- // in this case.
+ // check for correct row count
+ if (null === $table['Rows']) {
+ // Do not check exact row count here,
+ // if row count is invalid possibly the table is defect
+ // and this would break left frame;
+ // but we can check row count if this is a view,
+ // since PMA_Table::countRecords() returns a limited row count
+ // in this case.
- // set this because PMA_Table::countRecords() can use it
- $tbl_is_view = PMA_Table::isView($db, $table['Name']);
+ // set this because PMA_Table::countRecords() can use it
+ $tbl_is_view = PMA_Table::isView($db, $table['Name']);
- if ($tbl_is_view) {
- $table['Rows'] = PMA_Table::countRecords($db, $table['Name'],
- $return = true);
- }
+ if ($tbl_is_view) {
+ $table['Rows'] = PMA_Table::countRecords($db, $table['Name'],
+ $return = true);
}
+ }
- // in $group we save the reference to the place in $table_groups
- // where to store the table info
- if ($GLOBALS['cfg']['LeftFrameDBTree']
- && $sep && strstr($table_name, $sep))
- {
- $parts = explode($sep, $table_name);
-
- $group =& $table_groups;
- $i = 0;
- $group_name_full = '';
- while ($i < count($parts) - 1
- && $i < $GLOBALS['cfg']['LeftFrameTableLevel']) {
- $group_name = $parts[$i] . $sep;
- $group_name_full .= $group_name;
-
- if (!isset($group[$group_name])) {
- $group[$group_name] = array();
- $group[$group_name]['is' . $sep . 'group'] = true;
- $group[$group_name]['tab' . $sep . 'count'] = 1;
- $group[$group_name]['tab' . $sep . 'group'] = $group_name_full;
- } elseif (!isset($group[$group_name]['is' . $sep . 'group'])) {
- $table = $group[$group_name];
- $group[$group_name] = array();
- $group[$group_name][$group_name] = $table;
- unset($table);
- $group[$group_name]['is' . $sep . 'group'] = true;
- $group[$group_name]['tab' . $sep . 'count'] = 1;
- $group[$group_name]['tab' . $sep . 'group'] = $group_name_full;
- } else {
- $group[$group_name]['tab' . $sep . 'count']++;
- }
- $group =& $group[$group_name];
- $i++;
- }
- } else {
- if (!isset($table_groups[$table_name])) {
- $table_groups[$table_name] = array();
+ // in $group we save the reference to the place in $table_groups
+ // where to store the table info
+ if ($GLOBALS['cfg']['LeftFrameDBTree']
+ && $sep && strstr($table_name, $sep))
+ {
+ $parts = explode($sep, $table_name);
+
+ $group =& $table_groups;
+ $i = 0;
+ $group_name_full = '';
+ while ($i < count($parts) - 1
+ && $i < $GLOBALS['cfg']['LeftFrameTableLevel']) {
+ $group_name = $parts[$i] . $sep;
+ $group_name_full .= $group_name;
+
+ if (!isset($group[$group_name])) {
+ $group[$group_name] = array();
+ $group[$group_name]['is' . $sep . 'group'] = true;
+ $group[$group_name]['tab' . $sep . 'count'] = 1;
+ $group[$group_name]['tab' . $sep . 'group'] = $group_name_full;
+ } elseif (!isset($group[$group_name]['is' . $sep . 'group'])) {
+ $table = $group[$group_name];
+ $group[$group_name] = array();
+ $group[$group_name][$group_name] = $table;
+ unset($table);
+ $group[$group_name]['is' . $sep . 'group'] = true;
+ $group[$group_name]['tab' . $sep . 'count'] = 1;
+ $group[$group_name]['tab' . $sep . 'group'] = $group_name_full;
+ } else {
+ $group[$group_name]['tab' . $sep . 'count']++;
}
- $group =& $table_groups;
+ $group =& $group[$group_name];
+ $i++;
}
-
-
- if ($GLOBALS['cfg']['ShowTooltipAliasTB']
- && $GLOBALS['cfg']['ShowTooltipAliasTB'] !== 'nested') {
- // switch tooltip and name
- $table['Comment'] = $table['Name'];
- $table['disp_name'] = $table['Comment'];
- } else {
- $table['disp_name'] = $table['Name'];
+ } else {
+ if (!isset($table_groups[$table_name])) {
+ $table_groups[$table_name] = array();
}
+ $group =& $table_groups;
+ }
- $group[$table_name] = array_merge($default, $table);
+
+ if ($GLOBALS['cfg']['ShowTooltipAliasTB']
+ && $GLOBALS['cfg']['ShowTooltipAliasTB'] !== 'nested') {
+ // switch tooltip and name
+ $table['Comment'] = $table['Name'];
+ $table['disp_name'] = $table['Comment'];
+ } else {
+ $table['disp_name'] = $table['Name'];
}
- return $table_groups;
+ $group[$table_name] = array_merge($default, $table);
}
- /* ----------------------- Set of misc functions ----------------------- */
+ return $table_groups;
+}
+/* ----------------------- Set of misc functions ----------------------- */
- /**
- * Adds backquotes on both sides of a database, table or field name.
- * and escapes backquotes inside the name with another backquote
- *
- * example:
- * <code>
- * echo PMA_backquote('owner`s db'); // `owner``s db`
- *
- * </code>
- *
- * @uses PMA_backquote()
- * @uses is_array()
- * @uses strlen()
- * @uses str_replace()
- * @param mixed $a_name the database, table or field name to "backquote"
- * or array of it
- * @param boolean $do_it a flag to bypass this function (used by dump
- * functions)
- * @return mixed the "backquoted" database, table or field name if the
- * current MySQL release is >= 3.23.6, the original one
- * else
- * @access public
- */
- function PMA_backquote($a_name, $do_it = true)
- {
- if (! $do_it) {
- return $a_name;
- }
- if (is_array($a_name)) {
- $result = array();
- foreach ($a_name as $key => $val) {
- $result[$key] = PMA_backquote($val);
- }
- return $result;
- }
+/**
+ * Adds backquotes on both sides of a database, table or field name.
+ * and escapes backquotes inside the name with another backquote
+ *
+ * example:
+ * <code>
+ * echo PMA_backquote('owner`s db'); // `owner``s db`
+ *
+ * </code>
+ *
+ * @uses PMA_backquote()
+ * @uses is_array()
+ * @uses strlen()
+ * @uses str_replace()
+ * @param mixed $a_name the database, table or field name to "backquote"
+ * or array of it
+ * @param boolean $do_it a flag to bypass this function (used by dump
+ * functions)
+ * @return mixed the "backquoted" database, table or field name if the
+ * current MySQL release is >= 3.23.6, the original one
+ * else
+ * @access public
+ */
+function PMA_backquote($a_name, $do_it = true)
+{
+ if (! $do_it) {
+ return $a_name;
+ }
- // '0' is also empty for php :-(
- if (strlen($a_name) && $a_name !== '*') {
- return '`' . str_replace('`', '``', $a_name) . '`';
- } else {
- return $a_name;
- }
- } // end of the 'PMA_backquote()' function
+ if (is_array($a_name)) {
+ $result = array();
+ foreach ($a_name as $key => $val) {
+ $result[$key] = PMA_backquote($val);
+ }
+ return $result;
+ }
+ // '0' is also empty for php :-(
+ if (strlen($a_name) && $a_name !== '*') {
+ return '`' . str_replace('`', '``', $a_name) . '`';
+ } else {
+ return $a_name;
+ }
+} // end of the 'PMA_backquote()' function
- /**
- * Defines the <CR><LF> value depending on the user OS.
- *
- * @uses PMA_USR_OS
- * @return string the <CR><LF> value to use
- *
- * @access public
- */
- function PMA_whichCrlf()
- {
- $the_crlf = "\n";
- // The 'PMA_USR_OS' constant is defined in "./libraries/defines.lib.php"
- // Win case
- if (PMA_USR_OS == 'Win') {
- $the_crlf = "\r\n";
- }
- // Others
- else {
- $the_crlf = "\n";
- }
+/**
+ * Defines the <CR><LF> value depending on the user OS.
+ *
+ * @uses PMA_USR_OS
+ * @return string the <CR><LF> value to use
+ *
+ * @access public
+ */
+function PMA_whichCrlf()
+{
+ $the_crlf = "\n";
- return $the_crlf;
- } // end of the 'PMA_whichCrlf()' function
+ // The 'PMA_USR_OS' constant is defined in "./libraries/defines.lib.php"
+ // Win case
+ if (PMA_USR_OS == 'Win') {
+ $the_crlf = "\r\n";
+ }
+ // Others
+ else {
+ $the_crlf = "\n";
+ }
- /**
- * Reloads navigation if needed.
- *
- * @uses $GLOBALS['reload']
- * @uses $GLOBALS['db']
- * @uses PMA_generate_common_url()
- * @global array configuration
- *
- * @access public
- */
- function PMA_reloadNavigation()
- {
- global $cfg;
+ return $the_crlf;
+} // end of the 'PMA_whichCrlf()' function
- // Reloads the navigation frame via JavaScript if required
- if (isset($GLOBALS['reload']) && $GLOBALS['reload']) {
- echo "\n";
- $reload_url = './navigation.php?' . PMA_generate_common_url((isset($GLOBALS['db']) ? $GLOBALS['db'] : ''), '', '&');
- ?>
+/**
+ * Reloads navigation if needed.
+ *
+ * @uses $GLOBALS['reload']
+ * @uses $GLOBALS['db']
+ * @uses PMA_generate_common_url()
+ * @global array configuration
+ *
+ * @access public
+ */
+function PMA_reloadNavigation()
+{
+ global $cfg;
+
+ // Reloads the navigation frame via JavaScript if required
+ if (isset($GLOBALS['reload']) && $GLOBALS['reload']) {
+ echo "\n";
+ $reload_url = './navigation.php?' . PMA_generate_common_url((isset($GLOBALS['db']) ? $GLOBALS['db'] : ''), '', '&');
+ ?>
<script type="text/javascript" language="javascript">
//<![CDATA[
if (typeof(window.parent) != 'undefined'
@@ -1461,2004 +930,1231 @@ if (typeof(window.parent) != 'undefined'
}
//]]>
</script>
- <?php
- unset($GLOBALS['reload']);
- }
+ <?php
+ unset($GLOBALS['reload']);
}
+}
- /**
- * displays the message and the query
- * usually the message is the result of the query executed
- *
- * @param string $message the message to display
- * @param string $sql_query the query to display
- * @global array the configuration array
- * @uses $cfg
- * @access public
- */
- function PMA_showMessage($message, $sql_query = null)
- {
- global $cfg;
-
- if (null === $sql_query) {
- if (! empty($GLOBALS['display_query'])) {
- $sql_query = $GLOBALS['display_query'];
- } elseif ($cfg['SQP']['fmtType'] == 'none' && ! empty($GLOBALS['unparsed_sql'])) {
- $sql_query = $GLOBALS['unparsed_sql'];
- } elseif (! empty($GLOBALS['sql_query'])) {
- $sql_query = $GLOBALS['sql_query'];
- } else {
- $sql_query = '';
- }
+/**
+ * displays the message and the query
+ * usually the message is the result of the query executed
+ *
+ * @param string $message the message to display
+ * @param string $sql_query the query to display
+ * @global array the configuration array
+ * @uses $cfg
+ * @access public
+ */
+function PMA_showMessage($message, $sql_query = null)
+{
+ global $cfg;
+
+ if (null === $sql_query) {
+ if (! empty($GLOBALS['display_query'])) {
+ $sql_query = $GLOBALS['display_query'];
+ } elseif ($cfg['SQP']['fmtType'] == 'none' && ! empty($GLOBALS['unparsed_sql'])) {
+ $sql_query = $GLOBALS['unparsed_sql'];
+ } elseif (! empty($GLOBALS['sql_query'])) {
+ $sql_query = $GLOBALS['sql_query'];
+ } else {
+ $sql_query = '';
}
+ }
- // Corrects the tooltip text via JS if required
- // @todo this is REALLY the wrong place to do this - very unexpected here
- if ( isset($GLOBALS['table']) && strlen($GLOBALS['table']) && $cfg['ShowTooltip']) {
- $result = PMA_DBI_try_query('SHOW TABLE STATUS FROM ' . PMA_backquote($GLOBALS['db']) . ' LIKE \'' . PMA_sqlAddslashes($GLOBALS['table'], true) . '\'');
+ // Corrects the tooltip text via JS if required
+ // @todo this is REALLY the wrong place to do this - very unexpected here
+ if ( isset($GLOBALS['table']) && strlen($GLOBALS['table']) && $cfg['ShowTooltip']) {
+ $result = PMA_DBI_try_query('SHOW TABLE STATUS FROM ' . PMA_backquote($GLOBALS['db']) . ' LIKE \'' . PMA_sqlAddslashes($GLOBALS['table'], true) . '\'');
+ if ($result) {
+ $tbl_status = PMA_DBI_fetch_assoc($result);
+ $tooltip = (empty($tbl_status['Comment']))
+ ? ''
+ : $tbl_status['Comment'] . ' ';
+ $tooltip .= '(' . PMA_formatNumber($tbl_status['Rows'], 0) . ' ' . $GLOBALS['strRows'] . ')';
+ PMA_DBI_free_result($result);
+ $uni_tbl = PMA_jsFormat($GLOBALS['db'] . '.' . $GLOBALS['table'], false);
+ echo "\n";
+ echo '<script type="text/javascript" language="javascript">' . "\n";
+ echo '//<![CDATA[' . "\n";
+ echo "window.parent.updateTableTitle('" . $uni_tbl . "', '" . PMA_jsFormat($tooltip, false) . "');" . "\n";
+ echo '//]]>' . "\n";
+ echo '</script>' . "\n";
+ } // end if
+ } // end if ... elseif
+
+ // Checks if the table needs to be repaired after a TRUNCATE query.
+ // @todo this should only be done if isset($GLOBALS['sql_query']), what about $GLOBALS['display_query']???
+ // @todo this is REALLY the wrong place to do this - very unexpected here
+ if (isset($GLOBALS['table']) && isset($GLOBALS['sql_query'])
+ && $GLOBALS['sql_query'] == 'TRUNCATE TABLE ' . PMA_backquote($GLOBALS['table'])) {
+ if (!isset($tbl_status)) {
+ $result = @PMA_DBI_try_query('SHOW TABLE STATUS FROM ' . PMA_backquote($GLOBALS['db']) . ' LIKE \'' . PMA_sqlAddslashes($GLOBALS['table'], true) . '\'');
if ($result) {
$tbl_status = PMA_DBI_fetch_assoc($result);
- $tooltip = (empty($tbl_status['Comment']))
- ? ''
- : $tbl_status['Comment'] . ' ';
- $tooltip .= '(' . PMA_formatNumber($tbl_status['Rows'], 0) . ' ' . $GLOBALS['strRows'] . ')';
PMA_DBI_free_result($result);
- $uni_tbl = PMA_jsFormat($GLOBALS['db'] . '.' . $GLOBALS['table'], false);
- echo "\n";
- echo '<script type="text/javascript" language="javascript">' . "\n";
- echo '//<![CDATA[' . "\n";
- echo "window.parent.updateTableTitle('" . $uni_tbl . "', '" . PMA_jsFormat($tooltip, false) . "');" . "\n";
- echo '//]]>' . "\n";
- echo '</script>' . "\n";
- } // end if
- } // end if ... elseif
-
- // Checks if the table needs to be repaired after a TRUNCATE query.
- // @todo this should only be done if isset($GLOBALS['sql_query']), what about $GLOBALS['display_query']???
- // @todo this is REALLY the wrong place to do this - very unexpected here
- if (isset($GLOBALS['table']) && isset($GLOBALS['sql_query'])
- && $GLOBALS['sql_query'] == 'TRUNCATE TABLE ' . PMA_backquote($GLOBALS['table'])) {
- if (!isset($tbl_status)) {
- $result = @PMA_DBI_try_query('SHOW TABLE STATUS FROM ' . PMA_backquote($GLOBALS['db']) . ' LIKE \'' . PMA_sqlAddslashes($GLOBALS['table'], true) . '\'');
- if ($result) {
- $tbl_status = PMA_DBI_fetch_assoc($result);
- PMA_DBI_free_result($result);
- }
- }
- if (isset($tbl_status) && (int) $tbl_status['Index_length'] > 1024) {
- PMA_DBI_try_query('REPAIR TABLE ' . PMA_backquote($GLOBALS['table']));
}
}
- unset($tbl_status);
- echo '<br />' . "\n";
-
- echo '<div align="' . $GLOBALS['cell_align_left'] . '">' . "\n";
- if (!empty($GLOBALS['show_error_header'])) {
- echo '<div class="error">' . "\n";
- echo '<h1>' . $GLOBALS['strError'] . '</h1>' . "\n";
- }
-
- echo '<div class="notice">';
- echo PMA_sanitize($message);
- if (isset($GLOBALS['special_message'])) {
- echo PMA_sanitize($GLOBALS['special_message']);
- unset($GLOBALS['special_message']);
+ if (isset($tbl_status) && (int) $tbl_status['Index_length'] > 1024) {
+ PMA_DBI_try_query('REPAIR TABLE ' . PMA_backquote($GLOBALS['table']));
}
- echo '</div>';
-
- if (!empty($GLOBALS['show_error_header'])) {
- echo '</div>';
- }
-
- if ($cfg['ShowSQL'] == true && ! empty($sql_query)) {
- // Basic url query part
- $url_qpart = '?' . PMA_generate_common_url(isset($GLOBALS['db']) ? $GLOBALS['db'] : '', isset($GLOBALS['table']) ? $GLOBALS['table'] : '');
-
- // Html format the query to be displayed
- // The nl2br function isn't used because its result isn't a valid
- // xhtml1.0 statement before php4.0.5 ("<br>" and not "<br />")
- // If we want to show some sql code it is easiest to create it here
- /* SQL-Parser-Analyzer */
-
- if (!empty($GLOBALS['show_as_php'])) {
- $new_line = '\'<br />' . "\n" . '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;. \' ';
- }
- if (isset($new_line)) {
- /* SQL-Parser-Analyzer */
- $query_base = PMA_sqlAddslashes(htmlspecialchars($sql_query), false, false, true);
- /* SQL-Parser-Analyzer */
- $query_base = preg_replace("@((\015\012)|(\015)|(\012))+@", $new_line, $query_base);
- } else {
- $query_base = $sql_query;
- }
-
- $max_characters = 1000;
- if (strlen($query_base) > $max_characters) {
- define('PMA_QUERY_TOO_BIG',1);
- }
-
- // Parse SQL if needed
- if (isset($GLOBALS['parsed_sql']) && $query_base == $GLOBALS['parsed_sql']['raw']) {
- $parsed_sql = $GLOBALS['parsed_sql'];
- } else {
- // when the query is large (for example an INSERT of binary
- // data), the parser chokes; so avoid parsing the query
- if (! defined('PMA_QUERY_TOO_BIG')) {
- $parsed_sql = PMA_SQP_parse($query_base);
- }
- }
-
- // Analyze it
- if (isset($parsed_sql)) {
- $analyzed_display_query = PMA_SQP_analyze($parsed_sql);
- }
-
- // Here we append the LIMIT added for navigation, to
- // enable its display. Adding it higher in the code
- // to $sql_query would create a problem when
- // using the Refresh or Edit links.
-
- // Only append it on SELECTs.
-
- /**
- * @todo what would be the best to do when someone hits Refresh:
- * use the current LIMITs ?
- */
-
- if (isset($analyzed_display_query[0]['queryflags']['select_from'])
- && isset($GLOBALS['sql_limit_to_append'])) {
- $query_base = $analyzed_display_query[0]['section_before_limit'] . "\n" . $GLOBALS['sql_limit_to_append'] . $analyzed_display_query[0]['section_after_limit'];
- // Need to reparse query
- $parsed_sql = PMA_SQP_parse($query_base);
- }
-
- if (!empty($GLOBALS['show_as_php'])) {
- $query_base = '$sql = \'' . $query_base;
- } elseif (!empty($GLOBALS['validatequery'])) {
- $query_base = PMA_validateSQL($query_base);
- } else {
- if (isset($parsed_sql)) {
- $query_base = PMA_formatSql($parsed_sql, $query_base);
- }
- }
-
- // Prepares links that may be displayed to edit/explain the query
- // (don't go to default pages, we must go to the page
- // where the query box is available)
-
- $edit_target = isset($GLOBALS['db']) ? (isset($GLOBALS['table']) ? 'tbl_sql.php' : 'db_sql.php') : 'server_sql.php';
-
- if (isset($cfg['SQLQuery']['Edit'])
- && ($cfg['SQLQuery']['Edit'] == true)
- && (!empty($edit_target))
- && ! defined('PMA_QUERY_TOO_BIG')) {
-
- if ($cfg['EditInWindow'] == true) {
- $onclick = 'window.parent.focus_querywindow(\'' . PMA_jsFormat($sql_query, false) . '\'); return false;';
- } else {
- $onclick = '';
- }
-
- $edit_link = $edit_target
- . $url_qpart
- . '&amp;sql_query=' . urlencode($sql_query)
- . '&amp;show_query=1#querybox';
- $edit_link = ' [' . PMA_linkOrButton($edit_link, $GLOBALS['strEdit'], array('onclick' => $onclick)) . ']';
- } else {
- $edit_link = '';
- }
+ }
+ unset($tbl_status);
+ echo '<br />' . "\n";
- // Want to have the query explained (Mike Beck 2002-05-22)
- // but only explain a SELECT (that has not been explained)
- /* SQL-Parser-Analyzer */
- if (isset($cfg['SQLQuery']['Explain'])
- && $cfg['SQLQuery']['Explain'] == true
- && ! defined('PMA_QUERY_TOO_BIG')) {
-
- // Detect if we are validating as well
- // To preserve the validate uRL data
- if (!empty($GLOBALS['validatequery'])) {
- $explain_link_validate = '&amp;validatequery=1';
- } else {
- $explain_link_validate = '';
- }
+ echo '<div align="' . $GLOBALS['cell_align_left'] . '">' . "\n";
+ if (!empty($GLOBALS['show_error_header'])) {
+ echo '<div class="error">' . "\n";
+ echo '<h1>' . $GLOBALS['strError'] . '</h1>' . "\n";
+ }
- $explain_link = 'import.php'
- . $url_qpart
- . $explain_link_validate
- . '&amp;sql_query=';
-
- if (preg_match('@^SELECT[[:space:]]+@i', $sql_query)) {
- $explain_link .= urlencode('EXPLAIN ' . $sql_query);
- $message = $GLOBALS['strExplain'];
- } elseif (preg_match('@^EXPLAIN[[:space:]]+SELECT[[:space:]]+@i', $sql_query)) {
- $explain_link .= urlencode(substr($sql_query, 8));
- $message = $GLOBALS['strNoExplain'];
- } else {
- $explain_link = '';
- }
- if (!empty($explain_link)) {
- $explain_link = ' [' . PMA_linkOrButton($explain_link, $message) . ']';
- }
- } else {
- $explain_link = '';
- } //show explain
-
- // Also we would like to get the SQL formed in some nice
- // php-code (Mike Beck 2002-05-22)
- if (isset($cfg['SQLQuery']['ShowAsPHP'])
- && $cfg['SQLQuery']['ShowAsPHP'] == true
- && ! defined('PMA_QUERY_TOO_BIG')) {
- $php_link = 'import.php'
- . $url_qpart
- . '&amp;show_query=1'
- . '&amp;sql_query=' . urlencode($sql_query)
- . '&amp;show_as_php=';
+ echo '<div class="notice">';
+ echo PMA_sanitize($message);
+ if (isset($GLOBALS['special_message'])) {
+ echo PMA_sanitize($GLOBALS['special_message']);
+ unset($GLOBALS['special_message']);
+ }
+ echo '</div>';
- if (!empty($GLOBALS['show_as_php'])) {
- $php_link .= '0';
- $message = $GLOBALS['strNoPhp'];
- } else {
- $php_link .= '1';
- $message = $GLOBALS['strPhp'];
- }
- $php_link = ' [' . PMA_linkOrButton($php_link, $message) . ']';
-
- if (isset($GLOBALS['show_as_php'])) {
- $runquery_link
- = 'import.php'
- . $url_qpart
- . '&amp;show_query=1'
- . '&amp;sql_query=' . urlencode($sql_query);
- $php_link .= ' [' . PMA_linkOrButton($runquery_link, $GLOBALS['strRunQuery']) . ']';
- }
+ if (!empty($GLOBALS['show_error_header'])) {
+ echo '</div>';
+ }
- } else {
- $php_link = '';
- } //show as php
+ if ($cfg['ShowSQL'] == true && ! empty($sql_query)) {
+ // Basic url query part
+ $url_qpart = '?' . PMA_generate_common_url(isset($GLOBALS['db']) ? $GLOBALS['db'] : '', isset($GLOBALS['table']) ? $GLOBALS['table'] : '');
- // Refresh query
- if (isset($cfg['SQLQuery']['Refresh'])
- && $cfg['SQLQuery']['Refresh']
- && preg_match('@^(SELECT|SHOW)[[:space:]]+@i', $sql_query)) {
+ // Html format the query to be displayed
+ // The nl2br function isn't used because its result isn't a valid
+ // xhtml1.0 statement before php4.0.5 ("<br>" and not "<br />")
+ // If we want to show some sql code it is easiest to create it here
+ /* SQL-Parser-Analyzer */
- $refresh_link = 'import.php'
- . $url_qpart
- . '&amp;show_query=1'
- . (isset($_GET['pos']) ? '&amp;pos=' . $_GET['pos'] : '')
- . '&amp;sql_query=' . urlencode($sql_query);
- $refresh_link = ' [' . PMA_linkOrButton($refresh_link, $GLOBALS['strRefresh']) . ']';
- } else {
- $refresh_link = '';
- } //show as php
-
- if (isset($cfg['SQLValidator']['use'])
- && $cfg['SQLValidator']['use'] == true
- && isset($cfg['SQLQuery']['Validate'])
- && $cfg['SQLQuery']['Validate'] == true) {
- $validate_link = 'import.php'
- . $url_qpart
- . '&amp;show_query=1'
- . '&amp;sql_query=' . urlencode($sql_query)
- . '&amp;validatequery=';
- if (!empty($GLOBALS['validatequery'])) {
- $validate_link .= '0';
- $validate_message = $GLOBALS['strNoValidateSQL'] ;
- } else {
- $validate_link .= '1';
- $validate_message = $GLOBALS['strValidateSQL'] ;
- }
- $validate_link = ' [' . PMA_linkOrButton($validate_link, $validate_message) . ']';
- } else {
- $validate_link = '';
- } //validator
- unset($sql_query);
-
- // Displays the message
- echo '<fieldset class="">' . "\n";
- echo ' <legend>' . $GLOBALS['strSQLQuery'] . ':</legend>';
- echo ' <div>';
- // when uploading a 700 Kio binary file into a LONGBLOB,
- // I get a white page, strlen($query_base) is 2 x 700 Kio
- // so put a hard limit here (let's say 1000)
- if (defined('PMA_QUERY_TOO_BIG')) {
- echo ' ' . substr($query_base,0,$max_characters) . '[...]';
- } else {
- echo ' ' . $query_base;
- }
-
- //Clean up the end of the PHP
- if (!empty($GLOBALS['show_as_php'])) {
- echo '\';';
- }
- echo ' </div>';
- echo '</fieldset>' . "\n";
-
- if (!empty($edit_target)) {
- echo '<fieldset class="tblFooters">';
- echo $edit_link . $explain_link . $php_link . $refresh_link . $validate_link;
- echo '</fieldset>';
- }
+ if (!empty($GLOBALS['show_as_php'])) {
+ $new_line = '\'<br />' . "\n" . '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;. \' ';
}
- echo '</div><br />' . "\n";
- } // end of the 'PMA_showMessage()' function
-
-
- /**
- * Formats $value to byte view
- *
- * @param double the value to format
- * @param integer the sensitiveness
- * @param integer the number of decimals to retain
- *
- * @return array the formatted value and its unit
- *
- * @access public
- *
- * @author staybyte
- * @version 1.2 - 18 July 2002
- */
- function PMA_formatByteDown($value, $limes = 6, $comma = 0)
- {
- $dh = PMA_pow(10, $comma);
- $li = PMA_pow(10, $limes);
- $return_value = $value;
- $unit = $GLOBALS['byteUnits'][0];
-
- for ($d = 6, $ex = 15; $d >= 1; $d--, $ex-=3) {
- if (isset($GLOBALS['byteUnits'][$d]) && $value >= $li * PMA_pow(10, $ex)) {
- // use 1024.0 to avoid integer overflow on 64-bit machines
- $value = round($value / (PMA_pow(1024, $d) / $dh)) /$dh;
- $unit = $GLOBALS['byteUnits'][$d];
- break 1;
- } // end if
- } // end for
-
- if ($unit != $GLOBALS['byteUnits'][0]) {
- $return_value = number_format($value, $comma, $GLOBALS['number_decimal_separator'], $GLOBALS['number_thousands_separator']);
+ if (isset($new_line)) {
+ /* SQL-Parser-Analyzer */
+ $query_base = PMA_sqlAddslashes(htmlspecialchars($sql_query), false, false, true);
+ /* SQL-Parser-Analyzer */
+ $query_base = preg_replace("@((\015\012)|(\015)|(\012))+@", $new_line, $query_base);
} else {
- $return_value = number_format($value, 0, $GLOBALS['number_decimal_separator'], $GLOBALS['number_thousands_separator']);
- }
-
- return array($return_value, $unit);
- } // end of the 'PMA_formatByteDown' function
-
- /**
- * Formats $value to the given length and appends SI prefixes
- * $comma is not substracted from the length
- * with a $length of 0 no truncation occurs, number is only formated
- * to the current locale
- *
- * examples:
- * <code>
- * echo PMA_formatNumber(123456789, 6); // 123,457 k
- * echo PMA_formatNumber(-123456789, 4, 2); // -123.46 M
- * echo PMA_formatNumber(-0.003, 6); // -3 m
- * echo PMA_formatNumber(0.003, 3, 3); // 0.003
- * echo PMA_formatNumber(0.00003, 3, 2); // 0.03 m
- * echo PMA_formatNumber(0, 6); // 0
- *
- * </code>
- * @param double $value the value to format
- * @param integer $length the max length
- * @param integer $comma the number of decimals to retain
- * @param boolean $only_down do not reformat numbers below 1
- *
- * @return string the formatted value and its unit
- *
- * @access public
- *
- * @author staybyte, sebastian mendel
- * @version 1.1.0 - 2005-10-27
- */
- function PMA_formatNumber($value, $length = 3, $comma = 0, $only_down = false)
- {
- if ($length === 0) {
- return number_format($value,
- $comma,
- $GLOBALS['number_decimal_separator'],
- $GLOBALS['number_thousands_separator']);
+ $query_base = $sql_query;
}
- // this units needs no translation, ISO
- $units = array(
- -8 => 'y',
- -7 => 'z',
- -6 => 'a',
- -5 => 'f',
- -4 => 'p',
- -3 => 'n',
- -2 => '&micro;',
- -1 => 'm',
- 0 => ' ',
- 1 => 'k',
- 2 => 'M',
- 3 => 'G',
- 4 => 'T',
- 5 => 'P',
- 6 => 'E',
- 7 => 'Z',
- 8 => 'Y'
- );
-
- // we need at least 3 digits to be displayed
- if (3 > $length + $comma) {
- $length = 3 - $comma;
+ $max_characters = 1000;
+ if (strlen($query_base) > $max_characters) {
+ define('PMA_QUERY_TOO_BIG',1);
}
- // check for negativ value to retain sign
- if ($value < 0) {
- $sign = '-';
- $value = abs($value);
+ // Parse SQL if needed
+ if (isset($GLOBALS['parsed_sql']) && $query_base == $GLOBALS['parsed_sql']['raw']) {
+ $parsed_sql = $GLOBALS['parsed_sql'];
} else {
- $sign = '';
- }
-
- $dh = PMA_pow(10, $comma);
- $li = PMA_pow(10, $length);
- $unit = $units[0];
-
- if ($value >= 1) {
- for ($d = 8; $d >= 0; $d--) {
- if (isset($units[$d]) && $value >= $li * PMA_pow(1000, $d-1)) {
- $value = round($value / (PMA_pow(1000, $d) / $dh)) /$dh;
- $unit = $units[$d];
- break 1;
- } // end if
- } // end for
- } elseif (!$only_down && (float) $value !== 0.0) {
- for ($d = -8; $d <= 8; $d++) {
- if (isset($units[$d]) && $value <= $li * PMA_pow(1000, $d-1)) {
- $value = round($value / (PMA_pow(1000, $d) / $dh)) /$dh;
- $unit = $units[$d];
- break 1;
- } // end if
- } // end for
- } // end if ($value >= 1) elseif (!$only_down && (float) $value !== 0.0)
-
- $value = number_format($value,
- $comma,
- $GLOBALS['number_decimal_separator'],
- $GLOBALS['number_thousands_separator']);
-
- return $sign . $value . ' ' . $unit;
- } // end of the 'PMA_formatNumber' function
-
- /**
- * Extracts ENUM / SET options from a type definition string
- *
- * @param string The column type definition
- *
- * @return array The options or
- * boolean false in case of an error.
- *
- * @author rabus
- */
- function PMA_getEnumSetOptions($type_def)
- {
- $open = strpos($type_def, '(');
- $close = strrpos($type_def, ')');
- if (!$open || !$close) {
- return false;
- }
- $options = substr($type_def, $open + 2, $close - $open - 3);
- $options = explode('\',\'', $options);
- return $options;
- } // end of the 'PMA_getEnumSetOptions' function
-
- /**
- * Writes localised date
- *
- * @param string the current timestamp
- *
- * @return string the formatted date
- *
- * @access public
- */
- function PMA_localisedDate($timestamp = -1, $format = '')
- {
- global $datefmt, $month, $day_of_week;
-
- if ($format == '') {
- $format = $datefmt;
- }
-
- if ($timestamp == -1) {
- $timestamp = time();
- }
-
- $date = preg_replace('@%[aA]@', $day_of_week[(int)strftime('%w', $timestamp)], $format);
- $date = preg_replace('@%[bB]@', $month[(int)strftime('%m', $timestamp)-1], $date);
-
- return strftime($date, $timestamp);
- } // end of the 'PMA_localisedDate()' function
-
-
- /**
- * returns a tab for tabbed navigation.
- * If the variables $link and $args ar left empty, an inactive tab is created
- *
- * @uses $GLOBALS['strEmpty']
- * @uses $GLOBALS['strDrop']
- * @uses $GLOBALS['active_page']
- * @uses $GLOBALS['url_query']
- * @uses $cfg['MainPageIconic']
- * @uses $GLOBALS['pmaThemeImage']
- * @uses PMA_generate_common_url()
- * @uses E_USER_NOTICE
- * @uses htmlentities()
- * @uses urlencode()
- * @uses sprintf()
- * @uses trigger_error()
- * @uses array_merge()
- * @uses basename()
- * @param array $tab array with all options
- * @return string html code for one tab, a link if valid otherwise a span
- * @access public
- */
- function PMA_getTab($tab)
- {
- // default values
- $defaults = array(
- 'text' => '',
- 'class' => '',
- 'active' => false,
- 'link' => '',
- 'sep' => '?',
- 'attr' => '',
- 'args' => '',
- 'warning' => '',
- );
-
- $tab = array_merge($defaults, $tab);
-
- // determine additionnal style-class
- if (empty($tab['class'])) {
- if ($tab['text'] == $GLOBALS['strEmpty']
- || $tab['text'] == $GLOBALS['strDrop']) {
- $tab['class'] = 'caution';
- } elseif (!empty($tab['active'])
- || (isset($GLOBALS['active_page'])
- && $GLOBALS['active_page'] == $tab['link'])
- || basename(PMA_getenv('PHP_SELF')) == $tab['link'])
- {
- $tab['class'] = 'active';
- }
- }
-
- if (!empty($tab['warning'])) {
- $tab['class'] .= ' warning';
- $tab['attr'] .= ' title="' . htmlspecialchars($tab['warning']) . '"';
- }
-
- // build the link
- if (!empty($tab['link'])) {
- $tab['link'] = htmlentities($tab['link']);
- $tab['link'] = $tab['link'] . $tab['sep']
- .(empty($GLOBALS['url_query']) ?
- PMA_generate_common_url() : $GLOBALS['url_query']);
- if (!empty($tab['args'])) {
- foreach ($tab['args'] as $param => $value) {
- $tab['link'] .= '&amp;' . urlencode($param) . '='
- . urlencode($value);
- }
+ // when the query is large (for example an INSERT of binary
+ // data), the parser chokes; so avoid parsing the query
+ if (! defined('PMA_QUERY_TOO_BIG')) {
+ $parsed_sql = PMA_SQP_parse($query_base);
}
}
- // display icon, even if iconic is disabled but the link-text is missing
- if (($GLOBALS['cfg']['MainPageIconic'] || empty($tab['text']))
- && isset($tab['icon'])) {
- $image = '<img class="icon" src="' . htmlentities($GLOBALS['pmaThemeImage'])
- .'%1$s" width="16" height="16" alt="%2$s" />%2$s';
- $tab['text'] = sprintf($image, htmlentities($tab['icon']), $tab['text']);
- }
- // check to not display an empty link-text
- elseif (empty($tab['text'])) {
- $tab['text'] = '?';
- trigger_error('empty linktext in function ' . __FUNCTION__ . '()',
- E_USER_NOTICE);
+ // Analyze it
+ if (isset($parsed_sql)) {
+ $analyzed_display_query = PMA_SQP_analyze($parsed_sql);
}
- if (!empty($tab['link'])) {
- $out = '<a class="tab' . htmlentities($tab['class']) . '"'
- .' href="' . $tab['link'] . '" ' . $tab['attr'] . '>'
- . $tab['text'] . '</a>';
- } else {
- $out = '<span class="tab' . htmlentities($tab['class']) . '">'
- . $tab['text'] . '</span>';
- }
+ // Here we append the LIMIT added for navigation, to
+ // enable its display. Adding it higher in the code
+ // to $sql_query would create a problem when
+ // using the Refresh or Edit links.
- return $out;
- } // end of the 'PMA_getTab()' function
+ // Only append it on SELECTs.
- /**
- * returns html-code for a tab navigation
- *
- * @uses PMA_getTab()
- * @uses htmlentities()
- * @param array $tabs one element per tab
- * @param string $tag_id id used for the html-tag
- * @return string html-code for tab-navigation
- */
- function PMA_getTabs($tabs, $tag_id = 'topmenu')
- {
- $tab_navigation =
- '<div id="' . htmlentities($tag_id) . 'container">' . "\n"
- .'<ul id="' . htmlentities($tag_id) . '">' . "\n";
-
- foreach ($tabs as $tab) {
- $tab_navigation .= '<li>' . PMA_getTab($tab) . '</li>' . "\n";
- }
-
- $tab_navigation .=
- '</ul>' . "\n"
- .'<div class="clearfloat"></div>'
- .'</div>' . "\n";
-
- return $tab_navigation;
- }
-
-
- /**
- * Displays a link, or a button if the link's URL is too large, to
- * accommodate some browsers' limitations
- *
- * @param string the URL
- * @param string the link message
- * @param mixed $tag_params string: js confirmation
- * array: additional tag params (f.e. style="")
- * @param boolean $new_form we set this to false when we are already in
- * a form, to avoid generating nested forms
- *
- * @return string the results to be echoed or saved in an array
- */
- function PMA_linkOrButton($url, $message, $tag_params = array(),
- $new_form = true, $strip_img = false, $target = '')
- {
- if (! is_array($tag_params)) {
- $tmp = $tag_params;
- $tag_params = array();
- if (!empty($tmp)) {
- $tag_params['onclick'] = 'return confirmLink(this, \'' . $tmp . '\')';
- }
- unset($tmp);
- }
- if (! empty($target)) {
- $tag_params['target'] = htmlentities($target);
- }
+ /**
+ * @todo what would be the best to do when someone hits Refresh:
+ * use the current LIMITs ?
+ */
- $tag_params_strings = array();
- foreach ($tag_params as $par_name => $par_value) {
- // htmlspecialchars() only on non javascript
- $par_value = substr($par_name, 0, 2) == 'on'
- ? $par_value
- : htmlspecialchars($par_value);
- $tag_params_strings[] = $par_name . '="' . $par_value . '"';
+ if (isset($analyzed_display_query[0]['queryflags']['select_from'])
+ && isset($GLOBALS['sql_limit_to_append'])) {
+ $query_base = $analyzed_display_query[0]['section_before_limit'] . "\n" . $GLOBALS['sql_limit_to_append'] . $analyzed_display_query[0]['section_after_limit'];
+ // Need to reparse query
+ $parsed_sql = PMA_SQP_parse($query_base);
}
- // previously the limit was set to 2047, it seems 1000 is better
- if (strlen($url) <= 1000) {
- // no whitespace within an <a> else Safari will make it part of the link
- $ret = "\n" . '<a href="' . $url . '" '
- . implode(' ', $tag_params_strings) . '>'
- . $message . '</a>' . "\n";
+ if (!empty($GLOBALS['show_as_php'])) {
+ $query_base = '$sql = \'' . $query_base;
+ } elseif (!empty($GLOBALS['validatequery'])) {
+ $query_base = PMA_validateSQL($query_base);
} else {
- // no spaces (linebreaks) at all
- // or after the hidden fields
- // IE will display them all
-
- // add class=link to submit button
- if (empty($tag_params['class'])) {
- $tag_params['class'] = 'link';
- }
-
- // decode encoded url separators
- $separator = PMA_get_arg_separator();
- // on most places separator is still hard coded ...
- if ($separator !== '&') {
- // ... so always replace & with $separator
- $url = str_replace(htmlentities('&'), $separator, $url);
- $url = str_replace('&', $separator, $url);
- }
- $url = str_replace(htmlentities($separator), $separator, $url);
- // end decode
-
- $url_parts = parse_url($url);
- $query_parts = explode($separator, $url_parts['query']);
- if ($new_form) {
- $ret = '<form action="' . $url_parts['path'] . '" class="link"'
- . ' method="post"' . $target . ' style="display: inline;">';
- $subname_open = '';
- $subname_close = '';
- $submit_name = '';
- } else {
- $query_parts[] = 'redirect=' . $url_parts['path'];
- if (empty($GLOBALS['subform_counter'])) {
- $GLOBALS['subform_counter'] = 0;
- }
- $GLOBALS['subform_counter']++;
- $ret = '';
- $subname_open = 'subform[' . $GLOBALS['subform_counter'] . '][';
- $subname_close = ']';
- $submit_name = ' name="usesubform[' . $GLOBALS['subform_counter'] . ']"';
- }
- foreach ($query_parts as $query_pair) {
- list($eachvar, $eachval) = explode('=', $query_pair);
- $ret .= '<input type="hidden" name="' . $subname_open . $eachvar
- . $subname_close . '" value="'
- . htmlspecialchars(urldecode($eachval)) . '" />';
- } // end while
-
- if (stristr($message, '<img')) {
- if ($strip_img) {
- $message = trim(strip_tags($message));
- $ret .= '<input type="submit"' . $submit_name . ' '
- . implode(' ', $tag_params_strings)
- . ' value="' . htmlspecialchars($message) . '" />';
- } else {
- $ret .= '<input type="image"' . $submit_name . ' '
- . implode(' ', $tag_params_strings)
- . ' src="' . preg_replace(
- '/^.*\ssrc="([^"]*)".*$/si', '\1', $message) . '"'
- . ' value="' . htmlspecialchars(
- preg_replace('/^.*\salt="([^"]*)".*$/si', '\1',
- $message))
- . '" />';
- }
- } else {
- $message = trim(strip_tags($message));
- $ret .= '<input type="submit"' . $submit_name . ' '
- . implode(' ', $tag_params_strings)
- . ' value="' . htmlspecialchars($message) . '" />';
- }
- if ($new_form) {
- $ret .= '</form>';
+ if (isset($parsed_sql)) {
+ $query_base = PMA_formatSql($parsed_sql, $query_base);
}
- } // end if... else...
+ }
- return $ret;
- } // end of the 'PMA_linkOrButton()' function
+ // Prepares links that may be displayed to edit/explain the query
+ // (don't go to default pages, we must go to the page
+ // where the query box is available)
+ $edit_target = isset($GLOBALS['db']) ? (isset($GLOBALS['table']) ? 'tbl_sql.php' : 'db_sql.php') : 'server_sql.php';
- /**
- * Returns a given timespan value in a readable format.
- *
- * @uses $GLOBALS['timespanfmt']
- * @uses sprintf()
- * @uses floor()
- * @param int the timespan
- *
- * @return string the formatted value
- */
- function PMA_timespanFormat($seconds)
- {
- $return_string = '';
- $days = floor($seconds / 86400);
- if ($days > 0) {
- $seconds -= $days * 86400;
- }
- $hours = floor($seconds / 3600);
- if ($days > 0 || $hours > 0) {
- $seconds -= $hours * 3600;
- }
- $minutes = floor($seconds / 60);
- if ($days > 0 || $hours > 0 || $minutes > 0) {
- $seconds -= $minutes * 60;
- }
- return sprintf($GLOBALS['timespanfmt'], (string)$days, (string)$hours, (string)$minutes, (string)$seconds);
- }
+ if (isset($cfg['SQLQuery']['Edit'])
+ && ($cfg['SQLQuery']['Edit'] == true)
+ && (!empty($edit_target))
+ && ! defined('PMA_QUERY_TOO_BIG')) {
- /**
- * Takes a string and outputs each character on a line for itself. Used
- * mainly for horizontalflipped display mode.
- * Takes care of special html-characters.
- * Fulfills todo-item
- * http://sf.net/tracker/?func=detail&aid=544361&group_id=23067&atid=377411
- *
- * @todo add a multibyte safe function PMA_STR_split()
- * @uses strlen
- * @param string The string
- * @param string The Separator (defaults to "<br />\n")
- *
- * @access public
- * @author Garvin Hicking <me@supergarv.de>
- * @return string The flipped string
- */
- function PMA_flipstring($string, $Separator = "<br />\n")
- {
- $format_string = '';
- $charbuff = false;
-
- for ($i = 0; $i < strlen($string); $i++) {
- $char = $string{$i};
- $append = false;
-
- if ($char == '&') {
- $format_string .= $charbuff;
- $charbuff = $char;
- $append = true;
- } elseif (!empty($charbuff)) {
- $charbuff .= $char;
- } elseif ($char == ';' && !empty($charbuff)) {
- $format_string .= $charbuff;
- $charbuff = false;
- $append = true;
+ if ($cfg['EditInWindow'] == true) {
+ $onclick = 'window.parent.focus_querywindow(\'' . PMA_jsFormat($sql_query, false) . '\'); return false;';
} else {
- $format_string .= $char;
- $append = true;
+ $onclick = '';
}
- if ($append && ($i != strlen($string))) {
- $format_string .= $Separator;
- }
- }
-
- return $format_string;
- }
-
-
- /**
- * Function added to avoid path disclosures.
- * Called by each script that needs parameters, it displays
- * an error message and, by default, stops the execution.
- *
- * Not sure we could use a strMissingParameter message here,
- * would have to check if the error message file is always available
- *
- * @todo localize error message
- * @todo use PMA_fatalError() if $die === true?
- * @uses PMA_getenv()
- * @uses header_meta_style.inc.php
- * basename
- * @param array The names of the parameters needed by the calling
- * script.
- * @param boolean Stop the execution?
- * (Set this manually to false in the calling script
- * until you know all needed parameters to check).
- * @param boolean Whether to include this list in checking for special params.
- * @global string path to current script
- * @global boolean flag whether any special variable was required
- *
- * @access public
- * @author Marc Delisle (lem9@users.sourceforge.net)
- */
- function PMA_checkParameters($params, $die = true, $request = true)
- {
- global $checked_special;
-
- if (!isset($checked_special)) {
- $checked_special = false;
+ $edit_link = $edit_target
+ . $url_qpart
+ . '&amp;sql_query=' . urlencode($sql_query)
+ . '&amp;show_query=1#querybox';
+ $edit_link = ' [' . PMA_linkOrButton($edit_link, $GLOBALS['strEdit'], array('onclick' => $onclick)) . ']';
+ } else {
+ $edit_link = '';
}
- $reported_script_name = basename(PMA_getenv('PHP_SELF'));
- $found_error = false;
- $error_message = '';
+ // Want to have the query explained (Mike Beck 2002-05-22)
+ // but only explain a SELECT (that has not been explained)
+ /* SQL-Parser-Analyzer */
+ if (isset($cfg['SQLQuery']['Explain'])
+ && $cfg['SQLQuery']['Explain'] == true
+ && ! defined('PMA_QUERY_TOO_BIG')) {
- foreach ($params as $param) {
- if ($request && $param != 'db' && $param != 'table') {
- $checked_special = true;
+ // Detect if we are validating as well
+ // To preserve the validate uRL data
+ if (!empty($GLOBALS['validatequery'])) {
+ $explain_link_validate = '&amp;validatequery=1';
+ } else {
+ $explain_link_validate = '';
}
- if (!isset($GLOBALS[$param])) {
- $error_message .= $reported_script_name
- . ': Missing parameter: ' . $param
- . ' <a href="./Documentation.html#faqmissingparameters"'
- . ' target="documentation"> (FAQ 2.8)</a><br />';
- $found_error = true;
+ $explain_link = 'import.php'
+ . $url_qpart
+ . $explain_link_validate
+ . '&amp;sql_query=';
+
+ if (preg_match('@^SELECT[[:space:]]+@i', $sql_query)) {
+ $explain_link .= urlencode('EXPLAIN ' . $sql_query);
+ $message = $GLOBALS['strExplain'];
+ } elseif (preg_match('@^EXPLAIN[[:space:]]+SELECT[[:space:]]+@i', $sql_query)) {
+ $explain_link .= urlencode(substr($sql_query, 8));
+ $message = $GLOBALS['strNoExplain'];
+ } else {
+ $explain_link = '';
}
- }
- if ($found_error) {
- /**
- * display html meta tags
- */
- require_once './libraries/header_meta_style.inc.php';
- echo '</head><body><p>' . $error_message . '</p></body></html>';
- if ($die) {
- exit();
+ if (!empty($explain_link)) {
+ $explain_link = ' [' . PMA_linkOrButton($explain_link, $message) . ']';
}
- }
- } // end function
-
- /**
- * Function to generate unique condition for specified row.
- *
- * @uses PMA_MYSQL_INT_VERSION
- * @uses $GLOBALS['analyzed_sql'][0]
- * @uses PMA_DBI_field_flags()
- * @uses PMA_backquote()
- * @uses PMA_sqlAddslashes()
- * @uses stristr()
- * @uses bin2hex()
- * @uses preg_replace()
- * @param resource $handle current query result
- * @param integer $fields_cnt number of fields
- * @param array $fields_meta meta information about fields
- * @param array $row current row
- *
- * @access public
- * @author Michal Cihar (michal@cihar.com)
- * @return string calculated condition
- */
- function PMA_getUniqueCondition($handle, $fields_cnt, $fields_meta, $row)
- {
- $primary_key = '';
- $unique_key = '';
- $nonprimary_condition = '';
-
- for ($i = 0; $i < $fields_cnt; ++$i) {
- $condition = '';
- $field_flags = PMA_DBI_field_flags($handle, $i);
- $meta = $fields_meta[$i];
-
- // do not use an alias in a condition
- if (! isset($meta->orgname) || ! strlen($meta->orgname)) {
- $meta->orgname = $meta->name;
-
- if (isset($GLOBALS['analyzed_sql'][0]['select_expr'])
- && is_array($GLOBALS['analyzed_sql'][0]['select_expr'])) {
- foreach ($GLOBALS['analyzed_sql'][0]['select_expr']
- as $select_expr) {
- // need (string) === (string)
- // '' !== 0 but '' == 0
- if ((string) $select_expr['alias'] === (string) $meta->name) {
- $meta->orgname = $select_expr['column'];
- break;
- } // end if
- } // end foreach
- }
- }
-
-
- // to fix the bug where float fields (primary or not)
- // can't be matched because of the imprecision of
- // floating comparison, use CONCAT
- // (also, the syntax "CONCAT(field) IS NULL"
- // that we need on the next "if" will work)
- if ($meta->type == 'real') {
- $condition = ' CONCAT(' . PMA_backquote($meta->table) . '.'
- . PMA_backquote($meta->orgname) . ') ';
- } else {
- // string and blob fields have to be converted using
- // the system character set (always utf8) since
- // mysql4.1 can use different charset for fields.
- if (PMA_MYSQL_INT_VERSION >= 40100
- && ($meta->type == 'string' || $meta->type == 'blob')) {
- $condition = ' CONVERT(' . PMA_backquote($meta->table) . '.'
- . PMA_backquote($meta->orgname) . ' USING utf8) ';
- } else {
- $condition = ' ' . PMA_backquote($meta->table) . '.'
- . PMA_backquote($meta->orgname) . ' ';
- }
- } // end if... else...
+ } else {
+ $explain_link = '';
+ } //show explain
+
+ // Also we would like to get the SQL formed in some nice
+ // php-code (Mike Beck 2002-05-22)
+ if (isset($cfg['SQLQuery']['ShowAsPHP'])
+ && $cfg['SQLQuery']['ShowAsPHP'] == true
+ && ! defined('PMA_QUERY_TOO_BIG')) {
+ $php_link = 'import.php'
+ . $url_qpart
+ . '&amp;show_query=1'
+ . '&amp;sql_query=' . urlencode($sql_query)
+ . '&amp;show_as_php=';
- if (!isset($row[$i]) || is_null($row[$i])) {
- $condition .= 'IS NULL AND';
+ if (!empty($GLOBALS['show_as_php'])) {
+ $php_link .= '0';
+ $message = $GLOBALS['strNoPhp'];
} else {
- // timestamp is numeric on some MySQL 4.1
- if ($meta->numeric && $meta->type != 'timestamp') {
- $condition .= '= ' . $row[$i] . ' AND';
- } elseif ($meta->type == 'blob'
- // hexify only if this is a true not empty BLOB
- && stristr($field_flags, 'BINARY')
- && !empty($row[$i])) {
- // do not waste memory building a too big condition
- if (strlen($row[$i]) < 1000) {
- if (PMA_MYSQL_INT_VERSION < 40002) {
- $condition .= 'LIKE 0x' . bin2hex($row[$i]) . ' AND';
- } else {
- // use a CAST if possible, to avoid problems
- // if the field contains wildcard characters % or _
- $condition .= '= CAST(0x' . bin2hex($row[$i])
- . ' AS BINARY) AND';
- }
- }
- } else {
- $condition .= '= \''
- . PMA_sqlAddslashes($row[$i], false, true) . '\' AND';
- }
+ $php_link .= '1';
+ $message = $GLOBALS['strPhp'];
}
- if ($meta->primary_key > 0) {
- $primary_key .= $condition;
- } elseif ($meta->unique_key > 0) {
- $unique_key .= $condition;
+ $php_link = ' [' . PMA_linkOrButton($php_link, $message) . ']';
+
+ if (isset($GLOBALS['show_as_php'])) {
+ $runquery_link
+ = 'import.php'
+ . $url_qpart
+ . '&amp;show_query=1'
+ . '&amp;sql_query=' . urlencode($sql_query);
+ $php_link .= ' [' . PMA_linkOrButton($runquery_link, $GLOBALS['strRunQuery']) . ']';
}
- $nonprimary_condition .= $condition;
- } // end for
-
- // Correction University of Virginia 19991216:
- // prefer primary or unique keys for condition,
- // but use conjunction of all values if no primary key
- if ($primary_key) {
- $preferred_condition = $primary_key;
- } elseif ($unique_key) {
- $preferred_condition = $unique_key;
- } else {
- $preferred_condition = $nonprimary_condition;
- }
- return preg_replace('|\s?AND$|', '', $preferred_condition);
- } // end function
-
- /**
- * Generate a button or image tag
- *
- * @uses PMA_USR_BROWSER_AGENT
- * @uses $GLOBALS['pmaThemeImage']
- * @uses $GLOBALS['cfg']['PropertiesIconic']
- * @param string name of button element
- * @param string class of button element
- * @param string name of image element
- * @param string text to display
- * @param string image to display
- *
- * @access public
- * @author Michal Cihar (michal@cihar.com)
- */
- function PMA_buttonOrImage($button_name, $button_class, $image_name, $text,
- $image)
- {
- /* Opera has trouble with <input type="image"> */
- /* IE has trouble with <button> */
- if (PMA_USR_BROWSER_AGENT != 'IE') {
- echo '<button class="' . $button_class . '" type="submit"'
- .' name="' . $button_name . '" value="' . $text . '"'
- .' title="' . $text . '">' . "\n"
- .'<img class="icon" src="' . $GLOBALS['pmaThemeImage'] . $image . '"'
- .' title="' . $text . '" alt="' . $text . '" width="16"'
- .' height="16" />'
- .($GLOBALS['cfg']['PropertiesIconic'] === 'both' ? '&nbsp;' . $text : '') . "\n"
- .'</button>' . "\n";
} else {
- echo '<input type="image" name="' . $image_name . '" value="'
- . $text . '" title="' . $text . '" src="' . $GLOBALS['pmaThemeImage']
- . $image . '" />'
- . ($GLOBALS['cfg']['PropertiesIconic'] === 'both' ? '&nbsp;' . $text : '') . "\n";
- }
- } // end function
-
- /**
- * Generate a pagination selector for browsing resultsets
- *
- * @uses $GLOBALS['strPageNumber']
- * @uses range()
- * @param string URL for the JavaScript
- * @param string Number of rows in the pagination set
- * @param string current page number
- * @param string number of total pages
- * @param string If the number of pages is lower than this
- * variable, no pages will be ommitted in
- * pagination
- * @param string How many rows at the beginning should always
- * be shown?
- * @param string How many rows at the end should always
- * be shown?
- * @param string Percentage of calculation page offsets to
- * hop to a next page
- * @param string Near the current page, how many pages should
- * be considered "nearby" and displayed as
- * well?
- *
- * @access public
- * @author Garvin Hicking (pma@supergarv.de)
- */
- function PMA_pageselector($url, $rows, $pageNow = 1, $nbTotalPage = 1,
- $showAll = 200, $sliceStart = 5, $sliceEnd = 5, $percent = 20,
- $range = 10)
- {
- $gotopage = $GLOBALS['strPageNumber']
- . ' <select name="goToPage" onchange="goToUrl(this, \''
- . $url . '\');">' . "\n";
- if ($nbTotalPage < $showAll) {
- $pages = range(1, $nbTotalPage);
+ $php_link = '';
+ } //show as php
+
+ // Refresh query
+ if (isset($cfg['SQLQuery']['Refresh'])
+ && $cfg['SQLQuery']['Refresh']
+ && preg_match('@^(SELECT|SHOW)[[:space:]]+@i', $sql_query)) {
+
+ $refresh_link = 'import.php'
+ . $url_qpart
+ . '&amp;show_query=1'
+ . (isset($_GET['pos']) ? '&amp;pos=' . $_GET['pos'] : '')
+ . '&amp;sql_query=' . urlencode($sql_query);
+ $refresh_link = ' [' . PMA_linkOrButton($refresh_link, $GLOBALS['strRefresh']) . ']';
} else {
- $pages = array();
-
- // Always show first X pages
- for ($i = 1; $i <= $sliceStart; $i++) {
- $pages[] = $i;
- }
-
- // Always show last X pages
- for ($i = $nbTotalPage - $sliceEnd; $i <= $nbTotalPage; $i++) {
- $pages[] = $i;
- }
-
- // garvin: Based on the number of results we add the specified
- // $percent percentate to each page number,
- // so that we have a representing page number every now and then to
- // immideately jump to specific pages.
- // As soon as we get near our currently chosen page ($pageNow -
- // $range), every page number will be
- // shown.
- $i = $sliceStart;
- $x = $nbTotalPage - $sliceEnd;
- $met_boundary = false;
- while ($i <= $x) {
- if ($i >= ($pageNow - $range) && $i <= ($pageNow + $range)) {
- // If our pageselector comes near the current page, we use 1
- // counter increments
- $i++;
- $met_boundary = true;
- } else {
- // We add the percentate increment to our current page to
- // hop to the next one in range
- $i = $i + floor($nbTotalPage / $percent);
-
- // Make sure that we do not cross our boundaries.
- if ($i > ($pageNow - $range) && !$met_boundary) {
- $i = $pageNow - $range;
- }
- }
-
- if ($i > 0 && $i <= $x) {
- $pages[] = $i;
- }
- }
-
- // Since because of ellipsing of the current page some numbers may be double,
- // we unify our array:
- sort($pages);
- $pages = array_unique($pages);
- }
-
- foreach ($pages as $i) {
- if ($i == $pageNow) {
- $selected = 'selected="selected" style="font-weight: bold"';
+ $refresh_link = '';
+ } //show as php
+
+ if (isset($cfg['SQLValidator']['use'])
+ && $cfg['SQLValidator']['use'] == true
+ && isset($cfg['SQLQuery']['Validate'])
+ && $cfg['SQLQuery']['Validate'] == true) {
+ $validate_link = 'import.php'
+ . $url_qpart
+ . '&amp;show_query=1'
+ . '&amp;sql_query=' . urlencode($sql_query)
+ . '&amp;validatequery=';
+ if (!empty($GLOBALS['validatequery'])) {
+ $validate_link .= '0';
+ $validate_message = $GLOBALS['strNoValidateSQL'] ;
} else {
- $selected = '';
+ $validate_link .= '1';
+ $validate_message = $GLOBALS['strValidateSQL'] ;
}
- $gotopage .= ' <option ' . $selected . ' value="' . (($i - 1) * $rows) . '">' . $i . '</option>' . "\n";
- }
-
- $gotopage .= ' </select>';
-
- return $gotopage;
- } // end function
-
- /**
- * replaces %u in given path with current user name
- *
- * example:
- * <code>
- * $user_dir = PMA_userDir('/var/pma_tmp/%u/'); // '/var/pma_tmp/root/'
- *
- * </code>
- * @uses $cfg['Server']['user']
- * @uses substr()
- * @uses str_replace()
- * @param string $dir with wildcard for user
- * @return string per user directory
- */
- function PMA_userDir($dir)
- {
- // add trailing slash
- if (substr($dir, -1) != '/') {
- $dir .= '/';
- }
-
- return str_replace('%u', $GLOBALS['cfg']['Server']['user'], $dir);
- }
-
- /**
- * returns html code for db link to default db page
- *
- * @uses $cfg['DefaultTabDatabase']
- * @uses $GLOBALS['db']
- * @uses $GLOBALS['strJumpToDB']
- * @uses PMA_generate_common_url()
- * @uses PMA_unescape_mysql_wildcards()
- * @uses strlen()
- * @uses sprintf()
- * @uses htmlspecialchars()
- * @param string $database
- * @return string html link to default db page
- */
- function PMA_getDbLink($database = null)
- {
- if (!strlen($database)) {
- if (!strlen($GLOBALS['db'])) {
- return '';
- }
- $database = $GLOBALS['db'];
+ $validate_link = ' [' . PMA_linkOrButton($validate_link, $validate_message) . ']';
+ } else {
+ $validate_link = '';
+ } //validator
+ unset($sql_query);
+
+ // Displays the message
+ echo '<fieldset class="">' . "\n";
+ echo ' <legend>' . $GLOBALS['strSQLQuery'] . ':</legend>';
+ echo ' <div>';
+ // when uploading a 700 Kio binary file into a LONGBLOB,
+ // I get a white page, strlen($query_base) is 2 x 700 Kio
+ // so put a hard limit here (let's say 1000)
+ if (defined('PMA_QUERY_TOO_BIG')) {
+ echo ' ' . substr($query_base,0,$max_characters) . '[...]';
} else {
- $database = PMA_unescape_mysql_wildcards($database);
+ echo ' ' . $query_base;
}
- return '<a href="' . $GLOBALS['cfg']['DefaultTabDatabase'] . '?' . PMA_generate_common_url($database) . '"'
- .' title="' . sprintf($GLOBALS['strJumpToDB'], htmlspecialchars($database)) . '">'
- .htmlspecialchars($database) . '</a>';
- }
+ //Clean up the end of the PHP
+ if (!empty($GLOBALS['show_as_php'])) {
+ echo '\';';
+ }
+ echo ' </div>';
+ echo '</fieldset>' . "\n";
- /**
- * Displays a lightbulb hint explaining a known external bug
- * that affects a functionality
- *
- * @uses PMA_MYSQL_INT_VERSION
- * @uses $GLOBALS['strKnownExternalBug']
- * @uses PMA_showHint()
- * @uses sprintf()
- * @param string $functionality localized message explaining the func.
- * @param string $component 'mysql' (eventually, 'php')
- * @param string $minimum_version of this component
- * @param string $bugref bug reference for this component
- */
- function PMA_externalBug($functionality, $component, $minimum_version, $bugref) {
- if ($component == 'mysql' && PMA_MYSQL_INT_VERSION < $minimum_version) {
- echo PMA_showHint(sprintf($GLOBALS['strKnownExternalBug'], $functionality, 'http://bugs.mysql.com/' . $bugref));
+ if (!empty($edit_target)) {
+ echo '<fieldset class="tblFooters">';
+ echo $edit_link . $explain_link . $php_link . $refresh_link . $validate_link;
+ echo '</fieldset>';
}
}
+ echo '</div><br />' . "\n";
+} // end of the 'PMA_showMessage()' function
- /**
- * include here only libraries which contain only function definitions
- * no code im main()!
- */
- /**
- * Include URL/hidden inputs generating.
- */
- require_once './libraries/url_generating.lib.php';
-
-}
-
-
-/******************************************************************************/
-/* start procedural code label_start_procedural */
/**
- * protect against older PHP versions' bug about GLOBALS overwrite
- * (no need to localize this message :))
- * but what if script.php?GLOBALS[admin]=1&GLOBALS[_REQUEST]=1 ???
- */
-if (isset($_REQUEST['GLOBALS']) || isset($_FILES['GLOBALS'])
- || isset($_SERVER['GLOBALS']) || isset($_COOKIE['GLOBALS'])
- || isset($_ENV['GLOBALS'])) {
- die('GLOBALS overwrite attempt');
-}
-
-/**
- * protect against possible exploits - there is no need to have so much vars
- */
-if (count($_REQUEST) > 1000) {
- die('possible exploit');
-}
-
-/**
- * Check for numeric keys
- * (if register_globals is on, numeric key can be found in $GLOBALS)
+ * Formats $value to byte view
+ *
+ * @param double the value to format
+ * @param integer the sensitiveness
+ * @param integer the number of decimals to retain
+ *
+ * @return array the formatted value and its unit
+ *
+ * @access public
+ *
+ * @author staybyte
+ * @version 1.2 - 18 July 2002
*/
-foreach ($GLOBALS as $key => $dummy) {
- if (is_numeric($key)) {
- die('numeric key detected');
- }
-}
+function PMA_formatByteDown($value, $limes = 6, $comma = 0)
+{
+ $dh = PMA_pow(10, $comma);
+ $li = PMA_pow(10, $limes);
+ $return_value = $value;
+ $unit = $GLOBALS['byteUnits'][0];
+
+ for ($d = 6, $ex = 15; $d >= 1; $d--, $ex-=3) {
+ if (isset($GLOBALS['byteUnits'][$d]) && $value >= $li * PMA_pow(10, $ex)) {
+ // use 1024.0 to avoid integer overflow on 64-bit machines
+ $value = round($value / (PMA_pow(1024, $d) / $dh)) /$dh;
+ $unit = $GLOBALS['byteUnits'][$d];
+ break 1;
+ } // end if
+ } // end for
-/**
- * just to be sure there was no import (registering) before here
- * we empty the global space
- */
-$variables_whitelist = array (
- 'GLOBALS',
- '_SERVER',
- '_GET',
- '_POST',
- '_REQUEST',
- '_FILES',
- '_ENV',
- '_COOKIE',
- '_SESSION',
-);
-
-foreach (get_defined_vars() as $key => $value) {
- if (! in_array($key, $variables_whitelist)) {
- unset($$key);
+ if ($unit != $GLOBALS['byteUnits'][0]) {
+ $return_value = number_format($value, $comma, $GLOBALS['number_decimal_separator'], $GLOBALS['number_thousands_separator']);
+ } else {
+ $return_value = number_format($value, 0, $GLOBALS['number_decimal_separator'], $GLOBALS['number_thousands_separator']);
}
-}
-unset($key, $value, $variables_whitelist);
+ return array($return_value, $unit);
+} // end of the 'PMA_formatByteDown' function
/**
- * Subforms - some functions need to be called by form, cause of the limited url
- * length, but if this functions inside another form you cannot just open a new
- * form - so phpMyAdmin uses 'arrays' inside this form
+ * Formats $value to the given length and appends SI prefixes
+ * $comma is not substracted from the length
+ * with a $length of 0 no truncation occurs, number is only formated
+ * to the current locale
*
+ * examples:
* <code>
- * <form ...>
- * ... main form elments ...
- * <intput type="hidden" name="subform[action1][id]" value="1" />
- * ... other subform data ...
- * <intput type="submit" name="usesubform[action1]" value="do action1" />
- * ... other subforms ...
- * <intput type="hidden" name="subform[actionX][id]" value="X" />
- * ... other subform data ...
- * <intput type="submit" name="usesubform[actionX]" value="do actionX" />
- * ... main form elments ...
- * <intput type="submit" name="main_action" value="submit form" />
- * </form>
- * </code
- *
- * so we now check if a subform is submitted
+ * echo PMA_formatNumber(123456789, 6); // 123,457 k
+ * echo PMA_formatNumber(-123456789, 4, 2); // -123.46 M
+ * echo PMA_formatNumber(-0.003, 6); // -3 m
+ * echo PMA_formatNumber(0.003, 3, 3); // 0.003
+ * echo PMA_formatNumber(0.00003, 3, 2); // 0.03 m
+ * echo PMA_formatNumber(0, 6); // 0
+ *
+ * </code>
+ * @param double $value the value to format
+ * @param integer $length the max length
+ * @param integer $comma the number of decimals to retain
+ * @param boolean $only_down do not reformat numbers below 1
+ *
+ * @return string the formatted value and its unit
+ *
+ * @access public
+ *
+ * @author staybyte, sebastian mendel
+ * @version 1.1.0 - 2005-10-27
*/
-$__redirect = null;
-if (isset($_POST['usesubform'])) {
- // if a subform is present and should be used
- // the rest of the form is deprecated
- $subform_id = key($_POST['usesubform']);
- $subform = $_POST['subform'][$subform_id];
- $_POST = $subform;
- $_REQUEST = $subform;
- /**
- * some subforms need another page than the main form, so we will just
- * include this page at the end of this script - we use $__redirect to
- * track this
- */
- if (isset($_POST['redirect'])
- && $_POST['redirect'] != basename(PMA_getenv('PHP_SELF'))) {
- $__redirect = $_POST['redirect'];
- unset($_POST['redirect']);
+function PMA_formatNumber($value, $length = 3, $comma = 0, $only_down = false)
+{
+ if ($length === 0) {
+ return number_format($value,
+ $comma,
+ $GLOBALS['number_decimal_separator'],
+ $GLOBALS['number_thousands_separator']);
}
- unset($subform_id, $subform);
-}
-// end check if a subform is submitted
-
-// remove quotes added by php
-if (get_magic_quotes_gpc()) {
- PMA_arrayWalkRecursive($_GET, 'stripslashes', true);
- PMA_arrayWalkRecursive($_POST, 'stripslashes', true);
- PMA_arrayWalkRecursive($_COOKIE, 'stripslashes', true);
- PMA_arrayWalkRecursive($_REQUEST, 'stripslashes', true);
-}
-
-/**
- * clean cookies on new install or upgrade
- * when changing something with increment the cookie version
- */
-$pma_cookie_version = 4;
-if (isset($_COOKIE)
- && (! isset($_COOKIE['pmaCookieVer'])
- || $_COOKIE['pmaCookieVer'] < $pma_cookie_version)) {
- // delete all cookies
- foreach($_COOKIE as $cookie_name => $tmp) {
- PMA_removeCookie($cookie_name);
- }
- $_COOKIE = array();
- PMA_setCookie('pmaCookieVer', $pma_cookie_version);
-}
-
-/**
- * include deprecated grab_globals only if required
- */
-if (empty($__redirect) && !defined('PMA_NO_VARIABLES_IMPORT')) {
- require './libraries/grab_globals.lib.php';
-}
-
-/**
- * include session handling after the globals, to prevent overwriting
- */
-require_once './libraries/session.inc.php';
-/**
- * init some variables LABEL_variables_init
- */
+ // this units needs no translation, ISO
+ $units = array(
+ -8 => 'y',
+ -7 => 'z',
+ -6 => 'a',
+ -5 => 'f',
+ -4 => 'p',
+ -3 => 'n',
+ -2 => '&micro;',
+ -1 => 'm',
+ 0 => ' ',
+ 1 => 'k',
+ 2 => 'M',
+ 3 => 'G',
+ 4 => 'T',
+ 5 => 'P',
+ 6 => 'E',
+ 7 => 'Z',
+ 8 => 'Y'
+ );
+
+ // we need at least 3 digits to be displayed
+ if (3 > $length + $comma) {
+ $length = 3 - $comma;
+ }
-/**
- * holds errors
- * @global array $GLOBALS['PMA_errors']
- */
-$GLOBALS['PMA_errors'] = array();
+ // check for negativ value to retain sign
+ if ($value < 0) {
+ $sign = '-';
+ $value = abs($value);
+ } else {
+ $sign = '';
+ }
-/**
- * holds params to be passed to next page
- * @global array $GLOBALS['url_params']
- */
-$GLOBALS['url_params'] = array();
+ $dh = PMA_pow(10, $comma);
+ $li = PMA_pow(10, $length);
+ $unit = $units[0];
-/**
- * the whitelist for $GLOBALS['goto']
- * @global array $goto_whitelist
- */
-$goto_whitelist = array(
- //'browse_foreigners.php',
- //'calendar.php',
- //'changelog.php',
- //'chk_rel.php',
- 'db_create.php',
- 'db_datadict.php',
- 'db_sql.php',
- 'db_export.php',
- 'db_importdocsql.php',
- 'db_qbe.php',
- 'db_structure.php',
- 'db_import.php',
- 'db_operations.php',
- 'db_printview.php',
- 'db_search.php',
- //'Documentation.html',
- //'error.php',
- 'export.php',
- 'import.php',
- //'index.php',
- //'navigation.php',
- //'license.php',
- 'main.php',
- 'pdf_pages.php',
- 'pdf_schema.php',
- //'phpinfo.php',
- 'querywindow.php',
- //'readme.php',
- 'server_binlog.php',
- 'server_collations.php',
- 'server_databases.php',
- 'server_engines.php',
- 'server_export.php',
- 'server_import.php',
- 'server_privileges.php',
- 'server_processlist.php',
- 'server_sql.php',
- 'server_status.php',
- 'server_variables.php',
- 'sql.php',
- 'tbl_addfield.php',
- 'tbl_alter.php',
- 'tbl_change.php',
- 'tbl_create.php',
- 'tbl_import.php',
- 'tbl_indexes.php',
- 'tbl_move_copy.php',
- 'tbl_printview.php',
- 'tbl_sql.php',
- 'tbl_export.php',
- 'tbl_operations.php',
- 'tbl_structure.php',
- 'tbl_relation.php',
- 'tbl_replace.php',
- 'tbl_row_action.php',
- 'tbl_select.php',
- //'themes.php',
- 'transformation_overview.php',
- 'transformation_wrapper.php',
- 'translators.html',
- 'user_password.php',
-);
+ if ($value >= 1) {
+ for ($d = 8; $d >= 0; $d--) {
+ if (isset($units[$d]) && $value >= $li * PMA_pow(1000, $d-1)) {
+ $value = round($value / (PMA_pow(1000, $d) / $dh)) /$dh;
+ $unit = $units[$d];
+ break 1;
+ } // end if
+ } // end for
+ } elseif (!$only_down && (float) $value !== 0.0) {
+ for ($d = -8; $d <= 8; $d++) {
+ if (isset($units[$d]) && $value <= $li * PMA_pow(1000, $d-1)) {
+ $value = round($value / (PMA_pow(1000, $d) / $dh)) /$dh;
+ $unit = $units[$d];
+ break 1;
+ } // end if
+ } // end for
+ } // end if ($value >= 1) elseif (!$only_down && (float) $value !== 0.0)
-/**
- * check $__redirect against whitelist
- */
-if (! PMA_checkPageValidity($__redirect, $goto_whitelist)) {
- $__redirect = null;
-}
+ $value = number_format($value,
+ $comma,
+ $GLOBALS['number_decimal_separator'],
+ $GLOBALS['number_thousands_separator']);
-/**
- * holds page that should be displayed
- * @global string $GLOBALS['goto']
- */
-$GLOBALS['goto'] = '';
-// Security fix: disallow accessing serious server files via "?goto="
-if (PMA_checkPageValidity($_REQUEST['goto'], $goto_whitelist)) {
- $GLOBALS['goto'] = $_REQUEST['goto'];
- $GLOBALS['url_params']['goto'] = $_REQUEST['goto'];
-} else {
- unset($_REQUEST['goto'], $_GET['goto'], $_POST['goto'], $_COOKIE['goto']);
-}
+ return $sign . $value . ' ' . $unit;
+} // end of the 'PMA_formatNumber' function
/**
- * returning page
- * @global string $GLOBALS['back']
+ * Extracts ENUM / SET options from a type definition string
+ *
+ * @param string The column type definition
+ *
+ * @return array The options or
+ * boolean false in case of an error.
+ *
+ * @author rabus
*/
-if (PMA_checkPageValidity($_REQUEST['back'], $goto_whitelist)) {
- $GLOBALS['back'] = $_REQUEST['back'];
-} else {
- unset($_REQUEST['back'], $_GET['back'], $_POST['back'], $_COOKIE['back']);
-}
+function PMA_getEnumSetOptions($type_def)
+{
+ $open = strpos($type_def, '(');
+ $close = strrpos($type_def, ')');
+ if (!$open || !$close) {
+ return false;
+ }
+ $options = substr($type_def, $open + 2, $close - $open - 3);
+ $options = explode('\',\'', $options);
+ return $options;
+} // end of the 'PMA_getEnumSetOptions' function
/**
- * Check whether user supplied token is valid, if not remove any possibly
- * dangerous stuff from request.
+ * Writes localised date
+ *
+ * @param string the current timestamp
*
- * remember that some objects in the session with session_start and __wakeup()
- * could access this variables before we reach this point
- * f.e. PMA_Config: fontsize
+ * @return string the formatted date
*
- * @todo variables should be handled by their respective owners (objects)
- * f.e. lang, server, convcharset, collation_connection in PMA_Config
+ * @access public
*/
-if ((isset($_REQUEST['token']) && !is_string($_REQUEST['token'])) || empty($_REQUEST['token']) || $_SESSION[' PMA_token '] != $_REQUEST['token']) {
- /**
- * List of parameters which are allowed from unsafe source
- */
- $allow_list = array(
- 'db', 'table', 'lang', 'server', 'convcharset', 'collation_connection', 'target',
- /* Session ID */
- 'phpMyAdmin',
- /* Cookie preferences */
- 'pma_lang', 'pma_charset', 'pma_collation_connection',
- /* Possible login form */
- 'pma_servername', 'pma_username', 'pma_password',
- );
- /**
- * Require cleanup functions
- */
- require_once('./libraries/cleanup.lib.php');
- /**
- * Do actual cleanup
- */
- PMA_remove_request_vars($allow_list);
+function PMA_localisedDate($timestamp = -1, $format = '')
+{
+ global $datefmt, $month, $day_of_week;
-}
+ if ($format == '') {
+ $format = $datefmt;
+ }
+ if ($timestamp == -1) {
+ $timestamp = time();
+ }
-/**
- * @global string $convcharset
- * @see select_lang.lib.php
- */
-if (isset($_REQUEST['convcharset'])) {
- $convcharset = strip_tags($_REQUEST['convcharset']);
-}
+ $date = preg_replace('@%[aA]@', $day_of_week[(int)strftime('%w', $timestamp)], $format);
+ $date = preg_replace('@%[bB]@', $month[(int)strftime('%m', $timestamp)-1], $date);
-/**
- * current selected database
- * @global string $GLOBALS['db']
- */
-$GLOBALS['db'] = '';
-if (isset($_REQUEST['db']) && is_string($_REQUEST['db'])) {
- // can we strip tags from this?
- // only \ and / is not allowed in db names for MySQL
- $GLOBALS['db'] = $_REQUEST['db'];
- $GLOBALS['url_params']['db'] = $GLOBALS['db'];
-}
+ return strftime($date, $timestamp);
+} // end of the 'PMA_localisedDate()' function
-/**
- * current selected table
- * @global string $GLOBALS['table']
- */
-$GLOBALS['table'] = '';
-if (isset($_REQUEST['table']) && is_string($_REQUEST['table'])) {
- // can we strip tags from this?
- // only \ and / is not allowed in table names for MySQL
- $GLOBALS['table'] = $_REQUEST['table'];
- $GLOBALS['url_params']['table'] = $GLOBALS['table'];
-}
/**
- * sql query to be executed
- * @global string $GLOBALS['sql_query']
+ * returns a tab for tabbed navigation.
+ * If the variables $link and $args ar left empty, an inactive tab is created
+ *
+ * @uses $GLOBALS['strEmpty']
+ * @uses $GLOBALS['strDrop']
+ * @uses $GLOBALS['active_page']
+ * @uses $GLOBALS['url_query']
+ * @uses $cfg['MainPageIconic']
+ * @uses $GLOBALS['pmaThemeImage']
+ * @uses PMA_generate_common_url()
+ * @uses E_USER_NOTICE
+ * @uses htmlentities()
+ * @uses urlencode()
+ * @uses sprintf()
+ * @uses trigger_error()
+ * @uses array_merge()
+ * @uses basename()
+ * @param array $tab array with all options
+ * @return string html code for one tab, a link if valid otherwise a span
+ * @access public
*/
-if (isset($_REQUEST['sql_query']) && is_string($_REQUEST['sql_query'])) {
- $GLOBALS['sql_query'] = $_REQUEST['sql_query'];
-}
-
-//$_REQUEST['set_theme'] // checked later in this file LABEL_theme_setup
-//$_REQUEST['server']; // checked later in this file
-//$_REQUEST['lang']; // checked by LABEL_loading_language_file
-
-
-
-/******************************************************************************/
-/* parsing config file LABEL_parsing_config_file */
-
-if (empty($_SESSION['PMA_Config'])) {
- /**
- * We really need this one!
- */
- if (! function_exists('preg_replace')) {
- PMA_fatalError('strCantLoad', 'pcre');
+function PMA_getTab($tab)
+{
+ // default values
+ $defaults = array(
+ 'text' => '',
+ 'class' => '',
+ 'active' => false,
+ 'link' => '',
+ 'sep' => '?',
+ 'attr' => '',
+ 'args' => '',
+ 'warning' => '',
+ );
+
+ $tab = array_merge($defaults, $tab);
+
+ // determine additionnal style-class
+ if (empty($tab['class'])) {
+ if ($tab['text'] == $GLOBALS['strEmpty']
+ || $tab['text'] == $GLOBALS['strDrop']) {
+ $tab['class'] = 'caution';
+ } elseif (!empty($tab['active'])
+ || (isset($GLOBALS['active_page'])
+ && $GLOBALS['active_page'] == $tab['link'])
+ || basename(PMA_getenv('PHP_SELF')) == $tab['link'])
+ {
+ $tab['class'] = 'active';
+ }
}
- /**
- * @global PMA_Config $_SESSION['PMA_Config']
- */
- $_SESSION['PMA_Config'] = new PMA_Config('./config.inc.php');
-
-} elseif (version_compare(phpversion(), '5', 'lt')) {
- /**
- * @todo move all __wakeup() functionality into session.inc.php
- */
- $_SESSION['PMA_Config']->__wakeup();
-}
-
-if (!defined('PMA_MINIMUM_COMMON')) {
- $_SESSION['PMA_Config']->checkPmaAbsoluteUri();
-}
-
-/**
- * BC - enable backward compatibility
- * exports all config settings into $GLOBALS ($GLOBALS['cfg'])
- */
-$_SESSION['PMA_Config']->enableBc();
+ if (!empty($tab['warning'])) {
+ $tab['class'] .= ' warning';
+ $tab['attr'] .= ' title="' . htmlspecialchars($tab['warning']) . '"';
+ }
+ // build the link
+ if (!empty($tab['link'])) {
+ $tab['link'] = htmlentities($tab['link']);
+ $tab['link'] = $tab['link'] . $tab['sep']
+ .(empty($GLOBALS['url_query']) ?
+ PMA_generate_common_url() : $GLOBALS['url_query']);
+ if (!empty($tab['args'])) {
+ foreach ($tab['args'] as $param => $value) {
+ $tab['link'] .= '&amp;' . urlencode($param) . '='
+ . urlencode($value);
+ }
+ }
+ }
-/**
- * check https connection
- */
-if ($_SESSION['PMA_Config']->get('ForceSSL')
- && !$_SESSION['PMA_Config']->get('is_https')) {
- PMA_sendHeaderLocation(
- preg_replace('/^http/', 'https',
- $_SESSION['PMA_Config']->get('PmaAbsoluteUri'))
- . PMA_generate_common_url($_GET));
- exit;
-}
+ // display icon, even if iconic is disabled but the link-text is missing
+ if (($GLOBALS['cfg']['MainPageIconic'] || empty($tab['text']))
+ && isset($tab['icon'])) {
+ $image = '<img class="icon" src="' . htmlentities($GLOBALS['pmaThemeImage'])
+ .'%1$s" width="16" height="16" alt="%2$s" />%2$s';
+ $tab['text'] = sprintf($image, htmlentities($tab['icon']), $tab['text']);
+ }
+ // check to not display an empty link-text
+ elseif (empty($tab['text'])) {
+ $tab['text'] = '?';
+ trigger_error('empty linktext in function ' . __FUNCTION__ . '()',
+ E_USER_NOTICE);
+ }
+ if (!empty($tab['link'])) {
+ $out = '<a class="tab' . htmlentities($tab['class']) . '"'
+ .' href="' . $tab['link'] . '" ' . $tab['attr'] . '>'
+ . $tab['text'] . '</a>';
+ } else {
+ $out = '<span class="tab' . htmlentities($tab['class']) . '">'
+ . $tab['text'] . '</span>';
+ }
-/******************************************************************************/
-/* loading language file LABEL_loading_language_file */
+ return $out;
+} // end of the 'PMA_getTab()' function
/**
- * Added messages while developing:
+ * returns html-code for a tab navigation
+ *
+ * @uses PMA_getTab()
+ * @uses htmlentities()
+ * @param array $tabs one element per tab
+ * @param string $tag_id id used for the html-tag
+ * @return string html-code for tab-navigation
*/
-if (file_exists('./lang/added_messages.php')) {
- include './lang/added_messages.php';
-}
+function PMA_getTabs($tabs, $tag_id = 'topmenu')
+{
+ $tab_navigation =
+ '<div id="' . htmlentities($tag_id) . 'container">' . "\n"
+ .'<ul id="' . htmlentities($tag_id) . '">' . "\n";
-/**
- * Includes the language file if it hasn't been included yet
- */
-require './libraries/language.lib.php';
+ foreach ($tabs as $tab) {
+ $tab_navigation .= '<li>' . PMA_getTab($tab) . '</li>' . "\n";
+ }
+ $tab_navigation .=
+ '</ul>' . "\n"
+ .'<div class="clearfloat"></div>'
+ .'</div>' . "\n";
-/**
- * check for errors occured while loading config
- * this check is done here after loading lang files to present errors in locale
- */
-if ($_SESSION['PMA_Config']->error_config_file) {
- $GLOBALS['PMA_errors'][] = $strConfigFileError
- . '<br /><br />'
- . ($_SESSION['PMA_Config']->getSource() == './config.inc.php' ?
- '<a href="show_config_errors.php"'
- .' target="_blank">' . $_SESSION['PMA_Config']->getSource() . '</a>'
- :
- '<a href="' . $_SESSION['PMA_Config']->getSource() . '"'
- .' target="_blank">' . $_SESSION['PMA_Config']->getSource() . '</a>');
-}
-if ($_SESSION['PMA_Config']->error_config_default_file) {
- $GLOBALS['PMA_errors'][] = sprintf($strConfigDefaultFileError,
- $_SESSION['PMA_Config']->default_source);
-}
-if ($_SESSION['PMA_Config']->error_pma_uri) {
- $GLOBALS['PMA_errors'][] = sprintf($strPmaUriError);
+ return $tab_navigation;
}
-/**
- * current server
- * @global integer $GLOBALS['server']
- */
-$GLOBALS['server'] = 0;
/**
- * Servers array fixups.
- * $default_server comes from PMA_Config::enableBc()
- * @todo merge into PMA_Config
+ * Displays a link, or a button if the link's URL is too large, to
+ * accommodate some browsers' limitations
+ *
+ * @param string the URL
+ * @param string the link message
+ * @param mixed $tag_params string: js confirmation
+ * array: additional tag params (f.e. style="")
+ * @param boolean $new_form we set this to false when we are already in
+ * a form, to avoid generating nested forms
+ *
+ * @return string the results to be echoed or saved in an array
*/
-// Do we have some server?
-if (!isset($cfg['Servers']) || count($cfg['Servers']) == 0) {
- // No server => create one with defaults
- $cfg['Servers'] = array(1 => $default_server);
-} else {
- // We have server(s) => apply default config
- $new_servers = array();
-
- foreach ($cfg['Servers'] as $server_index => $each_server) {
-
- // Detect wrong configuration
- if (!is_int($server_index) || $server_index < 1) {
- $GLOBALS['PMA_errors'][] = sprintf($strInvalidServerIndex, $server_index);
+function PMA_linkOrButton($url, $message, $tag_params = array(),
+ $new_form = true, $strip_img = false, $target = '')
+{
+ if (! is_array($tag_params)) {
+ $tmp = $tag_params;
+ $tag_params = array();
+ if (!empty($tmp)) {
+ $tag_params['onclick'] = 'return confirmLink(this, \'' . $tmp . '\')';
}
+ unset($tmp);
+ }
+ if (! empty($target)) {
+ $tag_params['target'] = htmlentities($target);
+ }
- $each_server = array_merge($default_server, $each_server);
+ $tag_params_strings = array();
+ foreach ($tag_params as $par_name => $par_value) {
+ // htmlspecialchars() only on non javascript
+ $par_value = substr($par_name, 0, 2) == 'on'
+ ? $par_value
+ : htmlspecialchars($par_value);
+ $tag_params_strings[] = $par_name . '="' . $par_value . '"';
+ }
- // Don't use servers with no hostname
- if ($each_server['connect_type'] == 'tcp' && empty($each_server['host'])) {
- $GLOBALS['PMA_errors'][] = sprintf($strInvalidServerHostname, $server_index);
+ // previously the limit was set to 2047, it seems 1000 is better
+ if (strlen($url) <= 1000) {
+ // no whitespace within an <a> else Safari will make it part of the link
+ $ret = "\n" . '<a href="' . $url . '" '
+ . implode(' ', $tag_params_strings) . '>'
+ . $message . '</a>' . "\n";
+ } else {
+ // no spaces (linebreaks) at all
+ // or after the hidden fields
+ // IE will display them all
+
+ // add class=link to submit button
+ if (empty($tag_params['class'])) {
+ $tag_params['class'] = 'link';
+ }
+
+ // decode encoded url separators
+ $separator = PMA_get_arg_separator();
+ // on most places separator is still hard coded ...
+ if ($separator !== '&') {
+ // ... so always replace & with $separator
+ $url = str_replace(htmlentities('&'), $separator, $url);
+ $url = str_replace('&', $separator, $url);
+ }
+ $url = str_replace(htmlentities($separator), $separator, $url);
+ // end decode
+
+ $url_parts = parse_url($url);
+ $query_parts = explode($separator, $url_parts['query']);
+ if ($new_form) {
+ $ret = '<form action="' . $url_parts['path'] . '" class="link"'
+ . ' method="post"' . $target . ' style="display: inline;">';
+ $subname_open = '';
+ $subname_close = '';
+ $submit_name = '';
+ } else {
+ $query_parts[] = 'redirect=' . $url_parts['path'];
+ if (empty($GLOBALS['subform_counter'])) {
+ $GLOBALS['subform_counter'] = 0;
+ }
+ $GLOBALS['subform_counter']++;
+ $ret = '';
+ $subname_open = 'subform[' . $GLOBALS['subform_counter'] . '][';
+ $subname_close = ']';
+ $submit_name = ' name="usesubform[' . $GLOBALS['subform_counter'] . ']"';
+ }
+ foreach ($query_parts as $query_pair) {
+ list($eachvar, $eachval) = explode('=', $query_pair);
+ $ret .= '<input type="hidden" name="' . $subname_open . $eachvar
+ . $subname_close . '" value="'
+ . htmlspecialchars(urldecode($eachval)) . '" />';
+ } // end while
+
+ if (stristr($message, '<img')) {
+ if ($strip_img) {
+ $message = trim(strip_tags($message));
+ $ret .= '<input type="submit"' . $submit_name . ' '
+ . implode(' ', $tag_params_strings)
+ . ' value="' . htmlspecialchars($message) . '" />';
+ } else {
+ $ret .= '<input type="image"' . $submit_name . ' '
+ . implode(' ', $tag_params_strings)
+ . ' src="' . preg_replace(
+ '/^.*\ssrc="([^"]*)".*$/si', '\1', $message) . '"'
+ . ' value="' . htmlspecialchars(
+ preg_replace('/^.*\salt="([^"]*)".*$/si', '\1',
+ $message))
+ . '" />';
+ }
+ } else {
+ $message = trim(strip_tags($message));
+ $ret .= '<input type="submit"' . $submit_name . ' '
+ . implode(' ', $tag_params_strings)
+ . ' value="' . htmlspecialchars($message) . '" />';
}
-
- // Final solution to bug #582890
- // If we are using a socket connection
- // and there is nothing in the verbose server name
- // or the host field, then generate a name for the server
- // in the form of "Server 2", localized of course!
- if ($each_server['connect_type'] == 'socket' && empty($each_server['host']) && empty($each_server['verbose'])) {
- $each_server['verbose'] = $GLOBALS['strServer'] . $server_index;
+ if ($new_form) {
+ $ret .= '</form>';
}
+ } // end if... else...
- $new_servers[$server_index] = $each_server;
- }
- $cfg['Servers'] = $new_servers;
- unset($new_servers, $server_index, $each_server);
-}
-
-// Cleanup
-unset($default_server);
-
+ return $ret;
+} // end of the 'PMA_linkOrButton()' function
-/******************************************************************************/
-/* setup themes LABEL_theme_setup */
/**
- * @global PMA_Theme_Manager $_SESSION['PMA_Theme_Manager']
+ * Returns a given timespan value in a readable format.
+ *
+ * @uses $GLOBALS['timespanfmt']
+ * @uses sprintf()
+ * @uses floor()
+ * @param int the timespan
+ *
+ * @return string the formatted value
*/
-if (! isset($_SESSION['PMA_Theme_Manager'])) {
- $_SESSION['PMA_Theme_Manager'] = new PMA_Theme_Manager;
-} else {
- /**
- * @todo move all __wakeup() functionality into session.inc.php
- */
- $_SESSION['PMA_Theme_Manager']->checkConfig();
-}
-
-// for the theme per server feature
-if (isset($_REQUEST['server']) && !isset($_REQUEST['set_theme'])) {
- $GLOBALS['server'] = $_REQUEST['server'];
- $tmp = $_SESSION['PMA_Theme_Manager']->getThemeCookie();
- if (empty($tmp)) {
- $tmp = $_SESSION['PMA_Theme_Manager']->theme_default;
+function PMA_timespanFormat($seconds)
+{
+ $return_string = '';
+ $days = floor($seconds / 86400);
+ if ($days > 0) {
+ $seconds -= $days * 86400;
+ }
+ $hours = floor($seconds / 3600);
+ if ($days > 0 || $hours > 0) {
+ $seconds -= $hours * 3600;
}
- $_SESSION['PMA_Theme_Manager']->setActiveTheme($tmp);
- unset($tmp);
+ $minutes = floor($seconds / 60);
+ if ($days > 0 || $hours > 0 || $minutes > 0) {
+ $seconds -= $minutes * 60;
+ }
+ return sprintf($GLOBALS['timespanfmt'], (string)$days, (string)$hours, (string)$minutes, (string)$seconds);
}
+
/**
- * @todo move into PMA_Theme_Manager::__wakeup()
+ * Takes a string and outputs each character on a line for itself. Used
+ * mainly for horizontalflipped display mode.
+ * Takes care of special html-characters.
+ * Fulfills todo-item
+ * http://sf.net/tracker/?func=detail&aid=544361&group_id=23067&atid=377411
+ *
+ * @todo add a multibyte safe function PMA_STR_split()
+ * @uses strlen
+ * @param string The string
+ * @param string The Separator (defaults to "<br />\n")
+ *
+ * @access public
+ * @author Garvin Hicking <me@supergarv.de>
+ * @return string The flipped string
*/
-if (isset($_REQUEST['set_theme'])) {
- // if user selected a theme
- $_SESSION['PMA_Theme_Manager']->setActiveTheme($_REQUEST['set_theme']);
+function PMA_flipstring($string, $Separator = "<br />\n")
+{
+ $format_string = '';
+ $charbuff = false;
+
+ for ($i = 0; $i < strlen($string); $i++) {
+ $char = $string{$i};
+ $append = false;
+
+ if ($char == '&') {
+ $format_string .= $charbuff;
+ $charbuff = $char;
+ $append = true;
+ } elseif (!empty($charbuff)) {
+ $charbuff .= $char;
+ } elseif ($char == ';' && !empty($charbuff)) {
+ $format_string .= $charbuff;
+ $charbuff = false;
+ $append = true;
+ } else {
+ $format_string .= $char;
+ $append = true;
+ }
+
+ if ($append && ($i != strlen($string))) {
+ $format_string .= $Separator;
+ }
+ }
+
+ return $format_string;
}
-/**
- * the theme object
- * @global PMA_Theme $_SESSION['PMA_Theme']
- */
-$_SESSION['PMA_Theme'] = $_SESSION['PMA_Theme_Manager']->theme;
-// BC
-/**
- * the active theme
- * @global string $GLOBALS['theme']
- */
-$GLOBALS['theme'] = $_SESSION['PMA_Theme']->getName();
/**
- * the theme path
- * @global string $GLOBALS['pmaThemePath']
- */
-$GLOBALS['pmaThemePath'] = $_SESSION['PMA_Theme']->getPath();
-/**
- * the theme image path
- * @global string $GLOBALS['pmaThemeImage']
+ * Function added to avoid path disclosures.
+ * Called by each script that needs parameters, it displays
+ * an error message and, by default, stops the execution.
+ *
+ * Not sure we could use a strMissingParameter message here,
+ * would have to check if the error message file is always available
+ *
+ * @todo localize error message
+ * @todo use PMA_fatalError() if $die === true?
+ * @uses PMA_getenv()
+ * @uses header_meta_style.inc.php
+ * basename
+ * @param array The names of the parameters needed by the calling
+ * script.
+ * @param boolean Stop the execution?
+ * (Set this manually to false in the calling script
+ * until you know all needed parameters to check).
+ * @param boolean Whether to include this list in checking for special params.
+ * @global string path to current script
+ * @global boolean flag whether any special variable was required
+ *
+ * @access public
+ * @author Marc Delisle (lem9@users.sourceforge.net)
*/
-$GLOBALS['pmaThemeImage'] = $_SESSION['PMA_Theme']->getImgPath();
+function PMA_checkParameters($params, $die = true, $request = true)
+{
+ global $checked_special;
-/**
- * load layout file if exists
- */
-if (@file_exists($_SESSION['PMA_Theme']->getLayoutFile())) {
- include $_SESSION['PMA_Theme']->getLayoutFile();
- /**
- * @todo remove if all themes are update use Navi instead of Left as frame name
- */
- if (! isset($GLOBALS['cfg']['NaviWidth'])
- && isset($GLOBALS['cfg']['LeftWidth'])) {
- $GLOBALS['cfg']['NaviWidth'] = $GLOBALS['cfg']['LeftWidth'];
+ if (!isset($checked_special)) {
+ $checked_special = false;
}
-}
-
-if (! defined('PMA_MINIMUM_COMMON')) {
- /**
- * Charset conversion.
- */
- require_once './libraries/charset_conversion.lib.php';
- /**
- * String handling
- */
- require_once './libraries/string.lib.php';
+ $reported_script_name = basename(PMA_getenv('PHP_SELF'));
+ $found_error = false;
+ $error_message = '';
- /**
- * Lookup server by name
- * by Arnold - Helder Hosting
- * (see FAQ 4.8)
- */
- if (! empty($_REQUEST['server']) && is_string($_REQUEST['server']) && ! ctype_digit($_REQUEST['server'])) {
- foreach ($cfg['Servers'] as $i => $server) {
- if ($server['host'] == $_REQUEST['server']) {
- $_REQUEST['server'] = $i;
- break;
- }
+ foreach ($params as $param) {
+ if ($request && $param != 'db' && $param != 'table') {
+ $checked_special = true;
}
- if (is_string($_REQUEST['server'])) {
- unset($_REQUEST['server']);
- }
- unset($i);
- }
- /**
- * If no server is selected, make sure that $cfg['Server'] is empty (so
- * that nothing will work), and skip server authentication.
- * We do NOT exit here, but continue on without logging into any server.
- * This way, the welcome page will still come up (with no server info) and
- * present a choice of servers in the case that there are multiple servers
- * and '$cfg['ServerDefault'] = 0' is set.
- */
-
- if (isset($_REQUEST['server']) && (is_string($_REQUEST['server']) || is_numeric($_REQUEST['server'])) && ! empty($_REQUEST['server']) && ! empty($cfg['Servers'][$_REQUEST['server']])) {
- $GLOBALS['server'] = $_REQUEST['server'];
- $cfg['Server'] = $cfg['Servers'][$GLOBALS['server']];
- } else {
- if (!empty($cfg['Servers'][$cfg['ServerDefault']])) {
- $GLOBALS['server'] = $cfg['ServerDefault'];
- $cfg['Server'] = $cfg['Servers'][$GLOBALS['server']];
- } else {
- $GLOBALS['server'] = 0;
- $cfg['Server'] = array();
+ if (!isset($GLOBALS[$param])) {
+ $error_message .= $reported_script_name
+ . ': Missing parameter: ' . $param
+ . ' <a href="./Documentation.html#faqmissingparameters"'
+ . ' target="documentation"> (FAQ 2.8)</a><br />';
+ $found_error = true;
}
}
- $GLOBALS['url_params']['server'] = $GLOBALS['server'];
-
- if (! empty($cfg['Server'])) {
-
+ if ($found_error) {
/**
- * Loads the proper database interface for this server
+ * display html meta tags
*/
- require_once './libraries/database_interface.lib.php';
-
- // Gets the authentication library that fits the $cfg['Server'] settings
- // and run authentication
-
- // (for a quick check of path disclosure in auth/cookies:)
- $coming_from_common = true;
-
- // to allow HTTP or http
- $cfg['Server']['auth_type'] = strtolower($cfg['Server']['auth_type']);
- if (! file_exists('./libraries/auth/' . $cfg['Server']['auth_type'] . '.auth.lib.php')) {
- PMA_fatalError($strInvalidAuthMethod . ' ' . $cfg['Server']['auth_type']);
+ require_once './libraries/header_meta_style.inc.php';
+ echo '</head><body><p>' . $error_message . '</p></body></html>';
+ if ($die) {
+ exit();
}
- /**
- * the required auth type plugin
- */
- require_once './libraries/auth/' . $cfg['Server']['auth_type'] . '.auth.lib.php';
+ }
+} // end function
- if (!PMA_auth_check()) {
- PMA_auth();
- } else {
- PMA_auth_set_user();
+/**
+ * Function to generate unique condition for specified row.
+ *
+ * @uses PMA_MYSQL_INT_VERSION
+ * @uses $GLOBALS['analyzed_sql'][0]
+ * @uses PMA_DBI_field_flags()
+ * @uses PMA_backquote()
+ * @uses PMA_sqlAddslashes()
+ * @uses stristr()
+ * @uses bin2hex()
+ * @uses preg_replace()
+ * @param resource $handle current query result
+ * @param integer $fields_cnt number of fields
+ * @param array $fields_meta meta information about fields
+ * @param array $row current row
+ *
+ * @access public
+ * @author Michal Cihar (michal@cihar.com)
+ * @return string calculated condition
+ */
+function PMA_getUniqueCondition($handle, $fields_cnt, $fields_meta, $row)
+{
+ $primary_key = '';
+ $unique_key = '';
+ $nonprimary_condition = '';
+
+ for ($i = 0; $i < $fields_cnt; ++$i) {
+ $condition = '';
+ $field_flags = PMA_DBI_field_flags($handle, $i);
+ $meta = $fields_meta[$i];
+
+ // do not use an alias in a condition
+ if (! isset($meta->orgname) || ! strlen($meta->orgname)) {
+ $meta->orgname = $meta->name;
+
+ if (isset($GLOBALS['analyzed_sql'][0]['select_expr'])
+ && is_array($GLOBALS['analyzed_sql'][0]['select_expr'])) {
+ foreach ($GLOBALS['analyzed_sql'][0]['select_expr']
+ as $select_expr) {
+ // need (string) === (string)
+ // '' !== 0 but '' == 0
+ if ((string) $select_expr['alias'] === (string) $meta->name) {
+ $meta->orgname = $select_expr['column'];
+ break;
+ } // end if
+ } // end foreach
+ }
}
- // Check IP-based Allow/Deny rules as soon as possible to reject the
- // user
- // Based on mod_access in Apache:
- // http://cvs.apache.org/viewcvs.cgi/httpd-2.0/modules/aaa/mod_access.c?rev=1.37&content-type=text/vnd.viewcvs-markup
- // Look at: "static int check_dir_access(request_rec *r)"
- // Robbat2 - May 10, 2002
- if (isset($cfg['Server']['AllowDeny'])
- && isset($cfg['Server']['AllowDeny']['order'])) {
-
- /**
- * ip based access library
- */
- require_once './libraries/ip_allow_deny.lib.php';
-
- $allowDeny_forbidden = false; // default
- if ($cfg['Server']['AllowDeny']['order'] == 'allow,deny') {
- $allowDeny_forbidden = true;
- if (PMA_allowDeny('allow')) {
- $allowDeny_forbidden = false;
- }
- if (PMA_allowDeny('deny')) {
- $allowDeny_forbidden = true;
- }
- } elseif ($cfg['Server']['AllowDeny']['order'] == 'deny,allow') {
- if (PMA_allowDeny('deny')) {
- $allowDeny_forbidden = true;
- }
- if (PMA_allowDeny('allow')) {
- $allowDeny_forbidden = false;
- }
- } elseif ($cfg['Server']['AllowDeny']['order'] == 'explicit') {
- if (PMA_allowDeny('allow')
- && !PMA_allowDeny('deny')) {
- $allowDeny_forbidden = false;
- } else {
- $allowDeny_forbidden = true;
- }
- } // end if ... elseif ... elseif
- // Ejects the user if banished
- if ($allowDeny_forbidden) {
- PMA_auth_fails();
+ // to fix the bug where float fields (primary or not)
+ // can't be matched because of the imprecision of
+ // floating comparison, use CONCAT
+ // (also, the syntax "CONCAT(field) IS NULL"
+ // that we need on the next "if" will work)
+ if ($meta->type == 'real') {
+ $condition = ' CONCAT(' . PMA_backquote($meta->table) . '.'
+ . PMA_backquote($meta->orgname) . ') ';
+ } else {
+ // string and blob fields have to be converted using
+ // the system character set (always utf8) since
+ // mysql4.1 can use different charset for fields.
+ if (PMA_MYSQL_INT_VERSION >= 40100
+ && ($meta->type == 'string' || $meta->type == 'blob')) {
+ $condition = ' CONVERT(' . PMA_backquote($meta->table) . '.'
+ . PMA_backquote($meta->orgname) . ' USING utf8) ';
+ } else {
+ $condition = ' ' . PMA_backquote($meta->table) . '.'
+ . PMA_backquote($meta->orgname) . ' ';
}
- unset($allowDeny_forbidden); //Clean up after you!
- } // end if
+ } // end if... else...
- // is root allowed?
- if (!$cfg['Server']['AllowRoot'] && $cfg['Server']['user'] == 'root') {
- $allowDeny_forbidden = true;
- PMA_auth_fails();
- unset($allowDeny_forbidden); //Clean up after you!
+ if (!isset($row[$i]) || is_null($row[$i])) {
+ $condition .= 'IS NULL AND';
+ } else {
+ // timestamp is numeric on some MySQL 4.1
+ if ($meta->numeric && $meta->type != 'timestamp') {
+ $condition .= '= ' . $row[$i] . ' AND';
+ } elseif ($meta->type == 'blob'
+ // hexify only if this is a true not empty BLOB
+ && stristr($field_flags, 'BINARY')
+ && !empty($row[$i])) {
+ // do not waste memory building a too big condition
+ if (strlen($row[$i]) < 1000) {
+ if (PMA_MYSQL_INT_VERSION < 40002) {
+ $condition .= 'LIKE 0x' . bin2hex($row[$i]) . ' AND';
+ } else {
+ // use a CAST if possible, to avoid problems
+ // if the field contains wildcard characters % or _
+ $condition .= '= CAST(0x' . bin2hex($row[$i])
+ . ' AS BINARY) AND';
+ }
+ }
+ } else {
+ $condition .= '= \''
+ . PMA_sqlAddslashes($row[$i], false, true) . '\' AND';
+ }
}
+ if ($meta->primary_key > 0) {
+ $primary_key .= $condition;
+ } elseif ($meta->unique_key > 0) {
+ $unique_key .= $condition;
+ }
+ $nonprimary_condition .= $condition;
+ } // end for
+
+ // Correction University of Virginia 19991216:
+ // prefer primary or unique keys for condition,
+ // but use conjunction of all values if no primary key
+ if ($primary_key) {
+ $preferred_condition = $primary_key;
+ } elseif ($unique_key) {
+ $preferred_condition = $unique_key;
+ } else {
+ $preferred_condition = $nonprimary_condition;
+ }
- $bkp_track_err = @ini_set('track_errors', 1);
+ return preg_replace('|\s?AND$|', '', $preferred_condition);
+} // end function
- // Try to connect MySQL with the control user profile (will be used to
- // get the privileges list for the current user but the true user link
- // must be open after this one so it would be default one for all the
- // scripts)
- $controllink = false;
- if ($cfg['Server']['controluser'] != '') {
- $controllink = PMA_DBI_connect($cfg['Server']['controluser'],
- $cfg['Server']['controlpass'], true);
- }
- if (! $controllink) {
- $controllink = PMA_DBI_connect($cfg['Server']['user'],
- $cfg['Server']['password'], true);
- } // end if ... else
+/**
+ * Generate a button or image tag
+ *
+ * @uses PMA_USR_BROWSER_AGENT
+ * @uses $GLOBALS['pmaThemeImage']
+ * @uses $GLOBALS['cfg']['PropertiesIconic']
+ * @param string name of button element
+ * @param string class of button element
+ * @param string name of image element
+ * @param string text to display
+ * @param string image to display
+ *
+ * @access public
+ * @author Michal Cihar (michal@cihar.com)
+ */
+function PMA_buttonOrImage($button_name, $button_class, $image_name, $text,
+ $image)
+{
+ /* Opera has trouble with <input type="image"> */
+ /* IE has trouble with <button> */
+ if (PMA_USR_BROWSER_AGENT != 'IE') {
+ echo '<button class="' . $button_class . '" type="submit"'
+ .' name="' . $button_name . '" value="' . $text . '"'
+ .' title="' . $text . '">' . "\n"
+ .'<img class="icon" src="' . $GLOBALS['pmaThemeImage'] . $image . '"'
+ .' title="' . $text . '" alt="' . $text . '" width="16"'
+ .' height="16" />'
+ .($GLOBALS['cfg']['PropertiesIconic'] === 'both' ? '&nbsp;' . $text : '') . "\n"
+ .'</button>' . "\n";
+ } else {
+ echo '<input type="image" name="' . $image_name . '" value="'
+ . $text . '" title="' . $text . '" src="' . $GLOBALS['pmaThemeImage']
+ . $image . '" />'
+ . ($GLOBALS['cfg']['PropertiesIconic'] === 'both' ? '&nbsp;' . $text : '') . "\n";
+ }
+} // end function
- // Pass #1 of DB-Config to read in master level DB-Config will go here
- // Robbat2 - May 11, 2002
+/**
+ * Generate a pagination selector for browsing resultsets
+ *
+ * @uses $GLOBALS['strPageNumber']
+ * @uses range()
+ * @param string URL for the JavaScript
+ * @param string Number of rows in the pagination set
+ * @param string current page number
+ * @param string number of total pages
+ * @param string If the number of pages is lower than this
+ * variable, no pages will be ommitted in
+ * pagination
+ * @param string How many rows at the beginning should always
+ * be shown?
+ * @param string How many rows at the end should always
+ * be shown?
+ * @param string Percentage of calculation page offsets to
+ * hop to a next page
+ * @param string Near the current page, how many pages should
+ * be considered "nearby" and displayed as
+ * well?
+ *
+ * @access public
+ * @author Garvin Hicking (pma@supergarv.de)
+ */
+function PMA_pageselector($url, $rows, $pageNow = 1, $nbTotalPage = 1,
+ $showAll = 200, $sliceStart = 5, $sliceEnd = 5, $percent = 20,
+ $range = 10)
+{
+ $gotopage = $GLOBALS['strPageNumber']
+ . ' <select name="goToPage" onchange="goToUrl(this, \''
+ . $url . '\');">' . "\n";
+ if ($nbTotalPage < $showAll) {
+ $pages = range(1, $nbTotalPage);
+ } else {
+ $pages = array();
+
+ // Always show first X pages
+ for ($i = 1; $i <= $sliceStart; $i++) {
+ $pages[] = $i;
+ }
+
+ // Always show last X pages
+ for ($i = $nbTotalPage - $sliceEnd; $i <= $nbTotalPage; $i++) {
+ $pages[] = $i;
+ }
+
+ // garvin: Based on the number of results we add the specified
+ // $percent percentate to each page number,
+ // so that we have a representing page number every now and then to
+ // immideately jump to specific pages.
+ // As soon as we get near our currently chosen page ($pageNow -
+ // $range), every page number will be
+ // shown.
+ $i = $sliceStart;
+ $x = $nbTotalPage - $sliceEnd;
+ $met_boundary = false;
+ while ($i <= $x) {
+ if ($i >= ($pageNow - $range) && $i <= ($pageNow + $range)) {
+ // If our pageselector comes near the current page, we use 1
+ // counter increments
+ $i++;
+ $met_boundary = true;
+ } else {
+ // We add the percentate increment to our current page to
+ // hop to the next one in range
+ $i = $i + floor($nbTotalPage / $percent);
- // Connects to the server (validates user's login)
- $userlink = PMA_DBI_connect($cfg['Server']['user'],
- $cfg['Server']['password'], false);
+ // Make sure that we do not cross our boundaries.
+ if ($i > ($pageNow - $range) && !$met_boundary) {
+ $i = $pageNow - $range;
+ }
+ }
- // Pass #2 of DB-Config to read in user level DB-Config will go here
- // Robbat2 - May 11, 2002
+ if ($i > 0 && $i <= $x) {
+ $pages[] = $i;
+ }
+ }
- @ini_set('track_errors', $bkp_track_err);
- unset($bkp_track_err);
+ // Since because of ellipsing of the current page some numbers may be double,
+ // we unify our array:
+ sort($pages);
+ $pages = array_unique($pages);
+ }
- /**
- * If we auto switched to utf-8 we need to reread messages here
- */
- if (defined('PMA_LANG_RELOAD')) {
- require './libraries/language.lib.php';
+ foreach ($pages as $i) {
+ if ($i == $pageNow) {
+ $selected = 'selected="selected" style="font-weight: bold"';
+ } else {
+ $selected = '';
}
+ $gotopage .= ' <option ' . $selected . ' value="' . (($i - 1) * $rows) . '">' . $i . '</option>' . "\n";
+ }
- /**
- * SQL Parser code
- */
- require_once './libraries/sqlparser.lib.php';
-
- /**
- * SQL Validator interface code
- */
- require_once './libraries/sqlvalidator.lib.php';
+ $gotopage .= ' </select>';
- /**
- * the PMA_List_Database class
- */
- require_once './libraries/PMA_List_Database.class.php';
- $PMA_List_Database = new PMA_List_Database($userlink, $controllink);
+ return $gotopage;
+} // end function
- } // end server connecting
+/**
+ * replaces %u in given path with current user name
+ *
+ * example:
+ * <code>
+ * $user_dir = PMA_userDir('/var/pma_tmp/%u/'); // '/var/pma_tmp/root/'
+ *
+ * </code>
+ * @uses $cfg['Server']['user']
+ * @uses substr()
+ * @uses str_replace()
+ * @param string $dir with wildcard for user
+ * @return string per user directory
+ */
+function PMA_userDir($dir)
+{
+ // add trailing slash
+ if (substr($dir, -1) != '/') {
+ $dir .= '/';
+ }
- /**
- * Kanji encoding convert feature appended by Y.Kawada (2002/2/20)
- */
- if (@function_exists('mb_convert_encoding')
- && strpos(' ' . $lang, 'ja-')
- && file_exists('./libraries/kanji-encoding.lib.php')) {
- require_once './libraries/kanji-encoding.lib.php';
- /**
- * enable multibyte string support
- */
- define('PMA_MULTIBYTE_ENCODING', 1);
- } // end if
+ return str_replace('%u', $GLOBALS['cfg']['Server']['user'], $dir);
+}
- /**
- * save some settings in cookies
- * @todo should be done in PMA_Config
- */
- PMA_setCookie('pma_lang', $GLOBALS['lang']);
- PMA_setCookie('pma_charset', $GLOBALS['convcharset']);
- PMA_setCookie('pma_collation_connection', $GLOBALS['collation_connection']);
+/**
+ * returns html code for db link to default db page
+ *
+ * @uses $cfg['DefaultTabDatabase']
+ * @uses $GLOBALS['db']
+ * @uses $GLOBALS['strJumpToDB']
+ * @uses PMA_generate_common_url()
+ * @uses PMA_unescape_mysql_wildcards()
+ * @uses strlen()
+ * @uses sprintf()
+ * @uses htmlspecialchars()
+ * @param string $database
+ * @return string html link to default db page
+ */
+function PMA_getDbLink($database = null)
+{
+ if (!strlen($database)) {
+ if (!strlen($GLOBALS['db'])) {
+ return '';
+ }
+ $database = $GLOBALS['db'];
+ } else {
+ $database = PMA_unescape_mysql_wildcards($database);
+ }
- $_SESSION['PMA_Theme_Manager']->setThemeCookie();
-} // end if !defined('PMA_MINIMUM_COMMON')
+ return '<a href="' . $GLOBALS['cfg']['DefaultTabDatabase'] . '?' . PMA_generate_common_url($database) . '"'
+ .' title="' . sprintf($GLOBALS['strJumpToDB'], htmlspecialchars($database)) . '">'
+ .htmlspecialchars($database) . '</a>';
+}
-if (!empty($__redirect) && in_array($__redirect, $goto_whitelist)) {
- // to handle bug #1388167
- if (isset($_GET['is_js_confirmed'])) {
- $is_js_confirmed = 1;
+/**
+ * Displays a lightbulb hint explaining a known external bug
+ * that affects a functionality
+ *
+ * @uses PMA_MYSQL_INT_VERSION
+ * @uses $GLOBALS['strKnownExternalBug']
+ * @uses PMA_showHint()
+ * @uses sprintf()
+ * @param string $functionality localized message explaining the func.
+ * @param string $component 'mysql' (eventually, 'php')
+ * @param string $minimum_version of this component
+ * @param string $bugref bug reference for this component
+ */
+function PMA_externalBug($functionality, $component, $minimum_version, $bugref)
+{
+ if ($component == 'mysql' && PMA_MYSQL_INT_VERSION < $minimum_version) {
+ echo PMA_showHint(sprintf($GLOBALS['strKnownExternalBug'], $functionality, 'http://bugs.mysql.com/' . $bugref));
}
- /**
- * include subform target page
- */
- require $__redirect;
- exit();
}
?>
diff --git a/libraries/core.lib.php b/libraries/core.lib.php
new file mode 100644
index 0000000000..d6ee9300a2
--- /dev/null
+++ b/libraries/core.lib.php
@@ -0,0 +1,449 @@
+<?php
+/* vim: set expandtab sw=4 ts=4 sts=4: */
+/**
+ * Core functions used all over the scripts.
+ *
+ * @version $Id$
+ */
+
+/**
+ * Removes insecure parts in a path; used before include() or
+ * require() when a part of the path comes from an insecure source
+ * like a cookie or form.
+ *
+ * @param string The path to check
+ *
+ * @return string The secured path
+ *
+ * @access public
+ * @author Marc Delisle (lem9@users.sourceforge.net)
+ */
+function PMA_securePath($path)
+{
+ // change .. to .
+ $path = preg_replace('@\.\.*@', '.', $path);
+
+ return $path;
+} // end function
+
+/**
+ * displays the given error message on phpMyAdmin error page in foreign language,
+ * ends script execution and closes session
+ *
+ * @todo use detected argument separator (PMA_Config)
+ * @uses $GLOBALS['session_name']
+ * @uses $GLOBALS['text_dir']
+ * @uses $GLOBALS['strError']
+ * @uses $GLOBALS['available_languages']
+ * @uses $GLOBALS['lang']
+ * @uses PMA_removeCookie()
+ * @uses select_lang.lib.php
+ * @uses $_COOKIE
+ * @uses substr()
+ * @uses header()
+ * @uses urlencode()
+ * @param string $error_message the error message or named error message
+ */
+function PMA_fatalError($error_message, $message_args = null)
+{
+ if (! isset($GLOBALS['available_languages'])) {
+ $GLOBALS['cfg'] = array('DefaultLang' => 'en-iso-8859-1',
+ 'AllowAnywhereRecoding' => false);
+ // Loads the language file
+ require_once './libraries/select_lang.lib.php';
+ if (isset($strError)) {
+ $GLOBALS['strError'] = $strError;
+ }
+ if (isset($text_dir)) {
+ $GLOBALS['text_dir'] = $text_dir;
+ }
+ }
+
+ if (substr($error_message, 0, 3) === 'str') {
+ if (isset($$error_message)) {
+ $error_message = $$error_message;
+ } elseif (isset($GLOBALS[$error_message])) {
+ $error_message = $GLOBALS[$error_message];
+ }
+ }
+
+ if (is_string($message_args)) {
+ $error_message = sprintf($error_message, $message_args);
+ } elseif (is_array($message_args)) {
+ $error_message = vsprintf($error_message, $message_args);
+ }
+ $error_message = strtr($error_message, array('<br />' => '[br]'));
+
+ // Displays the error message
+ // (do not use &amp; for parameters sent by header)
+ header('Location: error.php'
+ . '?lang=' . urlencode($GLOBALS['available_languages'][$GLOBALS['lang']][2])
+ . '&dir=' . urlencode($GLOBALS['text_dir'])
+ . '&type=' . urlencode($GLOBALS['strError'])
+ . '&error=' . urlencode($error_message));
+
+ // on fatal errors it cannot hurt to always delete the current session
+ if (isset($GLOBALS['session_name']) && isset($_COOKIE[$GLOBALS['session_name']])) {
+ PMA_removeCookie($GLOBALS['session_name']);
+ }
+
+ exit;
+}
+
+/**
+ * returns count of tables in given db
+ *
+ * @uses PMA_DBI_try_query()
+ * @uses PMA_backquote()
+ * @uses PMA_DBI_QUERY_STORE()
+ * @uses PMA_DBI_num_rows()
+ * @uses PMA_DBI_free_result()
+ * @param string $db database to count tables for
+ * @return integer count of tables in $db
+ */
+function PMA_getTableCount($db)
+{
+ $tables = PMA_DBI_try_query(
+ 'SHOW TABLES FROM ' . PMA_backquote($db) . ';',
+ null, PMA_DBI_QUERY_STORE);
+ if ($tables) {
+ $num_tables = PMA_DBI_num_rows($tables);
+ PMA_DBI_free_result($tables);
+ } else {
+ $num_tables = 0;
+ }
+
+ return $num_tables;
+}
+
+/**
+ * Converts numbers like 10M into bytes
+ * Used with permission from Moodle (http://moodle.org) by Martin Dougiamas
+ * (renamed with PMA prefix to avoid double definition when embedded
+ * in Moodle)
+ *
+ * @uses each()
+ * @uses strlen()
+ * @uses substr()
+ * @param string $size
+ * @return integer $size
+ */
+function PMA_get_real_size($size = 0)
+{
+ if (! $size) {
+ return 0;
+ }
+
+ $scan['gb'] = 1073741824; //1024 * 1024 * 1024;
+ $scan['g'] = 1073741824; //1024 * 1024 * 1024;
+ $scan['mb'] = 1048576;
+ $scan['m'] = 1048576;
+ $scan['kb'] = 1024;
+ $scan['k'] = 1024;
+ $scan['b'] = 1;
+
+ foreach ($scan as $unit => $factor) {
+ if (strlen($size) > strlen($unit)
+ && strtolower(substr($size, strlen($size) - strlen($unit))) == $unit) {
+ return substr($size, 0, strlen($size) - strlen($unit)) * $factor;
+ }
+ }
+
+ return $size;
+} // end function PMA_get_real_size()
+
+/**
+ * loads php module
+ *
+ * @uses PHP_OS
+ * @uses extension_loaded()
+ * @uses ini_get()
+ * @uses function_exists()
+ * @uses ob_start()
+ * @uses phpinfo()
+ * @uses strip_tags()
+ * @uses ob_get_contents()
+ * @uses ob_end_clean()
+ * @uses preg_match()
+ * @uses strtoupper()
+ * @uses substr()
+ * @uses dl()
+ * @param string $module name if module to load
+ * @return boolean success loading module
+ */
+function PMA_dl($module)
+{
+ static $dl_allowed = null;
+
+ if (extension_loaded($module)) {
+ return true;
+ }
+
+ if (null === $dl_allowed) {
+ if (!@ini_get('safe_mode')
+ && @ini_get('enable_dl')
+ && @function_exists('dl')) {
+ ob_start();
+ phpinfo(INFO_GENERAL); /* Only general info */
+ $a = strip_tags(ob_get_contents());
+ ob_end_clean();
+ if (preg_match('@Thread Safety[[:space:]]*enabled@', $a)) {
+ if (preg_match('@Server API[[:space:]]*\(CGI\|CLI\)@', $a)) {
+ $dl_allowed = true;
+ } else {
+ $dl_allowed = false;
+ }
+ } else {
+ $dl_allowed = true;
+ }
+ } else {
+ $dl_allowed = false;
+ }
+ }
+
+ if (!$dl_allowed) {
+ return false;
+ }
+
+ /* Once we require PHP >= 4.3, we might use PHP_SHLIB_SUFFIX here */
+ if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
+ $module_file = 'php_' . $module . '.dll';
+ } elseif (PHP_OS=='HP-UX') {
+ $module_file = $module . '.sl';
+ } else {
+ $module_file = $module . '.so';
+ }
+
+ return @dl($module_file);
+}
+
+/**
+ * merges array recursive like array_merge_recursive() but keyed-values are
+ * always overwritten.
+ *
+ * array PMA_array_merge_recursive(array $array1[, array $array2[, array ...]])
+ *
+ * @see http://php.net/array_merge
+ * @see http://php.net/array_merge_recursive
+ * @uses func_num_args()
+ * @uses func_get_arg()
+ * @uses is_array()
+ * @uses call_user_func_array()
+ * @param array array to merge
+ * @param array array to merge
+ * @param array ...
+ * @return array merged array
+ */
+function PMA_array_merge_recursive()
+{
+ switch(func_num_args()) {
+ case 0 :
+ return false;
+ break;
+ case 1 :
+ // when does that happen?
+ return func_get_arg(0);
+ break;
+ case 2 :
+ $args = func_get_args();
+ if (!is_array($args[0]) || !is_array($args[1])) {
+ return $args[1];
+ }
+ foreach ($args[1] as $key2 => $value2) {
+ if (isset($args[0][$key2]) && !is_int($key2)) {
+ $args[0][$key2] = PMA_array_merge_recursive($args[0][$key2],
+ $value2);
+ } else {
+ // we erase the parent array, otherwise we cannot override a directive that
+ // contains array elements, like this:
+ // (in config.default.php) $cfg['ForeignKeyDropdownOrder'] = array('id-content','content-id');
+ // (in config.inc.php) $cfg['ForeignKeyDropdownOrder'] = array('content-id');
+ if (is_int($key2) && $key2 == 0) {
+ unset($args[0]);
+ }
+ $args[0][$key2] = $value2;
+ }
+ }
+ return $args[0];
+ break;
+ default :
+ $args = func_get_args();
+ $args[1] = PMA_array_merge_recursive($args[0], $args[1]);
+ array_shift($args);
+ return call_user_func_array('PMA_array_merge_recursive', $args);
+ break;
+ }
+}
+
+/**
+ * calls $function vor every element in $array recursively
+ *
+ * this function is protected against deep recursion attack CVE-2006-1549,
+ * 1000 seems to be more than enough
+ *
+ * @see http://www.php-security.org/MOPB/MOPB-02-2007.html
+ * @see http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2006-1549
+ *
+ * @uses PMA_arrayWalkRecursive()
+ * @uses is_array()
+ * @uses is_string()
+ * @param array $array array to walk
+ * @param string $function function to call for every array element
+ */
+function PMA_arrayWalkRecursive(&$array, $function, $apply_to_keys_also = false)
+{
+ static $recursive_counter = 0;
+ if (++$recursive_counter > 1000) {
+ die('possible deep recursion attack');
+ }
+ foreach ($array as $key => $value) {
+ if (is_array($value)) {
+ PMA_arrayWalkRecursive($array[$key], $function, $apply_to_keys_also);
+ } else {
+ $array[$key] = $function($value);
+ }
+
+ if ($apply_to_keys_also && is_string($key)) {
+ $new_key = $function($key);
+ if ($new_key != $key) {
+ $array[$new_key] = $array[$key];
+ unset($array[$key]);
+ }
+ }
+ }
+ $recursive_counter++;
+}
+
+/**
+ * boolean phpMyAdmin.PMA_checkPageValidity(string &$page, array $whitelist)
+ *
+ * checks given given $page against given $whitelist and returns true if valid
+ * it ignores optionaly query paramters in $page (script.php?ignored)
+ *
+ * @uses in_array()
+ * @uses urldecode()
+ * @uses substr()
+ * @uses strpos()
+ * @param string &$page page to check
+ * @param array $whitelist whitelist to check page against
+ * @return boolean whether $page is valid or not (in $whitelist or not)
+ */
+function PMA_checkPageValidity(&$page, $whitelist)
+{
+ if (! isset($page) || !is_string($page)) {
+ return false;
+ }
+
+ if (in_array($page, $whitelist)) {
+ return true;
+ } elseif (in_array(substr($page, 0, strpos($page . '?', '?')), $whitelist)) {
+ return true;
+ } else {
+ $_page = urldecode($page);
+ if (in_array(substr($_page, 0, strpos($_page . '?', '?')), $whitelist)) {
+ return true;
+ }
+ }
+ return false;
+}
+
+/**
+ * trys to find the value for the given environment vriable name
+ *
+ * searchs in $_SERVER, $_ENV than trys getenv() and apache_getenv()
+ * in this order
+ *
+ * @uses $_SERVER
+ * @uses $_ENV
+ * @uses getenv()
+ * @uses function_exists()
+ * @uses apache_getenv()
+ * @param string $var_name variable name
+ * @return string value of $var or empty string
+ */
+function PMA_getenv($var_name) {
+ if (isset($_SERVER[$var_name])) {
+ return $_SERVER[$var_name];
+ } elseif (isset($_ENV[$var_name])) {
+ return $_ENV[$var_name];
+ } elseif (getenv($var_name)) {
+ return getenv($var_name);
+ } elseif (function_exists('apache_getenv')
+ && apache_getenv($var_name, true)) {
+ return apache_getenv($var_name, true);
+ }
+
+ return '';
+}
+
+/**
+ * removes cookie
+ *
+ * @uses PMA_Config::isHttps()
+ * @uses PMA_Config::getCookiePath()
+ * @uses setcookie()
+ * @uses time()
+ * @param string $cookie name of cookie to remove
+ * @return boolean result of setcookie()
+ */
+function PMA_removeCookie($cookie)
+{
+ return setcookie($cookie, '', time() - 3600,
+ PMA_Config::getCookiePath(), '', PMA_Config::isHttps());
+}
+
+/**
+ * sets cookie if value is different from current cokkie value,
+ * or removes if value is equal to default
+ *
+ * @uses PMA_Config::isHttps()
+ * @uses PMA_Config::getCookiePath()
+ * @uses $_COOKIE
+ * @uses PMA_removeCookie()
+ * @uses setcookie()
+ * @uses time()
+ * @param string $cookie name of cookie to remove
+ * @param mixed $value new cookie value
+ * @param string $default default value
+ * @param int $validity validity of cookie in seconds (default is one month)
+ * @param bool $httponlt whether cookie is only for HTTP (and not for scripts)
+ * @return boolean result of setcookie()
+ */
+function PMA_setCookie($cookie, $value, $default = null, $validity = null, $httponly = true)
+{
+ if ($validity == null) {
+ $validity = 2592000;
+ }
+ if (strlen($value) && null !== $default && $value === $default
+ && isset($_COOKIE[$cookie])) {
+ // remove cookie, default value is used
+ return PMA_removeCookie($cookie);
+ }
+
+ if (! strlen($value) && isset($_COOKIE[$cookie])) {
+ // remove cookie, value is empty
+ return PMA_removeCookie($cookie);
+ }
+
+ if (! isset($_COOKIE[$cookie]) || $_COOKIE[$cookie] !== $value) {
+ // set cookie with new value
+ /* Calculate cookie validity */
+ if ($validity == 0) {
+ $v = 0;
+ } else {
+ $v = time() + $validity;
+ }
+ /* Use native support for httponly cookies if available */
+ if (version_compare(PHP_VERSION, '5.2.0', 'ge')) {
+ return setcookie($cookie, $value, $v,
+ PMA_Config::getCookiePath(), '', PMA_Config::isHttps(), $httponly);
+ } else {
+ return setcookie($cookie, $value, $v,
+ PMA_Config::getCookiePath() . ($httponly ? '; HttpOnly' : ''), '', PMA_Config::isHttps());
+ }
+ }
+
+ // cookie has already $value as value
+ return true;
+}
+?>
diff --git a/libraries/db_common.inc.php b/libraries/db_common.inc.php
index 560b60b533..d722ea1195 100644
--- a/libraries/db_common.inc.php
+++ b/libraries/db_common.inc.php
@@ -8,7 +8,7 @@
/**
* Gets some core libraries
*/
-require_once('./libraries/common.lib.php');
+require_once('./libraries/common.inc.php');
require_once('./libraries/bookmark.lib.php');
PMA_checkParameters(array('db'));
diff --git a/libraries/db_info.inc.php b/libraries/db_info.inc.php
index 739f9991db..2686e6321e 100644
--- a/libraries/db_info.inc.php
+++ b/libraries/db_info.inc.php
@@ -8,7 +8,7 @@
/**
* Check parameters
*/
-require_once('./libraries/common.lib.php');
+require_once('./libraries/common.inc.php');
PMA_checkParameters(array('db'));
diff --git a/libraries/db_links.inc.php b/libraries/db_links.inc.php
index fc281ff71a..1bd1be5878 100644
--- a/libraries/db_links.inc.php
+++ b/libraries/db_links.inc.php
@@ -8,7 +8,7 @@
/**
*
*/
-require_once('./libraries/common.lib.php');
+require_once('./libraries/common.inc.php');
require_once './libraries/relation.lib.php';
/**
diff --git a/libraries/header.inc.php b/libraries/header.inc.php
index 2c2182eee9..336c1c1abb 100644
--- a/libraries/header.inc.php
+++ b/libraries/header.inc.php
@@ -8,14 +8,14 @@
/**
*
*/
-require_once './libraries/common.lib.php';
+require_once './libraries/common.inc.php';
if (empty($GLOBALS['is_header_sent'])) {
/**
* Gets a core script and starts output buffering work
*/
- require_once './libraries/common.lib.php';
+ require_once './libraries/common.inc.php';
require_once './libraries/ob.lib.php';
if ($GLOBALS['cfg']['OBGzip']) {
$GLOBALS['ob_mode'] = PMA_outBufferModeGet();
diff --git a/libraries/header_printview.inc.php b/libraries/header_printview.inc.php
index 9814fe999b..ca68b57e53 100644
--- a/libraries/header_printview.inc.php
+++ b/libraries/header_printview.inc.php
@@ -8,7 +8,7 @@
/**
* Gets a core script and starts output buffering work
*/
-require_once('./libraries/common.lib.php');
+require_once('./libraries/common.inc.php');
require_once('./libraries/ob.lib.php');
if ($cfg['OBGzip']) {
$ob_mode = PMA_outBufferModeGet();
diff --git a/libraries/server_common.inc.php b/libraries/server_common.inc.php
index 14499ab286..27af6045fc 100644
--- a/libraries/server_common.inc.php
+++ b/libraries/server_common.inc.php
@@ -13,7 +13,7 @@
/**
* Gets some core libraries
*/
-require_once './libraries/common.lib.php';
+require_once './libraries/common.inc.php';
/**
* Handles some variables that may have been sent by the calling script
diff --git a/libraries/server_links.inc.php b/libraries/server_links.inc.php
index e6aad721a7..6b12cabca4 100644
--- a/libraries/server_links.inc.php
+++ b/libraries/server_links.inc.php
@@ -8,7 +8,7 @@
/**
* Check parameters
*/
-require_once('./libraries/common.lib.php');
+require_once('./libraries/common.inc.php');
require_once('./libraries/server_common.inc.php');
PMA_checkParameters(array('is_superuser', 'url_query'), TRUE, FALSE);
diff --git a/libraries/sql_query_form.lib.php b/libraries/sql_query_form.lib.php
index fcd9bdaf9c..5764bd309b 100644
--- a/libraries/sql_query_form.lib.php
+++ b/libraries/sql_query_form.lib.php
@@ -29,7 +29,7 @@ require_once './libraries/bookmark.lib.php'; // used for file listing
* @uses $GLOBALS['db']
* @uses $GLOBALS['server']
* @uses $GLOBALS['goto']
- * @uses $GLOBALS['is_upload'] from common.lib.php
+ * @uses $GLOBALS['is_upload'] from common.inc.php
* @uses $GLOBALS['sql_query'] from grab_globals.lib.php
* @uses $GLOBALS['cfg']['DefaultQueryTable']
* @uses $GLOBALS['cfg']['DefaultQueryDatabase']
diff --git a/libraries/tbl_common.php b/libraries/tbl_common.php
index 6ddd36b1a9..f6d215fa03 100644
--- a/libraries/tbl_common.php
+++ b/libraries/tbl_common.php
@@ -8,7 +8,7 @@
/**
* Gets some core libraries
*/
-require_once('./libraries/common.lib.php');
+require_once('./libraries/common.inc.php');
require_once('./libraries/bookmark.lib.php');
// Check parameters
diff --git a/libraries/tbl_info.inc.php b/libraries/tbl_info.inc.php
index 80659eec1b..e1b154a67f 100644
--- a/libraries/tbl_info.inc.php
+++ b/libraries/tbl_info.inc.php
@@ -20,7 +20,7 @@ require_once './libraries/Table.class.php';
/**
* requirements
*/
-require_once('./libraries/common.lib.php');
+require_once('./libraries/common.inc.php');
// Check parameters
PMA_checkParameters(array('db', 'table'));
diff --git a/libraries/tbl_links.inc.php b/libraries/tbl_links.inc.php
index 3f90c50422..b254937644 100644
--- a/libraries/tbl_links.inc.php
+++ b/libraries/tbl_links.inc.php
@@ -8,7 +8,7 @@
/**
* Check parameters
*/
-require_once('./libraries/common.lib.php');
+require_once('./libraries/common.inc.php');
PMA_checkParameters(array('db', 'table'));
diff --git a/libraries/tbl_properties.inc.php b/libraries/tbl_properties.inc.php
index b6ca23d594..a897ff5d83 100644
--- a/libraries/tbl_properties.inc.php
+++ b/libraries/tbl_properties.inc.php
@@ -8,7 +8,7 @@
/**
* Check parameters
*/
-require_once('./libraries/common.lib.php');
+require_once('./libraries/common.inc.php');
PMA_checkParameters(array('db', 'table', 'action', 'num_fields'));
diff --git a/libraries/tbl_replace_fields.inc.php b/libraries/tbl_replace_fields.inc.php
index 9e352d7c38..47971ab3b4 100644
--- a/libraries/tbl_replace_fields.inc.php
+++ b/libraries/tbl_replace_fields.inc.php
@@ -39,7 +39,7 @@ if (! defined('PMA_NO_VARIABLES_IMPORT')) {
/**
* Gets some core libraries
*/
-require_once './libraries/common.lib.php';
+require_once './libraries/common.inc.php';
require_once './libraries/PMA_File.class.php';
$file_to_insert = new PMA_File();
diff --git a/main.php b/main.php
index 6e2174185e..0e4f7f07b9 100644
--- a/main.php
+++ b/main.php
@@ -15,7 +15,7 @@ if (!defined('PMA_DISPLAY_HEADING')) {
/**
* Gets some core libraries and displays a top message if required
*/
-require_once './libraries/common.lib.php';
+require_once './libraries/common.inc.php';
// Handles some variables that may have been sent by the calling script
if (isset($db)) {
diff --git a/navigation.php b/navigation.php
index 1c7da32365..cb08a9b37c 100644
--- a/navigation.php
+++ b/navigation.php
@@ -45,7 +45,7 @@
/**
* Gets a core script and starts output buffering work
*/
-require_once './libraries/common.lib.php';
+require_once './libraries/common.inc.php';
/**
* finish and cleanup navigation.php script execution
diff --git a/pdf_pages.php b/pdf_pages.php
index 2b40b9b0de..5ef6007fbd 100644
--- a/pdf_pages.php
+++ b/pdf_pages.php
@@ -8,7 +8,7 @@
/**
* Gets some core libraries
*/
-require_once('./libraries/common.lib.php');
+require_once('./libraries/common.inc.php');
require_once('./libraries/db_common.inc.php');
diff --git a/pdf_schema.php b/pdf_schema.php
index 406c0b0c6e..cbdedc01c1 100644
--- a/pdf_schema.php
+++ b/pdf_schema.php
@@ -9,7 +9,7 @@
/**
* Gets some core scripts
*/
-require_once('./libraries/common.lib.php');
+require_once('./libraries/common.inc.php');
/**
* Settings for relation stuff
diff --git a/phpinfo.php b/phpinfo.php
index 3f38ece513..461cbf115a 100644
--- a/phpinfo.php
+++ b/phpinfo.php
@@ -9,7 +9,7 @@
* Gets core libraries and defines some variables
*/
define( 'PMA_MINIMUM_COMMON', true );
-require_once('./libraries/common.lib.php');
+require_once('./libraries/common.inc.php');
/**
diff --git a/phpmyadmin.css.php b/phpmyadmin.css.php
index 0a9efcc2bd..c47ba856e3 100644
--- a/phpmyadmin.css.php
+++ b/phpmyadmin.css.php
@@ -9,7 +9,7 @@
*
*/
define('PMA_MINIMUM_COMMON', true);
-require_once './libraries/common.lib.php';
+require_once './libraries/common.inc.php';
require_once './libraries/sqlparser.lib.php';
// MSIE 6 (at least some unpatched versions) has problems loading CSS
diff --git a/pmd_common.php b/pmd_common.php
index d11f15d2f9..b2dbcd8ff1 100644
--- a/pmd_common.php
+++ b/pmd_common.php
@@ -8,7 +8,7 @@
/**
*
*/
-require_once './libraries/common.lib.php';
+require_once './libraries/common.inc.php';
// not understand
require_once './libraries/header_http.inc.php';
diff --git a/querywindow.php b/querywindow.php
index 0ced4e23ff..b6b24fd2ea 100644
--- a/querywindow.php
+++ b/querywindow.php
@@ -8,7 +8,7 @@
/**
*
*/
-require_once './libraries/common.lib.php';
+require_once './libraries/common.inc.php';
$is_superuser = PMA_isSuperuser();
diff --git a/scripts/setup.php b/scripts/setup.php
index ac6e9d7aee..4ad5a69b7e 100644
--- a/scripts/setup.php
+++ b/scripts/setup.php
@@ -16,7 +16,7 @@
// Grab phpMyAdmin version and PMA_dl function
define( 'PMA_MINIMUM_COMMON', TRUE );
chdir('..');
-require_once('./libraries/common.lib.php');
+require_once('./libraries/common.inc.php');
// Grab configuration defaults
// Do not use $PMA_Config, it interferes with the one in $_SESSION
diff --git a/server_binlog.php b/server_binlog.php
index ce0b6a63d6..413f26a587 100644
--- a/server_binlog.php
+++ b/server_binlog.php
@@ -42,7 +42,7 @@
/**
*
*/
-require_once './libraries/common.lib.php';
+require_once './libraries/common.inc.php';
/**
* Does the common work, provides $binary_logs
diff --git a/server_collations.php b/server_collations.php
index 31000c6d6a..9e5a5d4d8d 100644
--- a/server_collations.php
+++ b/server_collations.php
@@ -11,7 +11,7 @@
if ( ! defined( 'PMA_NO_VARIABLES_IMPORT' ) ) {
define( 'PMA_NO_VARIABLES_IMPORT', true );
}
-require_once('./libraries/common.lib.php');
+require_once('./libraries/common.inc.php');
/**
* Does the common work
diff --git a/server_databases.php b/server_databases.php
index f5fc38f373..b35228eed0 100644
--- a/server_databases.php
+++ b/server_databases.php
@@ -8,7 +8,7 @@
/**
* Does the common work
*/
-require_once './libraries/common.lib.php';
+require_once './libraries/common.inc.php';
$js_to_run = 'functions.js';
diff --git a/server_engines.php b/server_engines.php
index 19eb7b3962..fe1a5358f8 100644
--- a/server_engines.php
+++ b/server_engines.php
@@ -16,7 +16,7 @@ if ( ! defined( 'PMA_NO_VARIABLES_IMPORT' ) ) {
/**
* requirements
*/
-require_once('./libraries/common.lib.php');
+require_once('./libraries/common.inc.php');
/**
* Does the common work
diff --git a/server_export.php b/server_export.php
index 94e36b2807..856c167413 100644
--- a/server_export.php
+++ b/server_export.php
@@ -8,7 +8,7 @@
/**
* Does the common work
*/
-require_once('./libraries/common.lib.php');
+require_once('./libraries/common.inc.php');
$js_to_run = 'functions.js';
diff --git a/server_import.php b/server_import.php
index ec490b8ca6..cfbfdf50ea 100644
--- a/server_import.php
+++ b/server_import.php
@@ -8,7 +8,7 @@
/**
*
*/
-require_once('./libraries/common.lib.php');
+require_once('./libraries/common.inc.php');
/**
* Does the common work
diff --git a/server_privileges.php b/server_privileges.php
index 9bf4fe75d5..b844cd434d 100644
--- a/server_privileges.php
+++ b/server_privileges.php
@@ -8,7 +8,7 @@
/**
*
*/
-require_once('./libraries/common.lib.php');
+require_once('./libraries/common.inc.php');
/**
* Does the common work
diff --git a/server_processlist.php b/server_processlist.php
index 86ef87ac1f..b483de234c 100644
--- a/server_processlist.php
+++ b/server_processlist.php
@@ -8,7 +8,7 @@
/**
*
*/
-require_once('./libraries/common.lib.php');
+require_once('./libraries/common.inc.php');
/**
* Does the common work
diff --git a/server_sql.php b/server_sql.php
index 3188e61a02..53518bc93f 100644
--- a/server_sql.php
+++ b/server_sql.php
@@ -8,7 +8,7 @@
/**
*
*/
-require_once('./libraries/common.lib.php');
+require_once('./libraries/common.inc.php');
/**
* Does the common work
diff --git a/server_status.php b/server_status.php
index d635b659fe..23f6b65d24 100644
--- a/server_status.php
+++ b/server_status.php
@@ -13,7 +13,7 @@
if (! defined('PMA_NO_VARIABLES_IMPORT')) {
define('PMA_NO_VARIABLES_IMPORT', true);
}
-require_once './libraries/common.lib.php';
+require_once './libraries/common.inc.php';
/**
* Does the common work
diff --git a/server_variables.php b/server_variables.php
index de947a2365..40a8058538 100644
--- a/server_variables.php
+++ b/server_variables.php
@@ -11,7 +11,7 @@
if ( ! defined( 'PMA_NO_VARIABLES_IMPORT' ) ) {
define( 'PMA_NO_VARIABLES_IMPORT', true );
}
-require_once './libraries/common.lib.php';
+require_once './libraries/common.inc.php';
/**
* Does the common work
diff --git a/sql.php b/sql.php
index deca316faf..cde8d439e4 100644
--- a/sql.php
+++ b/sql.php
@@ -9,7 +9,7 @@
/**
* Gets some core libraries
*/
-require_once './libraries/common.lib.php';
+require_once './libraries/common.inc.php';
require_once './libraries/Table.class.php';
require_once './libraries/tbl_indexes.lib.php';
require_once './libraries/check_user_privileges.lib.php';
diff --git a/tbl_addfield.php b/tbl_addfield.php
index 5812748ec2..0112ae97f6 100644
--- a/tbl_addfield.php
+++ b/tbl_addfield.php
@@ -8,7 +8,7 @@
/**
* Get some core libraries
*/
-require_once './libraries/common.lib.php';
+require_once './libraries/common.inc.php';
require_once './libraries/Table.class.php';
$js_to_run = 'functions.js';
diff --git a/tbl_alter.php b/tbl_alter.php
index 3ab01bedcb..a8336bbc6d 100644
--- a/tbl_alter.php
+++ b/tbl_alter.php
@@ -8,7 +8,7 @@
/**
* Gets some core libraries
*/
-require_once('./libraries/common.lib.php');
+require_once('./libraries/common.inc.php');
require_once('./libraries/Table.class.php');
$js_to_run = 'functions.js';
diff --git a/tbl_change.php b/tbl_change.php
index c1fc5845df..f7cb61fa95 100644
--- a/tbl_change.php
+++ b/tbl_change.php
@@ -8,7 +8,7 @@
/**
* Gets the variables sent or posted to this script and displays the header
*/
-require_once './libraries/common.lib.php';
+require_once './libraries/common.inc.php';
/**
* Sets global variables.
diff --git a/tbl_create.php b/tbl_create.php
index 1a00daa7d9..0918179a1b 100644
--- a/tbl_create.php
+++ b/tbl_create.php
@@ -40,7 +40,7 @@
/**
* Get some core libraries
*/
-require_once './libraries/common.lib.php';
+require_once './libraries/common.inc.php';
require_once './libraries/Table.class.php';
$js_to_run = 'functions.js';
diff --git a/tbl_export.php b/tbl_export.php
index 963fe216b6..c9df7caa5b 100644
--- a/tbl_export.php
+++ b/tbl_export.php
@@ -8,7 +8,7 @@
/**
*
*/
-require_once('./libraries/common.lib.php');
+require_once('./libraries/common.inc.php');
/**
* Gets tables informations and displays top links
diff --git a/tbl_import.php b/tbl_import.php
index 67f3bda861..7f971b97a5 100644
--- a/tbl_import.php
+++ b/tbl_import.php
@@ -8,7 +8,7 @@
/**
*
*/
-require_once('./libraries/common.lib.php');
+require_once('./libraries/common.inc.php');
/**
* Gets tables informations and displays top links
diff --git a/tbl_indexes.php b/tbl_indexes.php
index 176c6d4dd2..22fb49c988 100644
--- a/tbl_indexes.php
+++ b/tbl_indexes.php
@@ -9,7 +9,7 @@
/**
* Gets some core libraries
*/
-require_once './libraries/common.lib.php';
+require_once './libraries/common.inc.php';
require_once './libraries/tbl_indexes.lib.php';
/**
diff --git a/tbl_move_copy.php b/tbl_move_copy.php
index 93f8bf3952..02f44c4827 100644
--- a/tbl_move_copy.php
+++ b/tbl_move_copy.php
@@ -8,7 +8,7 @@
/**
* Gets some core libraries
*/
-require_once './libraries/common.lib.php';
+require_once './libraries/common.inc.php';
require_once './libraries/Table.class.php';
// Check parameters
diff --git a/tbl_operations.php b/tbl_operations.php
index 6673caf5ea..4ef05af98d 100644
--- a/tbl_operations.php
+++ b/tbl_operations.php
@@ -8,7 +8,7 @@
/**
*
*/
-require_once './libraries/common.lib.php';
+require_once './libraries/common.inc.php';
require_once './libraries/Table.class.php';
$pma_table = new PMA_Table($GLOBALS['table'], $GLOBALS['db']);
diff --git a/tbl_printview.php b/tbl_printview.php
index 066ac80da1..b71a9be5c2 100644
--- a/tbl_printview.php
+++ b/tbl_printview.php
@@ -8,7 +8,7 @@
/**
*
*/
-require_once './libraries/common.lib.php';
+require_once './libraries/common.inc.php';
require './libraries/tbl_common.php';
diff --git a/tbl_relation.php b/tbl_relation.php
index 20baa6ff2f..cfa1bb66fe 100644
--- a/tbl_relation.php
+++ b/tbl_relation.php
@@ -8,7 +8,7 @@
/**
* Gets some core libraries
*/
-require_once('./libraries/common.lib.php');
+require_once('./libraries/common.inc.php');
require_once('./libraries/tbl_common.php');
$url_query .= '&amp;goto=tbl_sql.php';
diff --git a/tbl_replace.php b/tbl_replace.php
index 23e640d24b..ecd21ca803 100644
--- a/tbl_replace.php
+++ b/tbl_replace.php
@@ -52,7 +52,7 @@ if (! defined('PMA_NO_VARIABLES_IMPORT')) {
/**
* Gets some core libraries
*/
-require_once './libraries/common.lib.php';
+require_once './libraries/common.inc.php';
// Check parameters
PMA_checkParameters(array('db', 'table', 'goto'));
diff --git a/tbl_row_action.php b/tbl_row_action.php
index 60ba6f4195..98a6d4a6a5 100644
--- a/tbl_row_action.php
+++ b/tbl_row_action.php
@@ -8,7 +8,7 @@
/**
*
*/
-require_once('./libraries/common.lib.php');
+require_once('./libraries/common.inc.php');
require_once('./libraries/mysql_charsets.lib.php');
/**
diff --git a/tbl_select.php b/tbl_select.php
index 43a26fea16..a486ad0b71 100644
--- a/tbl_select.php
+++ b/tbl_select.php
@@ -8,7 +8,7 @@
/**
* Gets some core libraries
*/
-require_once('./libraries/common.lib.php');
+require_once('./libraries/common.inc.php');
require_once('./libraries/relation.lib.php'); // foreign keys
require_once('./libraries/mysql_charsets.lib.php');
diff --git a/tbl_sql.php b/tbl_sql.php
index a3a9fd8dad..1943ecbb6c 100644
--- a/tbl_sql.php
+++ b/tbl_sql.php
@@ -8,7 +8,7 @@
/**
*
*/
-require_once('./libraries/common.lib.php');
+require_once('./libraries/common.inc.php');
/**
* Runs common work
diff --git a/tbl_structure.php b/tbl_structure.php
index eb94e362c6..9de35843e2 100644
--- a/tbl_structure.php
+++ b/tbl_structure.php
@@ -8,7 +8,7 @@
/**
*
*/
-require_once './libraries/common.lib.php';
+require_once './libraries/common.inc.php';
require_once './libraries/mysql_charsets.lib.php';
require_once './libraries/relation.lib.php';
diff --git a/test/FailTest.php b/test/FailTest.php
index 0035b099ab..3494c4f020 100644
--- a/test/FailTest.php
+++ b/test/FailTest.php
@@ -11,7 +11,6 @@
*
*/
require_once 'PHPUnit/Framework.php';
-require_once './libraries/common.lib.php';
class FailTest extends PHPUnit_Framework_TestCase
{
diff --git a/test/PMA_get_real_size_test.php b/test/PMA_get_real_size_test.php
index b2bf638171..4f618b2c5b 100644
--- a/test/PMA_get_real_size_test.php
+++ b/test/PMA_get_real_size_test.php
@@ -11,7 +11,7 @@
*
*/
require_once 'PHPUnit/Framework.php';
-require_once './libraries/common.lib.php';
+require_once './libraries/core.lib.php';
class PMA_get_real_size_test extends PHPUnit_Framework_TestCase
{
diff --git a/test/theme.php b/test/theme.php
index 49bed9dbf1..3814fff959 100644
--- a/test/theme.php
+++ b/test/theme.php
@@ -3,7 +3,7 @@
/**
* theme test
*
- * @uses libraries/common.lib.php global fnctions
+ * @uses libraries/common.inc.php global fnctions
* @package phpMyAdmin-test
* @version $Id$
*/
@@ -13,7 +13,7 @@ chdir('..');
/**
* Gets core libraries and defines some variables
*/
-require_once './libraries/common.lib.php';
+require_once './libraries/common.inc.php';
$lang_iso_code = $GLOBALS['available_languages'][$GLOBALS['lang']][2];
diff --git a/themes.php b/themes.php
index 6d55e3d6ad..6edbeaa024 100644
--- a/themes.php
+++ b/themes.php
@@ -8,7 +8,7 @@
/**
* get some globals
*/
-require_once('./libraries/common.lib.php');
+require_once('./libraries/common.inc.php');
/* Theme Select */
$path_to_themes = $cfg['ThemePath'] . '/';
diff --git a/transformation_overview.php b/transformation_overview.php
index ceac9b745c..b0b48ad392 100644
--- a/transformation_overview.php
+++ b/transformation_overview.php
@@ -13,7 +13,7 @@ define('PMA_DISPLAY_HEADING', 0);
/**
* Gets some core libraries and displays a top message if required
*/
-require_once './libraries/common.lib.php';
+require_once './libraries/common.inc.php';
require_once './libraries/header.inc.php';
require_once './libraries/relation.lib.php';
require_once './libraries/transformations.lib.php';
diff --git a/transformation_wrapper.php b/transformation_wrapper.php
index f53dc94910..377aea967b 100644
--- a/transformation_wrapper.php
+++ b/transformation_wrapper.php
@@ -13,7 +13,7 @@ define('IS_TRANSFORMATION_WRAPPER', true);
/**
* Gets a core script and starts output buffering work
*/
-require_once('./libraries/common.lib.php');
+require_once('./libraries/common.inc.php');
require_once('./libraries/relation.lib.php'); // foreign keys
require_once('./libraries/transformations.lib.php'); // Transformations
$cfgRelation = PMA_getRelationsParam();
diff --git a/user_password.php b/user_password.php
index 685f254b6f..e9222ea71b 100644
--- a/user_password.php
+++ b/user_password.php
@@ -8,7 +8,7 @@
/**
* Gets some core libraries
*/
-require_once('./libraries/common.lib.php');
+require_once('./libraries/common.inc.php');
/**
* Displays an error message and exits if the user isn't allowed to use this
diff --git a/view_create.php b/view_create.php
index 88bbb8efb0..b950fe756d 100644
--- a/view_create.php
+++ b/view_create.php
@@ -8,7 +8,7 @@
/**
*
*/
-require_once './libraries/common.lib.php';
+require_once './libraries/common.inc.php';
/**
* Runs common work