';
}
if ($include_icon) {
$button .= '';
}
if ($include_icon && $include_text) {
$button .= ' ';
}
if ($include_text) {
$button .= $alternate;
}
if ($include_box) {
$button .= '';
}
return $button;
}
/**
* 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)
{
// 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($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 '';
}
/**
* 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 = '
' . "\n" . (($cfg['SQP']['fmtType'] == 'none' && $unparsed_sql != '') ? $unparsed_sql : $parsed_sql) . "\n" . ''; return $formatted_sql; } $formatted_sql = ''; switch ($cfg['SQP']['fmtType']) { case 'none': if ($unparsed_sql != '') { $formatted_sql = "
\n" . PMA_SQP_formatNone(array('raw' => $unparsed_sql)) . "\n"; } 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['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) * @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 >= 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_doc_lang', '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_doc_lang', 'en'); } } $url = $cfg['MySQLManualBase'] . '/' . $mysql . '/' . $lang . '/' . $link . '.html'; if (!empty($anchor)) { $url .= '#' . $anchor; } break; } if ($just_open) { return ''; } elseif ($big_icon) { return '
' . $GLOBALS['strSQLQuery'] . ':' . "\n"; if (strstr(strtolower($formatted_sql), 'select')) { // please show me help to the error on select $error_msg_output .= PMA_showMySQLDocu('SQL-Syntax', 'SELECT'); } if ($is_modify_link) { $_url_params = array( 'sql_query' => $the_query, 'show_query' => 1, ); if (strlen($table)) { $_url_params['db'] = $db; $_url_params['table'] = $table; $doedit_goto = ''; } elseif (strlen($db)) { $_url_params['db'] = $db; $doedit_goto = ''; } else { $doedit_goto = ''; } $error_msg_output .= $doedit_goto . PMA_getIcon('b_edit.png', $GLOBALS['strEdit']) . ''; } // end if $error_msg_output .= '
' . "\n" .'' . "\n" .' ' . $formatted_sql . "\n" .'
' . "\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 the help on error-returns // (now error-messages-server) $error_msg_output .= '' . "\n" . ' ' . $GLOBALS['strMySQLSaid'] . '' . PMA_showMySQLDocu('Error-messages-server', 'Error-messages-server') . "\n" . '
' . "\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"
. '
'; debug_print_backtrace(); echo ''; } 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); } } } } /** * 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 integer $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 - rajk // load PMA configuration $PMA_Config = $GLOBALS['PMA_Config']; // if PMA configuration exists if (!empty($PMA_Config)) $session_bs_tables = $GLOBALS['PMA_Config']->get('BLOBSTREAMING_TABLES'); foreach ($tables as $table_name => $table) { // if BS tables exist if (isset($session_bs_tables)) // compare table name to tables in list of blobstreaming tables foreach ($session_bs_tables as $table_key=>$table_val) // if table is in list, skip outer foreach loop if ($table_name == $table_key) continue 2; // 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') { // switch tooltip and name $table['Comment'] = $table['Name']; $table['disp_name'] = $table['Comment']; } 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 ';
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 '";';
}
echo '
';
echo '
* 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 str_replace(array(',', '.'),
array($GLOBALS['number_thousands_separator'], $GLOBALS['number_decimal_separator']),
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 = str_replace(array(',', '.'),
array($GLOBALS['number_thousands_separator'], $GLOBALS['number_decimal_separator']),
number_format($value, $comma));
return $sign . $value . ' ' . $unit;
} // end of the 'PMA_formatNumber' 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['PMA_PHP_SELF']
* @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
* @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' => false,
'link' => '',
'sep' => '?',
'attr' => '',
'args' => '',
'warning' => '',
'fragment' => '',
);
$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'])
|| PMA_isValid($GLOBALS['active_page'], 'identical', $tab['link'])) {
$tab['class'] = 'active';
} elseif (empty($GLOBALS['active_page'])
&& basename($GLOBALS['PMA_PHP_SELF']) == $tab['link']
&& empty($tab['warning'])) {
$tab['class'] = 'active';
}
}
if (!empty($tab['warning'])) {
$tab['class'] .= ' warning';
$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 = '' . $error_message . '