';
if ($include_icon) {
$button .= '';
}
if ($include_icon && $include_text) {
$button .= ' ';
}
if ($include_text) {
$button .= $alternate;
}
$button .= '';
return $button;
}
/**
* Displays the maximum size for an upload
*
* @uses PMA_formatByteDown()
* @uses sprintf()
* @param integer the size
*
* @return string the message
*
* @access public
*/
function PMA_displayMaximumUploadSize($max_upload_size)
{
// I have to reduce the second parameter (sensitiveness) from 6 to 4
// to avoid weird results like 512 kKib
list($max_size, $max_unit) = PMA_formatByteDown($max_upload_size, 4);
return '(' . sprintf(__('Max: %s%s'), $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 '';
}
/**
* 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;
}
/**
* 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
*
*/
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 htmlspecialchars($parsed_sql['raw']);
}
// 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 = '
';
} 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_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['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)
* @param string anchor to page part
*
* @return string the html link
*
* @access public
*/
function PMA_showMySQLDocu($chapter, $link, $big_icon = false, $anchor = '', $just_open = 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';
}
if (empty($anchor)) {
$anchor = $link;
}
$url = $cfg['MySQLManualBase'] . '/' . $chapter . '.html#' . $anchor;
break;
case 'big':
if (empty($anchor)) {
$anchor = $link;
}
$url = $cfg['MySQLManualBase'] . '#' . $anchor;
break;
case 'searchable':
if (empty($link)) {
$link = 'index';
}
$url = $cfg['MySQLManualBase'] . '/' . $link . '.html';
if (!empty($anchor)) {
$url .= '#' . $anchor;
}
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 >= 50500) {
$mysql = '5.5';
/* l10n: Language to use for MySQL 5.5 documentation, please use only languages which do exist in official documentation. */
$lang = _pgettext('MySQL 5.5 documentation language', 'en');
} else if (PMA_MYSQL_INT_VERSION >= 50100) {
$mysql = '5.1';
/* l10n: Language to use for MySQL 5.1 documentation, please use only languages which do exist in official documentation. */
$lang = _pgettext('MySQL 5.1 documentation language', 'en');
} elseif (PMA_MYSQL_INT_VERSION >= 50000) {
$mysql = '5.0';
/* l10n: Language to use for MySQL 5.0 documentation, please use only languages which do exist in official documentation. */
$lang = _pgettext('MySQL 5.0 documentation language', 'en');
}
}
$url = $cfg['MySQLManualBase'] . '/' . $mysql . '/' . $lang . '/' . $link . '.html';
if (!empty($anchor)) {
$url .= '#' . $anchor;
}
break;
}
if ($just_open) {
return '';
} elseif ($big_icon) {
return '';
} elseif ($GLOBALS['cfg']['ReplaceHelpImg']) {
return '';
} else {
return '[' . __('Documentation') . ']';
}
} // end of the 'PMA_showMySQLDocu()' function
/**
* Displays a link to the phpMyAdmin documentation
*
* @param string anchor in documentation
*
* @return string the html link
*
* @access public
*/
function PMA_showDocu($anchor) {
if ($GLOBALS['cfg']['ReplaceHelpImg']) {
return '';
} else {
return '[' . __('Documentation') . ']';
}
} // end of the 'PMA_showDocu()' function
/**
* Displays a link to the PHP documentation
*
* @param string anchor in documentation
*
* @return string the html link
*
* @access public
*/
function PMA_showPHPDocu($target) {
$url = PMA_getPHPDocLink($target);
if ($GLOBALS['cfg']['ReplaceHelpImg']) {
return '';
} else {
return '[' . __('Documentation') . ']';
}
} // end of the 'PMA_showPHPDocu()' function
/**
* returns HTML for a footnote marker and add the messsage to the footnotes
*
* @uses $GLOBALS['footnotes']
* @param string the error message
* @return string html code for a footnote marker
* @access public
*/
function PMA_showHint($message, $bbcode = false, $type = 'notice')
{
if ($message instanceof PMA_Message) {
$key = $message->getHash();
$type = $message->getLevel();
} else {
$key = md5($message);
}
if (! isset($GLOBALS['footnotes'][$key])) {
if (empty($GLOBALS['footnotes']) || ! is_array($GLOBALS['footnotes'])) {
$GLOBALS['footnotes'] = array();
}
$nr = count($GLOBALS['footnotes']) + 1;
// this is the first instance of this message
$instance = 1;
$GLOBALS['footnotes'][$key] = array(
'note' => $message,
'type' => $type,
'nr' => $nr,
'instance' => $instance
);
} else {
$nr = $GLOBALS['footnotes'][$key]['nr'];
// another instance of this message (to ensure ids are unique)
$instance = ++$GLOBALS['footnotes'][$key]['instance'];
}
if ($bbcode) {
return '[sup]' . $nr . '[/sup]';
}
// footnotemarker used in js/tooltip.js
return '' . $nr . '' .
'';
}
/**
* Displays a MySQL error message in the right frame.
*
* @uses footer.inc.php
* @uses header.inc.php
* @uses $GLOBALS['sql_query']
* @uses $GLOBALS['pmaThemeImage']
* @uses $GLOBALS['cfg']['PropertiesIconic']
* @uses $GLOBALS['cfg']['MaxCharactersInDisplayedSQL']
* @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';
$error_msg_output = '';
if (!$error_message) {
$error_message = PMA_DBI_getError();
}
if (!$the_query && !empty($GLOBALS['sql_query'])) {
$the_query = $GLOBALS['sql_query'];
}
// --- Added to solve bug #641765
if (!function_exists('PMA_SQP_isError') || PMA_SQP_isError()) {
$formatted_sql = htmlspecialchars($the_query);
} elseif (empty($the_query) || trim($the_query) == '') {
$formatted_sql = '';
} else {
if (strlen($the_query) > $GLOBALS['cfg']['MaxCharactersInDisplayedSQL']) {
$formatted_sql = htmlspecialchars(substr($the_query, 0, $GLOBALS['cfg']['MaxCharactersInDisplayedSQL'])) . '[...]';
} else {
$formatted_sql = PMA_formatSql(PMA_SQP_parse($the_query), $the_query);
}
}
// ---
$error_msg_output .= "\n" . '' . "\n";
$error_msg_output .= '
' . __('Error') . '
' . "\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
if (function_exists('PMA_SQP_isError') && PMA_SQP_isError()) {
$error_msg_output .= PMA_SQP_getErrorString() . "\n";
$error_msg_output .= ' ' . "\n";
}
// ---
// modified to show the help on sql errors
$error_msg_output .= '
' . "\n";
} // end if
if (!empty($error_message)) {
$error_message = preg_replace("@((\015\012)|(\015)|(\012)){3,}@", "\n\n", $error_message);
}
// modified to show the help on error-returns
// (now error-messages-server)
$error_msg_output .= '
' . "\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(' ', ' ', $error_message);
// Replace TAB-characters with their HTML-counterpart
$error_message = str_replace("\t", ' ', $error_message);
// Replace linebreaks
$error_message = nl2br($error_message);
$error_msg_output .= '' . "\n"
. $error_message . "\n"
. ' ' . "\n";
$error_msg_output .= '
';
$_SESSION['Import_message']['message'] = $error_msg_output;
if ($exit) {
/**
* If in an Ajax request
* - avoid displaying a Back link
* - use PMA_ajaxResponse() to transmit the message and exit
*/
if($GLOBALS['is_ajax_request'] == true) {
PMA_ajaxResponse($error_msg_output, false);
}
if (! empty($back_url)) {
if (strstr($back_url, '?')) {
$back_url .= '&no_history=true';
} else {
$back_url .= '?no_history=true';
}
$_SESSION['Import_message']['go_back_url'] = $back_url;
$error_msg_output .= '' . "\n\n";
}
echo $error_msg_output;
/**
* display footer and exit
*/
require './libraries/footer.inc.php';
} else {
echo $error_msg_output;
}
} // end of the 'PMA_mysqlDie()' function
/**
* returns array with tables of given db with extended information 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
* @param string $tables name of tables
* @param integer $limit_offset list offset
* @param int|bool $limit_count max tables to return
* @return array (recursive) grouped table list
*/
function PMA_getTableList($db, $tables = null, $limit_offset = 0, $limit_count = false)
{
$sep = $GLOBALS['cfg']['LeftFrameTableSeparator'];
if (null === $tables) {
$tables = PMA_DBI_get_tables_full($db, false, false, null, $limit_offset, $limit_count);
if ($GLOBALS['cfg']['NaturalOrder']) {
uksort($tables, 'strnatcasecmp');
}
}
if (count($tables) < 1) {
return $tables;
}
$default = array(
'Name' => '',
'Rows' => 0,
'Comment' => '',
'disp_name' => '',
);
$table_groups = array();
// for blobstreaming - list of blobstreaming tables
// load PMA configuration
$PMA_Config = $GLOBALS['PMA_Config'];
foreach ($tables as $table_name => $table) {
// if BS tables exist
if (PMA_BS_IsHiddenTable($table_name)) {
continue;
}
// 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 or the
// information_schema database
// 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']);
if ($tbl_is_view || 'information_schema' == $db) {
$table['Rows'] = PMA_Table::countRecords($db, $table['Name']);
}
}
// 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 = '';
$parts_cnt = count($parts) - 1;
while ($i < $parts_cnt
&& $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();
}
$group =& $table_groups;
}
if ($GLOBALS['cfg']['ShowTooltipAliasTB']
&& $GLOBALS['cfg']['ShowTooltipAliasTB'] !== 'nested'
&& $table['Comment'] // do not switch if the comment is empty
) {
// switch tooltip and name
$table['disp_name'] = $table['Comment'];
$table['Comment'] = $table['Name'];
} else {
$table['disp_name'] = $table['Name'];
}
$group[$table_name] = array_merge($default, $table);
}
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:
*
* echo PMA_backquote('owner`s db'); // `owner``s db`
*
*
*
* @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 (is_array($a_name)) {
foreach ($a_name as &$data) {
$data = PMA_backquote($data, $do_it);
}
return $a_name;
}
if (! $do_it) {
global $PMA_SQPdata_forbidden_word;
global $PMA_SQPdata_forbidden_word_cnt;
if(! PMA_STR_binarySearchInArr(strtoupper($a_name), $PMA_SQPdata_forbidden_word, $PMA_SQPdata_forbidden_word_cnt)) {
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
/**
* Defines the value depending on the user OS.
*
* @uses PMA_USR_OS
* @return string the value to use
*
* @access public
*/
function PMA_whichCrlf()
{
$the_crlf = "\n";
// The 'PMA_USR_OS' constant is defined in "./libraries/Config.class.php"
// Win case
if (PMA_USR_OS == 'Win') {
$the_crlf = "\r\n";
}
// Others
else {
$the_crlf = "\n";
}
return $the_crlf;
} // end of the 'PMA_whichCrlf()' function
/**
* Reloads navigation if needed.
*
* @param $jsonly prints out pure JavaScript
* @uses $GLOBALS['reload']
* @uses $GLOBALS['db']
* @uses PMA_generate_common_url()
* @global array configuration
*
* @access public
*/
function PMA_reloadNavigation($jsonly=false)
{
global $cfg;
// Reloads the navigation frame via JavaScript if required
if (isset($GLOBALS['reload']) && $GLOBALS['reload']) {
// one of the reasons for a reload is when a table is dropped
// in this case, get rid of the table limit offset, otherwise
// we have a problem when dropping a table on the last page
// and the offset becomes greater than the total number of tables
unset($_SESSION['tmp_user_values']['table_limit_offset']);
echo "\n";
$reload_url = './navigation.php?' . PMA_generate_common_url($GLOBALS['db'], '', '&');
if (!$jsonly)
echo '' . PHP_EOL;
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
* @param string $type the type (level) of the message
* @param boolean $is_view is this a message after a VIEW operation?
* @global array the configuration array
* @uses $cfg
* @access public
*/
function PMA_showMessage($message, $sql_query = null, $type = 'notice', $is_view = false)
{
/*
* PMA_ajaxResponse uses this function to collect the string of HTML generated
* for showing the message. Use output buffering to collect it and return it
* in a string. In some special cases on sql.php, buffering has to be disabled
* and hence we check with $GLOBALS['buffer_message']
*/
if( $GLOBALS['is_ajax_request'] == true && !isset($GLOBALS['buffer_message']) ) {
ob_start();
}
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 = '';
}
}
if (isset($GLOBALS['using_bookmark_message'])) {
$GLOBALS['using_bookmark_message']->display();
unset($GLOBALS['using_bookmark_message']);
}
// Corrects the tooltip text via JS if required
// @todo this is REALLY the wrong place to do this - very unexpected here
if (! $is_view && strlen($GLOBALS['table']) && $cfg['ShowTooltip']) {
$tooltip = PMA_Table::sGetToolTip($GLOBALS['db'], $GLOBALS['table']);
$uni_tbl = PMA_jsFormat($GLOBALS['db'] . '.' . $GLOBALS['table'], false);
echo "\n";
echo '' . "\n";
} // end if ... elseif
// Checks if the table needs to be repaired after a TRUNCATE query.
// @todo what about $GLOBALS['display_query']???
// @todo this is REALLY the wrong place to do this - very unexpected here
if (strlen($GLOBALS['table'])
&& $GLOBALS['sql_query'] == 'TRUNCATE TABLE ' . PMA_backquote($GLOBALS['table'])) {
if (PMA_Table::sGetStatusInfo($GLOBALS['db'], $GLOBALS['table'], 'Index_length') > 1024) {
PMA_DBI_try_query('REPAIR TABLE ' . PMA_backquote($GLOBALS['table']));
}
}
unset($tbl_status);
// In an Ajax request, $GLOBALS['cell_align_left'] may not be defined. Hence,
// check for it's presence before using it
echo '
';
}
if ($cfg['ShowSQL'] == true && ! empty($sql_query)) {
// Html format the query to be displayed
// 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 = '\\n" ' . "\n"
. ' . "';
$query_base = htmlspecialchars(addslashes($sql_query));
$query_base = preg_replace('/((\015\012)|(\015)|(\012))/', $new_line, $query_base);
} else {
$query_base = $sql_query;
}
$query_too_big = false;
if (strlen($query_base) > $cfg['MaxCharactersInDisplayedSQL']) {
// when the query is large (for example an INSERT of binary
// data), the parser chokes; so avoid parsing the query
$query_too_big = true;
$shortened_query_base = nl2br(htmlspecialchars(substr($sql_query, 0, $cfg['MaxCharactersInDisplayedSQL']) . '[...]'));
} elseif (! empty($GLOBALS['parsed_sql'])
&& $query_base == $GLOBALS['parsed_sql']['raw']) {
// (here, use "! empty" because when deleting a bookmark,
// $GLOBALS['parsed_sql'] is set but empty
$parsed_sql = $GLOBALS['parsed_sql'];
} else {
// Parse SQL if needed
$parsed_sql = PMA_SQP_parse($query_base);
}
// Analyze it
if (isset($parsed_sql) && ! PMA_SQP_isError()) {
$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'])) {
try {
$query_base = PMA_validateSQL($query_base);
} catch (Exception $e) {
PMA_Message::error(__('Failed to connect to SQL validator!'))->display();
}
} elseif (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)
// Basic url query part
$url_params = array();
if (! isset($GLOBALS['db'])) {
$GLOBALS['db'] = '';
}
if (strlen($GLOBALS['db'])) {
$url_params['db'] = $GLOBALS['db'];
if (strlen($GLOBALS['table'])) {
$url_params['table'] = $GLOBALS['table'];
$edit_link = 'tbl_sql.php';
} else {
$edit_link = 'db_sql.php';
}
} else {
$edit_link = 'server_sql.php';
}
// Want to have the query explained (Mike Beck 2002-05-22)
// but only explain a SELECT (that has not been explained)
/* SQL-Parser-Analyzer */
$explain_link = '';
if (! empty($cfg['SQLQuery']['Explain']) && ! $query_too_big) {
$explain_params = $url_params;
// Detect if we are validating as well
// To preserve the validate uRL data
if (! empty($GLOBALS['validatequery'])) {
$explain_params['validatequery'] = 1;
}
$is_select = false;
if (preg_match('@^SELECT[[:space:]]+@i', $sql_query)) {
$explain_params['sql_query'] = 'EXPLAIN ' . $sql_query;
$_message = __('Explain SQL');
$is_select = true;
} elseif (preg_match('@^EXPLAIN[[:space:]]+SELECT[[:space:]]+@i', $sql_query)) {
$explain_params['sql_query'] = substr($sql_query, 8);
$_message = __('Skip Explain SQL');
}
if (isset($explain_params['sql_query'])) {
$explain_link = 'import.php' . PMA_generate_common_url($explain_params);
$explain_link = ' [' . PMA_linkOrButton($explain_link, $_message) . ']';
}
} //show explain
$url_params['sql_query'] = $sql_query;
$url_params['show_query'] = 1;
// even if the query is big and was truncated, offer the chance
// to edit it (unless it's enormous, see PMA_linkOrButton() )
if (! empty($cfg['SQLQuery']['Edit'])) {
if ($cfg['EditInWindow'] == true) {
$onclick = 'window.parent.focus_querywindow(\'' . PMA_jsFormat($sql_query, false) . '\'); return false;';
} else {
$onclick = '';
}
$edit_link .= PMA_generate_common_url($url_params) . '#querybox';
$edit_link = ' [' . PMA_linkOrButton($edit_link, __('Edit'), array('onclick' => $onclick)) . ']';
} else {
$edit_link = '';
}
$url_qpart = PMA_generate_common_url($url_params);
// Also we would like to get the SQL formed in some nice
// php-code (Mike Beck 2002-05-22)
if (! empty($cfg['SQLQuery']['ShowAsPHP']) && ! $query_too_big) {
$php_params = $url_params;
if (! empty($GLOBALS['show_as_php'])) {
$_message = __('Without PHP Code');
} else {
$php_params['show_as_php'] = 1;
$_message = __('Create PHP Code');
}
$php_link = 'import.php' . PMA_generate_common_url($php_params);
$php_link = ' [' . PMA_linkOrButton($php_link, $_message) . ']';
if (isset($GLOBALS['show_as_php'])) {
$runquery_link = 'import.php' . PMA_generate_common_url($url_params);
$php_link .= ' [' . PMA_linkOrButton($runquery_link, __('Submit Query')) . ']';
}
} else {
$php_link = '';
} //show as php
// Refresh query
if (! empty($cfg['SQLQuery']['Refresh'])
&& preg_match('@^(SELECT|SHOW)[[:space:]]+@i', $sql_query)) {
$refresh_link = 'import.php' . PMA_generate_common_url($url_params);
$refresh_link = ' [' . PMA_linkOrButton($refresh_link, __('Refresh')) . ']';
} else {
$refresh_link = '';
} //show as php
if (! empty($cfg['SQLValidator']['use'])
&& ! empty($cfg['SQLQuery']['Validate'])) {
$validate_params = $url_params;
if (!empty($GLOBALS['validatequery'])) {
$validate_message = __('Skip Validate SQL') ;
} else {
$validate_params['validatequery'] = 1;
$validate_message = __('Validate SQL') ;
}
$validate_link = 'import.php' . PMA_generate_common_url($validate_params);
$validate_link = ' [' . PMA_linkOrButton($validate_link, $validate_message) . ']';
} else {
$validate_link = '';
} //validator
if (!empty($GLOBALS['validatequery'])) {
echo '
';
} else {
echo '';
}
if ($query_too_big) {
echo $shortened_query_base;
} else {
echo $query_base;
}
//Clean up the end of the PHP
if (! empty($GLOBALS['show_as_php'])) {
echo '";';
}
if (!empty($GLOBALS['validatequery'])) {
echo '
';
} else {
echo '';
}
echo '
';
// avoid displaying a Profiling checkbox that could
// be checked, which would reexecute an INSERT, for example
if (! empty($refresh_link)) {
PMA_profilingCheckbox($sql_query);
}
// if needed, generate an invisible form that contains controls for the
// Inline link; this way, the behavior of the Inline link does not
// depend on the profiling support or on the refresh link
if (empty($refresh_link) || ! PMA_profilingSupported()) {
echo '';
}
// in the tools div, only display the Inline link when not in ajax
// mode because 1) it currently does not work and 2) we would
// have two similar mechanisms on the page for the same goal
if ($is_select || $GLOBALS['is_ajax_request'] === false) {
// see in js/functions.js the jQuery code attached to id inline_edit
// document.write conflicts with jQuery, hence used $().append()
echo "";
}
echo $edit_link . $explain_link . $php_link . $refresh_link . $validate_link;
echo '
';
}
echo '
';
if ($GLOBALS['is_ajax_request'] === false) {
echo ' ';
}
// If we are in an Ajax request, we have most probably been called in
// PMA_ajaxResponse(). Hence, collect the buffer contents and return it
// to PMA_ajaxResponse(), which will encode it for JSON.
if( $GLOBALS['is_ajax_request'] == true && !isset($GLOBALS['buffer_message']) ) {
$buffer_contents = ob_get_contents();
ob_end_clean();
return $buffer_contents;
}
} // end of the 'PMA_showMessage()' function
/**
* Verifies if current MySQL server supports profiling
*
* @uses $_SESSION['profiling_supported'] for caching
* @uses $GLOBALS['server']
* @uses PMA_DBI_fetch_value()
* @uses PMA_MYSQL_INT_VERSION
* @uses defined()
* @access public
* @return boolean whether profiling is supported
*
*/
function PMA_profilingSupported()
{
if (! PMA_cacheExists('profiling_supported', true)) {
// 5.0.37 has profiling but for example, 5.1.20 does not
// (avoid a trip to the server for MySQL before 5.0.37)
// and do not set a constant as we might be switching servers
if (defined('PMA_MYSQL_INT_VERSION')
&& PMA_MYSQL_INT_VERSION >= 50037
&& PMA_DBI_fetch_value("SHOW VARIABLES LIKE 'profiling'")) {
PMA_cacheSet('profiling_supported', true, true);
} else {
PMA_cacheSet('profiling_supported', false, true);
}
}
return PMA_cacheGet('profiling_supported', true);
}
/**
* Displays a form with the Profiling checkbox
*
* @param string $sql_query
* @access public
*
*/
function PMA_profilingCheckbox($sql_query)
{
if (PMA_profilingSupported()) {
echo '' . "\n";
}
}
/**
* Displays the results of SHOW PROFILE
*
* @param array the results
* @param boolean show chart
* @access public
*
*/
function PMA_profilingResults($profiling_results, $show_chart = false)
{
echo '' . "\n";
}
/**
* 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
*
* @version 1.2 - 18 July 2002
*/
function PMA_formatByteDown($value, $limes = 6, $comma = 0)
{
/* l10n: shortcuts for Byte, Kilo, Mega, Giga, Tera, Peta, Exa+ */
$byteUnits = array(__('B'), __('KiB'), __('MiB'), __('GiB'), __('TiB'), __('PiB'), __('EiB'));
$dh = PMA_pow(10, $comma);
$li = PMA_pow(10, $limes);
$return_value = $value;
$unit = $byteUnits[0];
for ($d = 6, $ex = 15; $d >= 1; $d--, $ex-=3) {
if (isset($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 = $byteUnits[$d];
break 1;
} // end if
} // end for
if ($unit != $byteUnits[0]) {
// if the unit is not bytes (as represented in current language)
// reformat with max length of 5
// 4th parameter=true means do not reformat if value < 1
$return_value = PMA_formatNumber($value, 5, $comma, true);
} else {
// do not reformat, just handle the locale
$return_value = PMA_formatNumber($value, 0);
}
return array(trim($return_value), $unit);
} // end of the 'PMA_formatByteDown' function
/**
* Changes thousands and decimal separators to locale specific values.
*/
function PMA_localizeNumber($value)
{
return str_replace(
array(',', '.'),
array(
/* l10n: Thousands separator */
__(','),
/* l10n: Decimal separator */
__('.'),
),
$value);
}
/**
* 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:
*
* 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
*
*
* @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
*
* @version 1.1.0 - 2005-10-27
*/
function PMA_formatNumber($value, $length = 3, $comma = 0, $only_down = false)
{
//number_format is not multibyte safe, str_replace is safe
if ($length === 0) {
return PMA_localizeNumber(number_format($value, $comma));
}
// this units needs no translation, ISO
$units = array(
-8 => 'y',
-7 => 'z',
-6 => 'a',
-5 => 'f',
-4 => 'p',
-3 => 'n',
-2 => 'µ',
-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;
}
// check for negative value to retain sign
if ($value < 0) {
$sign = '-';
$value = abs($value);
} 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++) {
// force using pow() because of the negative exponent
if (isset($units[$d]) && $value <= $li * PMA_pow(1000, $d-1, 'pow')) {
$value = round($value / (PMA_pow(1000, $d, 'pow') / $dh)) /$dh;
$unit = $units[$d];
break 1;
} // end if
} // end for
} // end if ($value >= 1) elseif (!$only_down && (float) $value !== 0.0)
//number_format is not multibyte safe, str_replace is safe
$value = PMA_localizeNumber(number_format($value, $comma));
return $sign . $value . ' ' . $unit;
} // end of the 'PMA_formatNumber' function
/**
* Returns the number of bytes when a formatted size is given
*
* @param string $size the size expression (for example 8MB)
* @uses PMA_pow()
* @return integer The numerical part of the expression (for example 8)
*/
function PMA_extractValueFromFormattedSize($formatted_size)
{
$return_value = -1;
if (preg_match('/^[0-9]+GB$/', $formatted_size)) {
$return_value = substr($formatted_size, 0, -2) * PMA_pow(1024, 3);
} elseif (preg_match('/^[0-9]+MB$/', $formatted_size)) {
$return_value = substr($formatted_size, 0, -2) * PMA_pow(1024, 2);
} elseif (preg_match('/^[0-9]+K$/', $formatted_size)) {
$return_value = substr($formatted_size, 0, -1) * PMA_pow(1024, 1);
}
return $return_value;
}// end of the 'PMA_extractValueFromFormattedSize' function
/**
* Writes localised date
*
* @param string the current timestamp
*
* @return string the formatted date
*
* @access public
*/
function PMA_localisedDate($timestamp = -1, $format = '')
{
$month = array(
/* l10n: Short month name */
__('Jan'),
/* l10n: Short month name */
__('Feb'),
/* l10n: Short month name */
__('Mar'),
/* l10n: Short month name */
__('Apr'),
/* l10n: Short month name */
_pgettext('Short month name', 'May'),
/* l10n: Short month name */
__('Jun'),
/* l10n: Short month name */
__('Jul'),
/* l10n: Short month name */
__('Aug'),
/* l10n: Short month name */
__('Sep'),
/* l10n: Short month name */
__('Oct'),
/* l10n: Short month name */
__('Nov'),
/* l10n: Short month name */
__('Dec'));
$day_of_week = array(
/* l10n: Short week day name */
__('Sun'),
/* l10n: Short week day name */
__('Mon'),
/* l10n: Short week day name */
__('Tue'),
/* l10n: Short week day name */
__('Wed'),
/* l10n: Short week day name */
__('Thu'),
/* l10n: Short week day name */
__('Fri'),
/* l10n: Short week day name */
__('Sat'));
if ($format == '') {
/* l10n: See http://www.php.net/manual/en/function.strftime.php to define the format string */
$format = __('%B %d, %Y at %I:%M %p');
}
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['PMA_PHP_SELF']
* @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
* @param array $url_params
* @return string html code for one tab, a link if valid otherwise a span
* @access public
*/
function PMA_generate_html_tab($tab, $url_params = array())
{
// default values
$defaults = array(
'text' => '',
'class' => '',
'active' => null,
'link' => '',
'sep' => '?',
'attr' => '',
'args' => '',
'warning' => '',
'fragment' => '',
'id' => '',
);
$tab = array_merge($defaults, $tab);
// determine additionnal style-class
if (empty($tab['class'])) {
if (! empty($tab['active'])
|| PMA_isValid($GLOBALS['active_page'], 'identical', $tab['link'])) {
$tab['class'] = 'active';
} elseif (is_null($tab['active']) && empty($GLOBALS['active_page'])
&& basename($GLOBALS['PMA_PHP_SELF']) == $tab['link']
&& empty($tab['warning'])) {
$tab['class'] = 'active';
}
}
if (!empty($tab['warning'])) {
$tab['class'] .= ' error';
$tab['attr'] .= ' title="' . htmlspecialchars($tab['warning']) . '"';
}
// If there are any tab specific URL parameters, merge those with the general URL parameters
if(! empty($tab['url_params']) && is_array($tab['url_params'])) {
$url_params = array_merge($url_params, $tab['url_params']);
}
// build the link
if (!empty($tab['link'])) {
$tab['link'] = htmlentities($tab['link']);
$tab['link'] = $tab['link'] . PMA_generate_common_url($url_params);
if (! empty($tab['args'])) {
foreach ($tab['args'] as $param => $value) {
$tab['link'] .= PMA_get_arg_separator('html') . urlencode($param) . '='
. urlencode($value);
}
}
}
if (! empty($tab['fragment'])) {
$tab['link'] .= $tab['fragment'];
}
// display icon, even if iconic is disabled but the link-text is missing
if (($GLOBALS['cfg']['MainPageIconic'] || empty($tab['text']))
&& isset($tab['icon'])) {
// avoid generating an alt tag, because it only illustrates
// the text that follows and if browser does not display
// images, the text is duplicated
$image = '%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);
}
//Set the id for the tab, if set in the params
$id_string = ( empty($tab['id']) ? '' : ' id="'.$tab['id'].'" ' );
$out = '
';
return $out;
} // end of the 'PMA_generate_html_tab()' function
/**
* returns html-code for a tab navigation
*
* @uses PMA_generate_html_tab()
* @uses htmlentities()
* @param array $tabs one element per tab
* @param string $url_params
* @return string html-code for tab-navigation
*/
function PMA_generate_html_tabs($tabs, $url_params)
{
$tag_id = 'topmenu';
$tab_navigation =
'
' . "\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 = '')
{
$url_length = strlen($url);
// with this we should be able to catch case of image upload
// into a (MEDIUM) BLOB; not worth generating even a form for these
if ($url_length > $GLOBALS['cfg']['LinkLengthLimit'] * 100) {
return '';
}
if (! is_array($tag_params)) {
$tmp = $tag_params;
$tag_params = array();
if (!empty($tmp)) {
$tag_params['onclick'] = 'return confirmLink(this, \'' . PMA_escapeJsString($tmp) . '\')';
}
unset($tmp);
}
if (! empty($target)) {
$tag_params['target'] = htmlentities($target);
}
$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 ($url_length <= $GLOBALS['cfg']['LinkLengthLimit']) {
// no whitespace within an else Safari will make it part of the link
$ret = "\n" . ''
. $message . '' . "\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 = '';
}
} // end if... else...
return $ret;
} // end of the 'PMA_linkOrButton()' function
/**
* Returns a given timespan value in a readable format.
*
* @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(__('%s days, %s hours, %s minutes and %s seconds'), (string)$days, (string)$hours, (string)$minutes, (string)$seconds);
}
/**
* 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 " \n")
*
* @access public
* @return string The flipped string
*/
function PMA_flipstring($string, $Separator = " \n")
{
$format_string = '';
$charbuff = false;
for ($i = 0, $str_len = strlen($string); $i < $str_len; $i++) {
$char = $string{$i};
$append = false;
if ($char == '&') {
$format_string .= $charbuff;
$charbuff = $char;
} elseif ($char == ';' && !empty($charbuff)) {
$format_string .= $charbuff . $char;
$charbuff = false;
$append = true;
} elseif (! empty($charbuff)) {
$charbuff .= $char;
} else {
$format_string .= $char;
$append = true;
}
// do not add separator after the last character
if ($append && ($i != $str_len - 1)) {
$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
* @uses $GLOBALS['PMA_PHP_SELF']
* 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
*/
function PMA_checkParameters($params, $die = true, $request = true)
{
global $checked_special;
if (!isset($checked_special)) {
$checked_special = false;
}
$reported_script_name = basename($GLOBALS['PMA_PHP_SELF']);
$found_error = false;
$error_message = '';
foreach ($params as $param) {
if ($request && $param != 'db' && $param != 'table') {
$checked_special = true;
}
if (!isset($GLOBALS[$param])) {
$error_message .= $reported_script_name
. ': Missing parameter: ' . $param
. PMA_showDocu('faqmissingparameters')
. ' ';
$found_error = true;
}
}
if ($found_error) {
/**
* display html meta tags
*/
require_once './libraries/header_meta_style.inc.php';
echo '