Closing tags at the end of file are not mandatory. It is often suggested to omit to closing tags at the end of file to prevent unwanted effects as PHP will start output buffering if there is any character after closing tag. Reference: http://php.net/manual/en/language.basic-syntax.phptags.php Signed-off-by: Rahul Kadyan <hi@znck.me>
210 lines
5.8 KiB
PHP
210 lines
5.8 KiB
PHP
<?php
|
|
/* vim: set expandtab sw=4 ts=4 sts=4: */
|
|
/**
|
|
* Displays table structure infos like columns, indexes, size, rows
|
|
* and allows manipulation of indexes and columns
|
|
*
|
|
* @package PhpMyAdmin
|
|
*/
|
|
|
|
/**
|
|
*
|
|
*/
|
|
require_once 'libraries/common.inc.php';
|
|
require_once 'libraries/mysql_charsets.inc.php';
|
|
|
|
/**
|
|
* Function implementations for this script
|
|
*/
|
|
require_once 'libraries/structure.lib.php';
|
|
require_once 'libraries/index.lib.php';
|
|
require_once 'libraries/sql.lib.php';
|
|
require_once 'libraries/bookmark.lib.php';
|
|
|
|
$response = PMA_Response::getInstance();
|
|
$header = $response->getHeader();
|
|
$scripts = $header->getScripts();
|
|
$scripts->addFile('tbl_structure.js');
|
|
$scripts->addFile('indexes.js');
|
|
|
|
/**
|
|
* Handle column moving
|
|
*/
|
|
if (isset($_REQUEST['move_columns'])
|
|
&& is_array($_REQUEST['move_columns'])
|
|
&& $response->isAjax()
|
|
) {
|
|
PMA_moveColumns($db, $table);
|
|
exit;
|
|
}
|
|
|
|
/**
|
|
* handle MySQL reserved words columns check
|
|
*/
|
|
if (isset($_REQUEST['reserved_word_check'])) {
|
|
$response = PMA_Response::getInstance();
|
|
if ($GLOBALS['cfg']['ReservedWordDisableWarning'] === false) {
|
|
$columns_names = $_REQUEST['field_name'];
|
|
$reserved_keywords_names = array();
|
|
foreach ($columns_names as $column) {
|
|
if (PMA_SQP_isKeyWord(trim($column))) {
|
|
$reserved_keywords_names[] = trim($column);
|
|
}
|
|
}
|
|
if (PMA_SQP_isKeyWord(trim($table))) {
|
|
$reserved_keywords_names[] = trim($table);
|
|
}
|
|
if (count($reserved_keywords_names) == 0) {
|
|
$response->isSuccess(false);
|
|
}
|
|
$response->addJSON(
|
|
'message', sprintf(
|
|
_ngettext(
|
|
'The name \'%s\' is a MySQL reserved keyword.',
|
|
'The names \'%s\' are MySQL reserved keywords.',
|
|
count($reserved_keywords_names)
|
|
),
|
|
implode(',', $reserved_keywords_names)
|
|
)
|
|
);
|
|
} else {
|
|
$response->isSuccess(false);
|
|
}
|
|
exit;
|
|
}
|
|
/**
|
|
* A click on Change has been made for one column
|
|
*/
|
|
if (isset($_REQUEST['change_column'])) {
|
|
PMA_displayHtmlForColumnChange($db, $table, null, 'tbl_structure.php');
|
|
exit;
|
|
}
|
|
|
|
/**
|
|
* handle multiple field commands if required
|
|
*
|
|
* submit_mult_*_x comes from IE if <input type="img" ...> is used
|
|
*/
|
|
$submit_mult = PMA_getMultipleFieldCommandType();
|
|
|
|
if (! empty($submit_mult)) {
|
|
if (isset($_REQUEST['selected_fld'])) {
|
|
if ($submit_mult == 'browse') {
|
|
// browsing the table displaying only selected columns
|
|
PMA_displayTableBrowseForSelectedColumns(
|
|
$db, $table, $goto, $pmaThemeImage
|
|
);
|
|
} else {
|
|
// handle multiple field commands
|
|
// handle confirmation of deleting multiple columns
|
|
$action = 'tbl_structure.php';
|
|
include 'libraries/mult_submits.inc.php';
|
|
/**
|
|
* if $submit_mult == 'change', execution will have stopped
|
|
* at this point
|
|
*/
|
|
|
|
if (empty($message)) {
|
|
$message = PMA_Message::success();
|
|
}
|
|
}
|
|
} else {
|
|
$response = PMA_Response::getInstance();
|
|
$response->isSuccess(false);
|
|
$response->addJSON('message', __('No column selected.'));
|
|
}
|
|
}
|
|
|
|
// display secondary level tabs if necessary
|
|
$engine = PMA_Table::sGetStatusInfo($db, $table, 'ENGINE');
|
|
$response->addHTML(PMA_getStructureSecondaryTabs($engine));
|
|
$response->addHTML('<div id="structure_content">');
|
|
|
|
/**
|
|
* Modifications have been submitted -> updates the table
|
|
*/
|
|
if (isset($_REQUEST['do_save_data'])) {
|
|
$regenerate = PMA_updateColumns($db, $table);
|
|
if ($regenerate) {
|
|
// This happens when updating failed
|
|
// @todo: do something appropriate
|
|
} else {
|
|
// continue to show the table's structure
|
|
unset($_REQUEST['selected']);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Adding indexes
|
|
*/
|
|
if (isset($_REQUEST['add_key'])) {
|
|
include 'sql.php';
|
|
$GLOBALS['reload'] = true;
|
|
}
|
|
|
|
/**
|
|
* Gets the relation settings
|
|
*/
|
|
$cfgRelation = PMA_getRelationsParam();
|
|
|
|
/**
|
|
* Runs common work
|
|
*/
|
|
require_once 'libraries/tbl_common.inc.php';
|
|
$url_query .= '&goto=tbl_structure.php&back=tbl_structure.php';
|
|
$url_params['goto'] = 'tbl_structure.php';
|
|
$url_params['back'] = 'tbl_structure.php';
|
|
|
|
/**
|
|
* Prepares the table structure display
|
|
*/
|
|
|
|
|
|
/**
|
|
* Gets tables informations
|
|
*/
|
|
require_once 'libraries/tbl_info.inc.php';
|
|
|
|
require_once 'libraries/Index.class.php';
|
|
|
|
// 2. Gets table keys and retains them
|
|
// @todo should be: $server->db($db)->table($table)->primary()
|
|
$primary = PMA_Index::getPrimary($table, $db);
|
|
|
|
$columns_with_unique_index = PMA_getColumnsWithUniqueIndex($db, $table);
|
|
|
|
// 3. Get fields
|
|
$fields = (array) $GLOBALS['dbi']->getColumns($db, $table, null, true);
|
|
|
|
// Get more complete field information
|
|
// For now, this is done just for MySQL 4.1.2+ new TIMESTAMP options
|
|
// but later, if the analyser returns more information, it
|
|
// could be executed for any MySQL version and replace
|
|
// the info given by SHOW FULL COLUMNS FROM.
|
|
//
|
|
// We also need this to correctly learn if a TIMESTAMP is NOT NULL, since
|
|
// SHOW FULL COLUMNS or INFORMATION_SCHEMA incorrectly says NULL
|
|
// and SHOW CREATE TABLE says NOT NULL (tested
|
|
// in MySQL 4.0.25 and 5.0.21, http://bugs.mysql.com/20910).
|
|
|
|
$show_create_table = $GLOBALS['dbi']->fetchValue(
|
|
'SHOW CREATE TABLE ' . PMA_Util::backquote($db) . '.'
|
|
. PMA_Util::backquote($table),
|
|
0, 1
|
|
);
|
|
$analyzed_sql = PMA_SQP_analyze(PMA_SQP_parse($show_create_table));
|
|
|
|
/**
|
|
* prepare table infos
|
|
*/
|
|
// action titles (image or string)
|
|
$titles = PMA_getActionTitlesArray();
|
|
|
|
// hidden action titles (image and string)
|
|
$hidden_titles = PMA_getHiddenTitlesArray();
|
|
|
|
//display table structure
|
|
require_once 'libraries/display_structure.inc.php';
|
|
|
|
$response->addHTML('</div>');
|