Merge remote-tracking branch 'origin/QA_4_7' into QA_4_7

This commit is contained in:
Weblate 2018-02-22 23:14:00 +01:00
commit 7f3947dc6c
23 changed files with 279 additions and 293 deletions

View File

@ -281,8 +281,12 @@ var AJAX = {
var url = isLink ? href : $(this).attr('action');
var params = 'ajax_request=true&ajax_page_request=true';
var dataPost = AJAX.source.getPostData();
if (! isLink) {
params += '&' + $(this).serialize();
} else if (dataPost) {
params += '&' + dataPost;
isLink = false;
}
if (! (history && history.pushState)) {
// Add a list of menu hashes that we have in the cache to the request

View File

@ -328,8 +328,7 @@ AJAX.registerOnload('db_structure.js', function () {
PMA_ajaxShowMessage(PMA_messages.strProcessingRequest);
var params = getJSConfirmCommonParam(this);
params.token = PMA_commonParams.get('token');
var params = getJSConfirmCommonParam(this, $this_anchor.getPostData());
$.post(url, params, function (data) {
if (typeof data !== 'undefined' && data.success === true) {
@ -392,8 +391,7 @@ AJAX.registerOnload('db_structure.js', function () {
var $msg = PMA_ajaxShowMessage(PMA_messages.strProcessingRequest);
var params = getJSConfirmCommonParam(this);
params.token = PMA_commonParams.get('token');
var params = getJSConfirmCommonParam(this, $this_anchor.getPostData());
$.post(url, params, function (data) {
if (typeof data !== 'undefined' && data.success === true) {

View File

@ -662,18 +662,7 @@ function confirmLink(theLink, theSqlQuery)
var is_confirmed = confirm(PMA_sprintf(PMA_messages.strDoYouReally, theSqlQuery));
if (is_confirmed) {
if ($(theLink).hasClass('formLinkSubmit')) {
var name = 'is_js_confirmed';
if ($(theLink).attr('href').indexOf('usesubform') != -1) {
var matches = $(theLink).attr('href').substr('#').match(/usesubform\[(\d+)\]/i);
if (matches != null) {
name = 'subform[' + matches[1] + '][is_js_confirmed]';
}
}
$(theLink).parents('form').append('<input type="hidden" name="' + name + '" value="1" />');
} else if (typeof(theLink.href) != 'undefined') {
if (typeof(theLink.href) !== 'undefined') {
theLink.href += '&is_js_confirmed=1';
} else if (typeof(theLink.form) != 'undefined') {
theLink.form.action += '?is_js_confirmed=1';
@ -1853,12 +1842,19 @@ function loadForeignKeyCheckbox() {
});
}
function getJSConfirmCommonParam(elem) {
return {
'is_js_confirmed' : 1,
'ajax_request' : true,
'fk_checks': $(elem).find('#fk_checks').is(':checked') ? 1 : 0
};
function getJSConfirmCommonParam (elem, params) {
var $elem = $(elem);
if (params) {
// Strip possible leading ?
if (params.startsWith('?')) {
params = params.substr(1);
}
params += '&';
} else {
params = '';
}
params += 'is_js_confirmed=1&ajax_request=true&fk_checks' + ($elem.find('#fk_checks').is(':checked') ? 1 : 0);
return params;
}
/**
@ -4159,7 +4155,6 @@ AJAX.registerOnload('functions.js', function () {
*/
AJAX.registerTeardown('functions.js', function () {
$(document).off('change', 'select.pageselector');
$(document).off('click', 'a.formLinkSubmit');
$('#update_recent_tables').unbind('ready');
$('#sync_favorite_tables').unbind('ready');
});
@ -4206,16 +4201,6 @@ AJAX.registerOnload('functions.js', function () {
*/
PMA_init_slider();
/**
* Enables the text generated by PMA\libraries\Util::linkOrButton() to be clickable
*/
$(document).on('click', 'a.formLinkSubmit', function (e) {
if (! $(this).hasClass('requireConfirm')) {
submitFormLink($(this));
return false;
}
});
var $updateRecentTables = $('#update_recent_tables');
if ($updateRecentTables.length) {
$.get(
@ -4988,3 +4973,15 @@ AJAX.registerOnload('functions.js', function(){
}
});
});
/**
* Return POST data as stored by Util::linkOrButton
*/
jQuery.fn.getPostData = function() {
var dataPost = this.attr('data-post');
// Strip possible leading ?
if (dataPost !== undefined && dataPost.startsWith('?')) {
dataPost = dataPost.substr(1);
}
return dataPost;
};

View File

@ -225,10 +225,6 @@ AJAX.registerTeardown('gis_data_editor.js', function () {
});
AJAX.registerOnload('gis_data_editor.js', function () {
// Remove the class that is added due to the URL being too long.
$('span.open_gis_editor a').removeClass('formLinkSubmit');
/**
* Prepares and insert the GIS data to the input field on clicking 'copy'.
*/

View File

@ -402,11 +402,7 @@ RTE.COMMON = {
* the AJAX message shown to the user
*/
var $msg = PMA_ajaxShowMessage(PMA_messages.strProcessingRequest);
var params = {
'is_js_confirmed': 1,
'ajax_request': true,
'token': PMA_commonParams.get('token')
};
var params = getJSConfirmCommonParam(this, $this.getPostData());
$.post(url, params, function (data) {
if (data.success === true) {
/**
@ -481,11 +477,7 @@ RTE.COMMON = {
* @var $curr_row Object containing reference to the current row
*/
var $curr_row = $anchor.parents('tr');
var params = {
'is_js_confirmed': 1,
'ajax_request': true,
'token': PMA_commonParams.get('token')
};
var params = getJSConfirmCommonParam(this, $anchor.getPostData());
$.post($anchor.attr('href'), params, function (data) {
returnCount++;
if (data.success === true) {

View File

@ -168,23 +168,19 @@ AJAX.registerOnload('sql.js', function () {
var $link = $(this);
$link.PMA_confirm(question, $link.attr('href'), function (url) {
$msgbox = PMA_ajaxShowMessage();
if ($link.hasClass('formLinkSubmit')) {
submitFormLink($link);
} else {
var params = {
'ajax_request': true,
'is_js_confirmed': true,
'token': PMA_commonParams.get('token')
};
$.post(url, params, function (data) {
if (data.success) {
PMA_ajaxShowMessage(data.message);
$link.closest('tr').remove();
} else {
PMA_ajaxShowMessage(data.error, false);
}
});
var params = 'ajax_request=1&is_js_confirmed=1';
var postData = $link.getPostData();
if (postData) {
params += '&' + postData;
}
$.post(url, params, function (data) {
if (data.success) {
PMA_ajaxShowMessage(data.message);
$link.closest('tr').remove();
} else {
PMA_ajaxShowMessage(data.error, false);
}
});
});
});

View File

@ -128,6 +128,8 @@ AJAX.registerOnload('tbl_operations.js', function () {
**/
$(document).on('click', "#tbl_maintenance li a.maintain_action.ajax", function (event) {
event.preventDefault();
var $link = $(this);
if ($(".sqlqueryresults").length !== 0) {
$(".sqlqueryresults").remove();
}
@ -135,12 +137,16 @@ AJAX.registerOnload('tbl_operations.js', function () {
$(".result_query").remove();
}
//variables which stores the common attributes
var params = {
var params = $.param({
ajax_request: 1,
server: PMA_commonParams.get('server'),
token: PMA_commonParams.get('token')
};
$.post($(this).attr('href'), params, function (data) {
server: PMA_commonParams.get('server')
});
var postData = $link.getPostData();
if (postData) {
params += '&' + postData;
}
$.post($link.attr('href'), params, function (data) {
function scrollToTop() {
$('html, body').animate({ scrollTop: 0 });
}
@ -152,7 +158,7 @@ AJAX.registerOnload('tbl_operations.js', function () {
PMA_highlightSQL($('#page_content'));
scrollToTop();
} else if (typeof data !== 'undefined' && data.success === true) {
var $temp_div = $("<div id='temp_div'></div>");
$temp_div = $('<div id=\'temp_div\'></div>');
$temp_div.html(data.message);
var $success = $temp_div.find(".result_query .success");
PMA_ajaxShowMessage($success);
@ -165,7 +171,14 @@ AJAX.registerOnload('tbl_operations.js', function () {
} else {
$temp_div = $("<div id='temp_div'></div>");
$temp_div.html(data.error);
var $error = $temp_div.find("code").addClass("error");
var $error;
if ($temp_div.find('.error code').length !== 0) {
$error = $temp_div.find('.error code').addClass('error');
} else {
$error = $temp_div;
}
PMA_ajaxShowMessage($error, false);
}
}); // end $.post()

View File

@ -211,14 +211,11 @@ AJAX.registerOnload('tbl_structure.js', function () {
* @var question String containing the question to be asked for confirmation
*/
var question = PMA_sprintf(PMA_messages.strDoYouReally, 'ALTER TABLE `' + escapeHtml(curr_table_name) + '` DROP `' + escapeHtml(curr_column_name) + '`;');
$(this).PMA_confirm(question, $(this).attr('href'), function (url) {
var $this_anchor = $(this);
$this_anchor.PMA_confirm(question, $this_anchor.attr('href'), function (url) {
var $msg = PMA_ajaxShowMessage(PMA_messages.strDroppingColumn, false);
var params = {
'is_js_confirmed' : 1,
'ajax_request' : true,
'ajax_page_request' : true,
'token': PMA_commonParams.get('token')
};
var params = getJSConfirmCommonParam(this, $this_anchor.getPostData());
params += '&ajax_page_request=1';
$.post(url, params, function (data) {
if (typeof data !== 'undefined' && data.success === true) {
PMA_ajaxRemoveMessage($msg);
@ -297,14 +294,14 @@ AJAX.registerOnload('tbl_structure.js', function () {
var question = PMA_sprintf(PMA_messages.strDoYouReally, 'ALTER TABLE `' +
escapeHtml(curr_table_name) + '` ' + add_clause + '(`' + escapeHtml(curr_column_name) + '`);');
$(this).PMA_confirm(question, $(this).attr('href'), function (url) {
var $this_anchor = $(this);
$this_anchor.PMA_confirm(question, $this_anchor.attr('href'), function (url) {
PMA_ajaxShowMessage();
AJAX.source = $this;
var params = {
'ajax_request' : true,
'ajax_page_request' : true,
'token': PMA_commonParams.get('token')
};
var params = getJSConfirmCommonParam(this, $this_anchor.getPostData());
params += '&ajax_page_request=1';
$.post(url, params, AJAX.responseHandler);
}); // end $.PMA_confirm()
}); //end Add key

View File

@ -1819,90 +1819,29 @@ class Util
}
}
if (($url_length <= $GLOBALS['cfg']['LinkLengthLimit'])
&& $in_suhosin_limits
&& ! $force_button
&& strpos($url, 'sql_query=') === false
$tag_params_strings = array();
if (($url_length > $GLOBALS['cfg']['LinkLengthLimit'])
|| ! $in_suhosin_limits
|| $force_button
|| strpos($url, 'sql_query=') !== false
) {
$tag_params_strings = array();
foreach ($tag_params as $par_name => $par_value) {
// htmlspecialchars() only on non javascript
$par_value = mb_substr($par_name, 0, 2) == 'on'
? $par_value
: htmlspecialchars($par_value);
$tag_params_strings[] = $par_name . '="' . $par_value . '"';
}
$parts = explode('?', $url, 2);
/*
* The data-post indicates that client should do POST
* this is handled in js/ajax.js
*/
$tag_params_strings[] = 'data-post="' . (isset($parts[1]) ? $parts[1] : '') . '"';
$url = $parts[0];
}
// no whitespace within an <a> else Safari will make it part of the link
$ret = '<a href="' . $url . '" '
. implode(' ', $tag_params_strings) . '>'
. $message . $displayed_message . '</a>';
} else {
// no spaces (line breaks) at all
// or after the hidden fields
// IE will display them all
foreach ($tag_params as $par_name => $par_value) {
$tag_params_strings[] = $par_name . '="' . htmlspecialchars($par_value) . '"';
}
if (! isset($query_parts)) {
$query_parts = self::splitURLQuery($url);
}
$url_parts = parse_url($url);
if ($new_form) {
if ($target) {
$target = ' target="' . $target . '"';
}
$ret = '<form action="' . $url_parts['path'] . '" class="link"'
. ' method="post"' . $target . ' style="display: inline;">';
$ret .= URL::getHiddenInputs();
$subname_open = '';
$subname_close = '';
$submit_link = '#';
} else {
$query_parts[] = 'redirect=' . $url_parts['path'];
$query_parts[] = 'token=' . $_SESSION[' PMA_token '];
if (empty($GLOBALS['subform_counter'])) {
$GLOBALS['subform_counter'] = 0;
}
$GLOBALS['subform_counter']++;
$ret = '';
$subname_open = 'subform[' . $GLOBALS['subform_counter'] . '][';
$subname_close = ']';
$submit_link = '#usesubform[' . $GLOBALS['subform_counter']
. ']=1';
}
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 (empty($tag_params['class'])) {
$tag_params['class'] = 'formLinkSubmit';
} else {
$tag_params['class'] .= ' formLinkSubmit';
}
$tag_params_strings = array();
foreach ($tag_params as $par_name => $par_value) {
// htmlspecialchars() only on non javascript
$par_value = mb_substr($par_name, 0, 2) == 'on'
? $par_value
: htmlspecialchars($par_value);
$tag_params_strings[] = $par_name . '="' . $par_value . '"';
}
$ret .= "\n" . '<a href="' . $submit_link . '" '
. implode(' ', $tag_params_strings) . '>'
. $message . ' ' . $displayed_message . '</a>' . "\n";
if ($new_form) {
$ret .= '</form>';
}
} // end if... else...
return $ret;
// no whitespace within an <a> else Safari will make it part of the link
return '<a href="' . $url . '" '
. implode(' ', $tag_params_strings) . '>'
. $message . $displayed_message . '</a>';
} // end of the 'linkOrButton()' function
/**

View File

@ -156,58 +156,6 @@ foreach (get_defined_vars() as $key => $value) {
}
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 elements ...
* <input type="hidden" name="subform[action1][id]" value="1" />
* ... other subform data ...
* <input type="submit" name="usesubform[action1]" value="do action1" />
* ... other subforms ...
* <input type="hidden" name="subform[actionX][id]" value="X" />
* ... other subform data ...
* <input type="submit" name="usesubform[actionX]" value="do actionX" />
* ... main form elements ...
* <input 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']) && ! defined('PMA_MINIMUM_COMMON')) {
// 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_PHP_SELF)
) {
$__redirect = $_POST['redirect'];
unset($_POST['redirect']);
}
unset($subform_id, $subform);
} else {
// Note: here we overwrite $_REQUEST so that it does not contain cookies,
// because another application for the same domain could have set
// a cookie (with a compatible path) that overrides a variable
// we expect from GET or POST.
// We'll refer to cookies explicitly with the $_COOKIE syntax.
$_REQUEST = array_merge($_GET, $_POST);
}
// end check if a subform is submitted
/**
* check timezone setting
* this could produce an E_WARNING - but only once,
@ -323,13 +271,6 @@ $goto_whitelist = array(
'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']
@ -941,14 +882,6 @@ if (count($_REQUEST) > 1000) {
$GLOBALS['is_superuser']
= isset($GLOBALS['dbi']) && $GLOBALS['dbi']->isSuperuser();
if (!empty($__redirect) && in_array($__redirect, $goto_whitelist)) {
/**
* include subform target page
*/
include $__redirect;
exit();
}
// If Zero configuration mode enabled, check PMA tables in current db.
if (! defined('PMA_MINIMUM_COMMON')
&& ! empty($GLOBALS['server'])

View File

@ -1471,11 +1471,11 @@ function PMA_getListofMaintainActionLink($pma_table, $url_params)
function PMA_getMaintainActionlink($action_message, $params, $url_params, $link)
{
return '<li>'
. '<a class="maintain_action ajax" '
. 'href="sql.php'
. URL::getCommon(array_merge($url_params, $params)) . '">'
. $action_message
. '</a>'
. Util::linkOrButton(
'sql.php' . URL::getCommon(array_merge($url_params, $params)),
$action_message,
['class' => 'maintain_action ajax']
)
. Util::showMySQLDocu($link)
. '</li>';
}

View File

@ -8,6 +8,7 @@
use PMA\libraries\Response;
use PMA\libraries\URL;
use PMA\libraries\Template;
use PMA\libraries\Util;
use PhpMyAdmin\SqlParser\Statements\CreateStatement;
if (! defined('PHPMYADMIN')) {
@ -305,13 +306,11 @@ function PMA_RTN_getRowForList($routine, $rowclass = '')
}
$retval .= " </td>\n";
$retval .= " <td>\n";
$retval .= ' <a ' . $ajax_class['drop']
. ' href="sql.php'
. $url_query
. '&amp;sql_query=' . urlencode($sql_drop)
. '&amp;goto=db_routines.php'
. urlencode("?db={$db}")
. '" >' . $titles['Drop'] . "</a>\n";
$retval .= Util::linkOrButton(
'sql.php' . $url_query . '&amp;sql_query=' . urlencode($sql_drop) . '&amp;goto=db_routines.php' . urlencode("?db={$db}"),
$titles['Drop'],
['class' => 'ajax drop_anchor']
);
$retval .= " </td>\n";
$retval .= " <td>\n";
$retval .= " {$routine['type']}\n";
@ -381,14 +380,11 @@ function PMA_TRI_getRowForList($trigger, $rowclass = '')
$retval .= " </td>\n";
$retval .= " <td>\n";
if (PMA\libraries\Util::currentUserHasPrivilege('TRIGGER', $db)) {
$retval .= ' <a ' . $ajax_class['drop']
. ' href="sql.php'
. $url_query
. '&amp;sql_query='
. urlencode($trigger['drop'])
. '&amp;goto=db_triggers.php'
. urlencode("?db={$db}")
. '" >' . $titles['Drop'] . "</a>\n";
$retval .= Util::linkOrButton(
'sql.php' . $url_query . '&amp;sql_query=' . urlencode($trigger['drop']) . '&amp;goto=db_triggers.php' . urlencode("?db={$db}"),
$titles['Drop'],
['class' => 'ajax drop_anchor']
);
} else {
$retval .= " {$titles['NoDrop']}\n";
}
@ -462,13 +458,11 @@ function PMA_EVN_getRowForList($event, $rowclass = '')
$retval .= " </td>\n";
$retval .= " <td>\n";
if (PMA\libraries\Util::currentUserHasPrivilege('EVENT', $db)) {
$retval .= ' <a ' . $ajax_class['drop']
. ' href="sql.php'
. $url_query
. '&amp;sql_query=' . urlencode($sql_drop)
. '&amp;goto=db_events.php'
. urlencode("?db={$db}")
. '" >' . $titles['Drop'] . "</a>\n";
$retval .= Util::linkOrButton(
'sql.php' . $url_query . '&amp;sql_query=' . urlencode($sql_drop) . '&amp;goto=db_events.php' . urlencode("?db={$db}"),
$titles['Drop'],
['class' => 'ajax drop_anchor']
);
} else {
$retval .= " {$titles['NoDrop']}\n";
}

View File

@ -1,3 +1,3 @@
<a class="truncate_table_anchor ajax" href="sql.php<?= $tbl_url_query; ?>&amp;sql_query=<?= $sql_query; ?>&amp;message_to_show=<?= $message_to_show; ?>">
<a class="truncate_table_anchor ajax" href="sql.php" data-post="<?= $tbl_url_query; ?>&amp;sql_query=<?= $sql_query; ?>&amp;message_to_show=<?= $message_to_show; ?>">
<?= $title; ?>
</a>

View File

@ -52,7 +52,7 @@
<td class="center print_ignore"><?= $empty_table; ?></td>
<td class="center print_ignore">
<a class="ajax drop_table_anchor <?= ($table_is_view || $current_table['ENGINE'] == null) ? ' view' : '' ?>"
href="sql.php<?= $tbl_url_query; ?>&amp;reload=1&amp;purge=1&amp;sql_query=<?= urlencode($drop_query); ?>&amp;message_to_show=<?= urlencode($drop_message); ?>" >
href="sql.php" data-post="<?= $tbl_url_query; ?>&amp;reload=1&amp;purge=1&amp;sql_query=<?= urlencode($drop_query); ?>&amp;message_to_show=<?= urlencode($drop_message); ?>" >
<?= $titles['Drop']; ?>
</a>
</td>

View File

@ -17,7 +17,7 @@
add_spatial_anchor"
<?php else: ?>
"
<?php endif; ?> href="tbl_structure.php<?= $url_query; ?>&amp;add_key=1&amp;sql_query=<?= urlencode(
<?php endif; ?> href="tbl_structure.php" data-post="<?= $url_query; ?>&amp;add_key=1&amp;sql_query=<?= urlencode(
'ALTER TABLE ' . PMA\libraries\Util::backquote($GLOBALS['table'])
. ($isPrimary ? ($primary ? ' DROP PRIMARY KEY,' : '') : '')
. ' ' . $syntax . '('

View File

@ -93,7 +93,7 @@
&& (mb_strpos($type, 'text') !== false
|| mb_strpos($type, 'char') !== false)
): ?>
<a rel="samepage" class="ajax add_key add_fulltext_anchor" href="tbl_structure.php<?= $url_query; ?>&amp;add_key=1&amp;sql_query=<?= urlencode(
<a rel="samepage" class="ajax add_key add_fulltext_anchor" href="tbl_structure.php" data-post="<?= $url_query; ?>&amp;add_key=1&amp;sql_query=<?= urlencode(
'ALTER TABLE ' . Util::backquote($GLOBALS['table'])
. ' ADD FULLTEXT(' . Util::backquote($row['Field'])
. ');'); ?>&amp;message_to_show=<?= urlencode(sprintf(
@ -107,7 +107,7 @@
</li>
<!-- Distinct value action -->
<li class="browse nowrap">
<a href="sql.php<?= $url_query; ?>&amp;sql_query=<?= urlencode(
<a href="sql.php" data-post="<?= $url_query; ?>&amp;sql_query=<?= urlencode(
'SELECT COUNT(*) AS ' . PMA\libraries\Util::backquote(__('Rows'))
. ', ' . PMA\libraries\Util::backquote($row['Field'])
. ' FROM ' . PMA\libraries\Util::backquote($GLOBALS['table'])

View File

@ -77,7 +77,7 @@ use PMA\libraries\URL; ?>
<td><?= htmlspecialchars($partition->getComment()); ?></td>
<?php foreach ($actionIcons as $action => $icon): ?>
<td>
<a href="tbl_structure.php<?= $url_query; ?>&amp;partition_maintenance=1&amp;sql_query=<?= urlencode(
<a href="tbl_structure.php" data-post="<?= $url_query; ?>&amp;partition_maintenance=1&amp;sql_query=<?= urlencode(
"ALTER TABLE " . Util::backquote($table) . $action . " PARTITION " . $partition->getName()
) ?>"
id="partition_action_<?= $action; ?>"

View File

@ -55,7 +55,7 @@
|| $tbl_storage_engine == 'BDB')): ?>
<tr class="tblFooters print_ignore">
<td colspan="3" class="center">
<a href="sql.php<?= $url_query; ?>&pos=0&amp;sql_query=<?= urlencode(
<a href="sql.php" data-post="<?= $url_query; ?>&pos=0&amp;sql_query=<?= urlencode(
'OPTIMIZE TABLE ' . PMA\libraries\Util::backquote($GLOBALS['table'])); ?>">
<?= PMA\libraries\Util::getIcon('b_tbloptimize.png', __('Optimize table')); ?>
</a>

View File

@ -5,7 +5,7 @@ use PMA\libraries\Util;
?>
<a href="#" id="printView"><?= Util::getIcon('b_print.png', __('Print'), true); ?></a>
<?php if (! $tbl_is_view && ! $db_is_system_schema): ?>
<a href="sql.php<?= $url_query; ?>&amp;session_max_rows=all&amp;sql_query=<?= urlencode(
<a href="sql.php" data-post="<?= $url_query; ?>&amp;session_max_rows=all&amp;sql_query=<?= urlencode(
'SELECT * FROM ' . Util::backquote($GLOBALS['table'])
. ' PROCEDURE ANALYSE()'
); ?>" style="margin-right: 0;">

View File

@ -46,7 +46,7 @@
</a>
</td>
<td class="drop center print_ignore">
<a class="drop_column_anchor ajax" href="sql.php<?= $url_query; ?>&amp;sql_query=<?= urlencode(
<a class="drop_column_anchor ajax" href="sql.php" data-post="<?= $url_query; ?>&amp;sql_query=<?= urlencode(
'ALTER TABLE ' . PMA\libraries\Util::backquote($table)
. ' DROP ' . PMA\libraries\Util::backquote($row['Field']) . ';'); ?>&amp;dropped_column=<?= $field_encoded; ?>&amp;purge=1&amp;message_to_show=<?= urlencode(sprintf(__('Column %s has been dropped.'), htmlspecialchars($row['Field']))) ?>" >
<?= $titles['Drop']; ?>

View File

@ -372,7 +372,6 @@ class DisplayResultsTest extends PMATestCase
array('`new`.`id`' => '= 1'),
'[%_PMA_CHECKBOX_DIR_%]',
'klass',
'<td class="klass" class="center print_ignore"><input type'
. '="checkbox" id="id_rows_to_delete0[%_PMA_CHECKBOX_DIR_%]" name='
. '"rows_to_delete[0]" class="multi_checkbox checkall" value="%60'
@ -434,9 +433,16 @@ class DisplayResultsTest extends PMATestCase
. '"Edit" class="icon ic_b_edit" /> Edit</span>',
'`customer`.`id` = 1',
'%60customer%60.%60id%60+%3D+1',
'<td class="klass edit_row_anchor center print_ignore" ><span class="nowrap"><input type="hidden" name="subform[1][db]" value="Data" /><input type="hidden" name="subform[1][table]" value="customer" /><input type="hidden" name="subform[1][where_clause]" value="`customer`.`id` = 1" /><input type="hidden" name="subform[1][clause_is_unique]" value="1" /><input type="hidden" name="subform[1][sql_query]" value="SELECT * FROM `customer`" /><input type="hidden" name="subform[1][goto]" value="sql.php" /><input type="hidden" name="subform[1][default_action]" value="update" /><input type="hidden" name="subform[1][redirect]" value="tbl_change.php" /><input type="hidden" name="subform[1][token]" value="token" />
<a href="#usesubform[1]=1" class="formLinkSubmit"><span class="nowrap"><img src="themes/dot.gif" title="Edit" alt="Edit" class="icon ic_b_edit" /> Edit</span> </a>
<input type="hidden" class="where_clause" value ="%60customer%60.%60id%60+%3D+1" /></span></td>'
'<td class="klass edit_row_anchor center print_ignore" >'
. '<span class="nowrap">'
. '<a href="tbl_change.php" data-post="db=Data&amp;table=customer&amp;where_'
. 'clause=%60customer%60.%60id%60+%3D+1&amp;clause_is_unique=1&amp;'
. 'sql_query=SELECT+%2A+FROM+%60customer%60&amp;goto=sql.php&amp;'
. 'default_action=update"'
. '><span class="nowrap"><img src="themes/dot.gif" title="Edit" '
. 'alt="Edit" class="icon ic_b_edit" /> Edit</span></a>'
. '<input type="hidden" class="where_clause" value ="%60customer'
. '%60.%60id%60+%3D+1" /></span></td>'
)
);
}
@ -490,9 +496,16 @@ class DisplayResultsTest extends PMATestCase
'`customer`.`id` = 1',
'%60customer%60.%60id%60+%3D+1',
'klass',
'<td class="klass center print_ignore" ><span class="nowrap"><input type="hidden" name="subform[1][db]" value="Data" /><input type="hidden" name="subform[1][table]" value="customer" /><input type="hidden" name="subform[1][where_clause]" value="`customer`.`id` = 1" /><input type="hidden" name="subform[1][clause_is_unique]" value="1" /><input type="hidden" name="subform[1][sql_query]" value="SELECT * FROM `customer`" /><input type="hidden" name="subform[1][goto]" value="sql.php" /><input type="hidden" name="subform[1][default_action]" value="insert" /><input type="hidden" name="subform[1][redirect]" value="tbl_change.php" /><input type="hidden" name="subform[1][token]" value="token" />
<a href="#usesubform[1]=1" class="formLinkSubmit"><span class="nowrap"><img src="themes/dot.gif" title="Copy" alt="Copy" class="icon ic_b_insrow" /> Copy</span> </a>
<input type="hidden" class="where_clause" value="%60customer%60.%60id%60+%3D+1" /></span></td>'
'<td class="klass center print_ignore" ><span class='
. '"nowrap">'
. '<a href="tbl_change.php" data-post="db=Data&amp;table=customer&amp;where_'
. 'clause=%60customer%60.%60id%60+%3D+1&amp;clause_is_unique=1&amp;'
. 'sql_query=SELECT+%2A+FROM+%60customer%60&amp;goto=sql.php&amp;'
. 'default_action=insert"'
. '><span class="nowrap"><img src="themes/dot.gif" title="Copy" '
. 'alt="Copy" class="icon ic_b_insrow" /> Copy</span></a>'
. '<input type="hidden" class="where_clause" value="%60customer%60'
. '.%60id%60+%3D+1" /></span></td>'
)
);
}
@ -547,9 +560,18 @@ class DisplayResultsTest extends PMATestCase
. 'alt="Delete" class="icon ic_b_drop" /> Delete</span>',
'DELETE FROM `Data`.`customer` WHERE `customer`.`id` = 1',
'klass',
'<td class="klass center print_ignore" ><input type="hidden" name="subform[1][db]" value="Data" /><input type="hidden" name="subform[1][table]" value="customer" /><input type="hidden" name="subform[1][sql_query]" value="DELETE FROM `Data`.`customer` WHERE `customer`.`id` = 1" /><input type="hidden" name="subform[1][message_to_show]" value="The row has been deleted" /><input type="hidden" name="subform[1][goto]" value="sql.php?db=Data&amp;table=customer&amp;sql_query=SELECT+%2A+FROM+%60customer%60&amp;message_to_show=The+row+has+been+deleted&amp;goto=tbl_structure.php" /><input type="hidden" name="subform[1][redirect]" value="sql.php" /><input type="hidden" name="subform[1][token]" value="token" />
<a href="#usesubform[1]=1" class="delete_row requireConfirm formLinkSubmit"><span class="nowrap"><img src="themes/dot.gif" title="Delete" alt="Delete" class="icon ic_b_drop" /> Delete</span> </a>
<div class="hide">DELETE FROM `Data`.`customer` WHERE `customer`.`id` = 1</div></td>'
'<td class="klass center print_ignore" >'
. '<a href="sql.php" data-post="db=Data&amp;table=customer&amp;sql_query=DELETE'
. '+FROM+%60Data%60.%60customer%60+WHERE+%60customer%60.%60id%60+%3D'
. '+1&amp;message_to_show=The+row+has+been+deleted&amp;goto=sql.php'
. '%3Fdb%3DData%26table%3Dcustomer%26sql_query%3DSELECT%2B%252A%2B'
. 'FROM%2B%2560customer%2560%26message_to_show%3DThe%2Brow%2Bhas%2B'
. 'been%2Bdeleted%26goto%3Dtbl_structure.php" '
. 'class="delete_row requireConfirm"><span class="nowrap"><img src="themes/dot.'
. 'gif" title="Delete" alt="Delete" class="icon ic_b_drop" /> '
. 'Delete</span></a>'
. '<div class="hide">DELETE FROM `Data`.`customer` WHERE '
. '`customer`.`id` = 1</div></td>'
)
);
}
@ -629,14 +651,40 @@ class DisplayResultsTest extends PMATestCase
'<span class="nowrap"><img src="themes/dot.gif" title="Delete" '
. 'alt="Delete" class="icon ic_b_drop" /> Delete</span>',
'DELETE FROM `data`.`new` WHERE `new`.`id` = 1',
'<td class="center print_ignore"><input type="checkbox" id="id_rows_to_delete0_left" name="rows_to_delete[0]" class="multi_checkbox checkall" value="%60new%60.%60id%60+%3D+1" /><input type="hidden" class="condition_array" value="{&quot;`new`.`id`&quot;:&quot;= 1&quot;}" /> </td><td class="edit_row_anchor center print_ignore" ><span class="nowrap"><input type="hidden" name="subform[1][db]" value="data" /><input type="hidden" name="subform[1][table]" value="new" /><input type="hidden" name="subform[1][where_clause]" value="`new`.`id` = 1" /><input type="hidden" name="subform[1][clause_is_unique]" value="1" /><input type="hidden" name="subform[1][sql_query]" value="SELECT * FROM `new`" /><input type="hidden" name="subform[1][goto]" value="sql.php" /><input type="hidden" name="subform[1][default_action]" value="update" /><input type="hidden" name="subform[1][redirect]" value="tbl_change.php" /><input type="hidden" name="subform[1][token]" value="token" />
<a href="#usesubform[1]=1" class="formLinkSubmit"><span class="nowrap"><img src="themes/dot.gif" title="Edit" alt="Edit" class="icon ic_b_edit" /> Edit</span> </a>
<input type="hidden" class="where_clause" value ="%60new%60.%60id%60+%3D+1" /></span></td><td class="center print_ignore" ><span class="nowrap"><input type="hidden" name="subform[2][db]" value="data" /><input type="hidden" name="subform[2][table]" value="new" /><input type="hidden" name="subform[2][where_clause]" value="`new`.`id` = 1" /><input type="hidden" name="subform[2][clause_is_unique]" value="1" /><input type="hidden" name="subform[2][sql_query]" value="SELECT * FROM `new`" /><input type="hidden" name="subform[2][goto]" value="sql.php" /><input type="hidden" name="subform[2][default_action]" value="insert" /><input type="hidden" name="subform[2][redirect]" value="tbl_change.php" /><input type="hidden" name="subform[2][token]" value="token" />
<a href="#usesubform[2]=1" class="formLinkSubmit"><span class="nowrap"><img src="themes/dot.gif" title="Copy" alt="Copy" class="icon ic_b_insrow" /> Copy</span> </a>
<input type="hidden" class="where_clause" value="%60new%60.%60id%60+%3D+1" /></span></td><td class="center print_ignore" ><input type="hidden" name="subform[3][db]" value="data" /><input type="hidden" name="subform[3][table]" value="new" /><input type="hidden" name="subform[3][sql_query]" value="DELETE FROM `data`.`new` WHERE `new`.`id` = 1" /><input type="hidden" name="subform[3][message_to_show]" value="The row has been deleted" /><input type="hidden" name="subform[3][goto]" value="sql.php?db=data&amp;table=new&amp;sql_query=SELECT+%2A+FROM+%60new%60&amp;message_to_show=The+row+has+been+deleted&amp;goto=tbl_structure.php" /><input type="hidden" name="subform[3][redirect]" value="sql.php" /><input type="hidden" name="subform[3][token]" value="token" />
<a href="#usesubform[3]=1" class="delete_row requireConfirm formLinkSubmit"><span class="nowrap"><img src="themes/dot.gif" title="Delete" alt="Delete" class="icon ic_b_drop" /> Delete</span> </a>
<div class="hide">DELETE FROM `data`.`new` WHERE `new`.`id` = 1</div></td>'
'<td class="center print_ignore"><input type="checkbox" id="id_rows_to_delete0_'
. 'left" name="rows_to_delete[0]" class="multi_checkbox checkall" '
. 'value="%60new%60.%60id%60+%3D+1" /><input type="hidden" class='
. '"condition_array" value="{&quot;`new`.`id`&quot;:&quot;= 1&quot;'
. '}" /> </td><td class="edit_row_anchor center print_ignore" ><span class='
. '"nowrap">'
. '<a href="tbl_change.php" data-post="db=data&amp;table=new&amp;where_'
. 'clause=%60new%60.%60id%60+%3D+1&amp;clause_is_unique=1&amp;'
. 'sql_query=SELECT+%2A+FROM+%60new%60&amp;goto=sql.php&amp;default'
. '_action=update">'
. '<span class="nowrap"><img src="themes/dot.gif" title="Edit" '
. 'alt="Edit" class="icon ic_b_edit" /> Edit</span></a>'
. '<input type="hidden" class="where_clause" value ="%60new%60.%60'
. 'id%60+%3D+1" /></span></td><td class="center print_ignore" ><span class'
. '="nowrap">'
. '<a href="tbl_change.php" data-post="db=data&amp;table=new&amp;where_clause'
. '=%60new%60.%60id%60+%3D+1&amp;clause_is_unique=1&amp;sql_query='
. 'SELECT+%2A+FROM+%60new%60&amp;goto=sql.php&amp;default_action='
. 'insert"><span class'
. '="nowrap"><img src="themes/dot.gif" title="Copy" alt="Copy" '
. 'class="icon ic_b_insrow" /> Copy</span></a>'
. '<input type="hidden" class="where_clause" value="%60new%60.%60id'
. '%60+%3D+1" /></span></td><td class="center print_ignore" >'
. '<a href="sql.php" data-post="db=data&amp;table=new&amp;sql_query=DELETE+'
. 'FROM+%60data%60.%60new%60+WHERE+%60new%60.%60id%60+%3D+1&amp;'
. 'message_to_show=The+row+has+been+deleted&amp;goto=sql.php%3F'
. 'db%3Ddata%26table%3Dnew%26sql_query%3DSELECT%2B%252A%2BFROM%2B'
. '%2560new%2560%26message_to_show%3DThe%2Brow%2Bhas%2Bbeen%2B'
. 'deleted%26goto%3Dtbl_structure.php" '
. 'class="delete_row requireConfirm"><span class="nowrap"><img src="themes/dot.'
. 'gif" title="Delete" alt="Delete" class="icon ic_b_drop" /> '
. 'Delete</span></a>'
. '<div class="hide">DELETE FROM `data`.`new` WHERE `new`.`id` = 1'
. '</div></td>'
),
array(
PMA\libraries\DisplayResults::POSITION_RIGHT,
@ -675,13 +723,38 @@ class DisplayResultsTest extends PMATestCase
'<span class="nowrap"><img src="themes/dot.gif" title="Delete" '
. 'alt="Delete" class="icon ic_b_drop" /> Delete</span>',
'DELETE FROM `data`.`new` WHERE `new`.`id` = 1',
'<td class="center print_ignore" ><input type="hidden" name="subform[1][db]" value="data" /><input type="hidden" name="subform[1][table]" value="new" /><input type="hidden" name="subform[1][sql_query]" value="DELETE FROM `data`.`new` WHERE `new`.`id` = 1" /><input type="hidden" name="subform[1][message_to_show]" value="The row has been deleted" /><input type="hidden" name="subform[1][goto]" value="sql.php?db=data&amp;table=new&amp;sql_query=SELECT+%2A+FROM+%60new%60&amp;message_to_show=The+row+has+been+deleted&amp;goto=tbl_structure.php" /><input type="hidden" name="subform[1][redirect]" value="sql.php" /><input type="hidden" name="subform[1][token]" value="token" />
<a href="#usesubform[1]=1" class="delete_row requireConfirm formLinkSubmit"><span class="nowrap"><img src="themes/dot.gif" title="Delete" alt="Delete" class="icon ic_b_drop" /> Delete</span> </a>
<div class="hide">DELETE FROM `data`.`new` WHERE `new`.`id` = 1</div></td><td class="center print_ignore" ><span class="nowrap"><input type="hidden" name="subform[2][db]" value="data" /><input type="hidden" name="subform[2][table]" value="new" /><input type="hidden" name="subform[2][where_clause]" value="`new`.`id` = 1" /><input type="hidden" name="subform[2][clause_is_unique]" value="1" /><input type="hidden" name="subform[2][sql_query]" value="SELECT * FROM `new`" /><input type="hidden" name="subform[2][goto]" value="sql.php" /><input type="hidden" name="subform[2][default_action]" value="insert" /><input type="hidden" name="subform[2][redirect]" value="tbl_change.php" /><input type="hidden" name="subform[2][token]" value="token" />
<a href="#usesubform[2]=1" class="formLinkSubmit"><span class="nowrap"><img src="themes/dot.gif" title="Copy" alt="Copy" class="icon ic_b_insrow" /> Copy</span> </a>
<input type="hidden" class="where_clause" value="%60new%60.%60id%60+%3D+1" /></span></td><td class="edit_row_anchor center print_ignore" ><span class="nowrap"><input type="hidden" name="subform[3][db]" value="data" /><input type="hidden" name="subform[3][table]" value="new" /><input type="hidden" name="subform[3][where_clause]" value="`new`.`id` = 1" /><input type="hidden" name="subform[3][clause_is_unique]" value="1" /><input type="hidden" name="subform[3][sql_query]" value="SELECT * FROM `new`" /><input type="hidden" name="subform[3][goto]" value="sql.php" /><input type="hidden" name="subform[3][default_action]" value="update" /><input type="hidden" name="subform[3][redirect]" value="tbl_change.php" /><input type="hidden" name="subform[3][token]" value="token" />
<a href="#usesubform[3]=1" class="formLinkSubmit"><span class="nowrap"><img src="themes/dot.gif" title="Edit" alt="Edit" class="icon ic_b_edit" /> Edit</span> </a>
<input type="hidden" class="where_clause" value ="%60new%60.%60id%60+%3D+1" /></span></td><td class="center print_ignore"><input type="checkbox" id="id_rows_to_delete0_right" name="rows_to_delete[0]" class="multi_checkbox checkall" value="%60new%60.%60id%60+%3D+1" /><input type="hidden" class="condition_array" value="{&quot;`new`.`id`&quot;:&quot;= 1&quot;}" /> </td>'
'<td class="center print_ignore" >'
. '<a href="sql.php" data-post="db=data&amp;table=new&amp;sql_query=DELETE+'
. 'FROM+%60data%60.%60new%60+WHERE+%60new%60.%60id%60+%3D+1&amp;'
. 'message_to_show=The+row+has+been+deleted&amp;goto=sql.php%3Fdb'
. '%3Ddata%26table%3Dnew%26sql_query%3DSELECT%2B%252A%2BFROM%2B%25'
. '60new%2560%26message_to_show%3DThe%2Brow%2Bhas%2Bbeen%2Bdeleted'
. '%26goto%3Dtbl_structure.php" class="delete'
. '_row requireConfirm"><span class="nowrap"><img src="themes/dot.gif" title='
. '"Delete" alt="Delete" class="icon ic_b_drop" /> Delete</span></a>'
. '<div class="hide">DELETE FROM `data`.`new` WHERE `new`.'
. '`id` = 1</div></td><td class="center print_ignore" ><span class="nowrap">'
. '<a href="tbl_change.php" data-post="db=data&amp;table=new&amp;where_'
. 'clause=%60new%60.%60id%60+%3D+1&amp;clause_is_unique=1&amp;sql_'
. 'query=SELECT+%2A+FROM+%60new%60&amp;goto=sql.php&amp;default_'
. 'action=insert"><span '
. 'class="nowrap"><img src="themes/dot.gif" title="Copy" alt="Copy" '
. 'class="icon ic_b_insrow" /> Copy</span></a>'
. '<input type="hidden" class="where_clause" value="%60new%60.%60id'
. '%60+%3D+1" /></span></td><td class="edit_row_anchor center print_ignore" >'
. '<span class="nowrap">'
. '<a href="tbl_change.php" data-post="db=data&amp;table=new&amp;where_clause'
. '=%60new%60.%60id%60+%3D+1&amp;clause_is_unique=1&amp;sql_query='
. 'SELECT+%2A+FROM+%60new%60&amp;goto=sql.php&amp;default_action='
. 'update"><span class='
. '"nowrap"><img src="themes/dot.gif" title="Edit" alt="Edit" class'
. '="icon ic_b_edit" /> Edit</span></a>'
. '<input type="hidden" class="where_clause" value ="%60new%60.%60'
. 'id%60+%3D+1" /></span></td><td class="center print_ignore"><input type='
. '"checkbox" id="id_rows_to_delete0_right" name="rows_to_delete'
. '[0]" class="multi_checkbox checkall" value="%60new%60.%60id%60'
. '+%3D+1" /><input type="hidden" class="condition_array" value="'
. '{&quot;`new`.`id`&quot;:&quot;= 1&quot;}" /> </td>'
),
array(
PMA\libraries\DisplayResults::POSITION_NONE,
@ -806,7 +879,7 @@ class DisplayResultsTest extends PMATestCase
'tbl_change.php?db=data&amp;table=new&amp;where_clause=%60new%60.%60'
. 'id%60+%3D+1&amp;clause_is_unique=1&amp;sql_query=SELECT+%2A+FROM+'
. '%60new%60&amp;goto=sql.php&amp;default_action=update',
'tbl_change.php?db=data&amp;table=new&amp;where_clause=%60new%60.%60'
'/tbl_change.php?db=data&amp;table=new&amp;where_clause=%60new%60.%60'
. 'id%60+%3D+1&amp;clause_is_unique=1&amp;sql_query=SELECT+%2A+FROM+'
. '%60new%60&amp;goto=sql.php&amp;default_action=insert',
'edit_row_anchor',

View File

@ -306,4 +306,57 @@ class UtilTest extends PMATestCase
array("https://www.phpmyadmin.net/test/nothing","GET", true, false),
);
}
/**
* Test for Util::linkOrButton
*
* @return void
*
* @dataProvider linksOrButtons
*/
public function testLinkOrButton(array $params, $limit, $match)
{
$restore = isset($GLOBALS['cfg']['LinkLengthLimit']) ? $GLOBALS['cfg']['LinkLengthLimit'] : 1000;
$GLOBALS['cfg']['LinkLengthLimit'] = $limit;
try {
$result = call_user_func_array(
array('PMA\libraries\Util', 'linkOrButton'),
$params
);
$this->assertEquals($match, $result);
} finally {
$GLOBALS['cfg']['LinkLengthLimit'] = $restore;
}
}
/**
* Data provider for Util::linkOrButton test
*
* @return array
*/
public function linksOrButtons()
{
return [
[
['index.php', 'text'],
1000,
'<a href="index.php" >text</a>'
],
[
['index.php?some=parameter', 'text'],
20,
'<a href="index.php" data-post="some=parameter">text</a>',
],
[
['index.php', 'text', [], true, false, 'target'],
1000,
'<a href="index.php" target="target">text</a>',
],
[
['url.php?url=http://phpmyadmin.net/', 'text', [], true, false, '_blank'],
1000,
'<a href="url.php?url=http://phpmyadmin.net/" target="_blank" rel="noopener noreferrer">text</a>',
],
];
}
}

View File

@ -37,6 +37,7 @@ class PMA_Operations_Test extends PHPUnit_Framework_TestCase
$GLOBALS['cfg'] = array(
'ServerDefault' => 1,
'ActionLinksMode' => 'icons',
'LinkLengthLimit' => 1000,
);
$GLOBALS['cfg']['DBG']['sql'] = false;
$GLOBALS['server'] = 1;