123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449 |
- <?php
- /* vim: set expandtab sw=4 ts=4 sts=4: */
- /**
- * Display form for changing/adding table fields/columns.
- * Included by tbl_addfield.php and tbl_create.php
- *
- * @package PhpMyAdmin
- */
- use PhpMyAdmin\Di\Container;
- use PhpMyAdmin\Partition;
- use PhpMyAdmin\Relation;
- use PhpMyAdmin\Response;
- use PhpMyAdmin\Table;
- use PhpMyAdmin\Template;
- use PhpMyAdmin\Transformations;
- use PhpMyAdmin\Util;
- if (!defined('PHPMYADMIN')) {
- exit;
- }
- /**
- * Check parameters
- */
- Util::checkParameters(
- array('server', 'db', 'table', 'action', 'num_fields')
- );
- global $db, $table;
- $relation = new Relation();
- /**
- * Initialize to avoid code execution path warnings
- */
- if (!isset($num_fields)) {
- $num_fields = 0;
- }
- if (!isset($mime_map)) {
- $mime_map = null;
- }
- if (!isset($columnMeta)) {
- $columnMeta = array();
- }
- $length_values_input_size = 8;
- $content_cells = array();
- /** @var string $db */
- $form_params = array(
- 'db' => $db
- );
- if ($action == 'tbl_create.php') {
- $form_params['reload'] = 1;
- } else {
- if ($action == 'tbl_addfield.php') {
- $form_params = array_merge(
- $form_params, array(
- 'field_where' => Util::getValueByKey($_POST, 'field_where'))
- );
- if (isset($_POST['field_where'])) {
- $form_params['after_field'] = $_POST['after_field'];
- }
- }
- $form_params['table'] = $table;
- }
- if (isset($num_fields)) {
- $form_params['orig_num_fields'] = $num_fields;
- }
- $form_params = array_merge(
- $form_params,
- array(
- 'orig_field_where' => Util::getValueByKey($_POST, 'field_where'),
- 'orig_after_field' => Util::getValueByKey($_POST, 'after_field'),
- )
- );
- if (isset($selected) && is_array($selected)) {
- foreach ($selected as $o_fld_nr => $o_fld_val) {
- $form_params['selected[' . $o_fld_nr . ']'] = $o_fld_val;
- }
- }
- $is_backup = ($action != 'tbl_create.php' && $action != 'tbl_addfield.php');
- $cfgRelation = $relation->getRelationsParam();
- $comments_map = $relation->getComments($db, $table);
- $move_columns = array();
- if (isset($fields_meta)) {
- /** @var PhpMyAdmin\DatabaseInterface $dbi */
- $dbi = Container::getDefaultContainer()->get('dbi');
- $move_columns = $dbi->getTable($db, $table)->getColumnsMeta();
- }
- $available_mime = array();
- if ($cfgRelation['mimework'] && $GLOBALS['cfg']['BrowseMIME']) {
- $mime_map = Transformations::getMIME($db, $table);
- $available_mime = Transformations::getAvailableMIMEtypes();
- }
- // workaround for field_fulltext, because its submitted indices contain
- // the index as a value, not a key. Inserted here for easier maintenance
- // and less code to change in existing files.
- if (isset($field_fulltext) && is_array($field_fulltext)) {
- foreach ($field_fulltext as $fulltext_nr => $fulltext_indexkey) {
- $submit_fulltext[$fulltext_indexkey] = $fulltext_indexkey;
- }
- }
- if (isset($_POST['submit_num_fields'])
- || isset($_POST['submit_partition_change'])
- ) {
- //if adding new fields, set regenerate to keep the original values
- $regenerate = 1;
- }
- $foreigners = $relation->getForeigners($db, $table, '', 'foreign');
- $child_references = null;
- // From MySQL 5.6.6 onwards columns with foreign keys can be renamed.
- // Hence, no need to get child references
- if ($GLOBALS['dbi']->getVersion() < 50606) {
- $child_references = $relation->getChildReferences($db, $table);
- }
- for ($columnNumber = 0; $columnNumber < $num_fields; $columnNumber++) {
- $type = '';
- $length = '';
- $columnMeta = array();
- $submit_attribute = null;
- $extracted_columnspec = array();
- if (!empty($regenerate)) {
- $columnMeta = array_merge(
- $columnMeta,
- array(
- 'Field' => Util::getValueByKey(
- $_POST, "field_name.${columnNumber}", false
- ),
- 'Type' => Util::getValueByKey(
- $_POST, "field_type.${columnNumber}", false
- ),
- 'Collation' => Util::getValueByKey(
- $_POST, "field_collation.${columnNumber}", ''
- ),
- 'Null' => Util::getValueByKey(
- $_POST, "field_null.${columnNumber}", ''
- ),
- 'DefaultType' => Util::getValueByKey(
- $_POST, "field_default_type.${columnNumber}", 'NONE'
- ),
- 'DefaultValue' => Util::getValueByKey(
- $_POST, "field_default_value.${columnNumber}", ''
- ),
- 'Extra' => Util::getValueByKey(
- $_POST, "field_extra.${columnNumber}", false
- ),
- 'Virtuality' => Util::getValueByKey(
- $_POST, "field_virtuality.${columnNumber}", ''
- ),
- 'Expression' => Util::getValueByKey(
- $_POST, "field_expression.${columnNumber}", ''
- ),
- )
- );
- $columnMeta['Key'] = '';
- $parts = explode(
- '_', Util::getValueByKey($_POST, "field_key.${columnNumber}", ''), 2
- );
- if (count($parts) == 2 && $parts[1] == $columnNumber) {
- $columnMeta['Key'] = Util::getValueByKey(
- array(
- 'primary' => 'PRI',
- 'index' => 'MUL',
- 'unique' => 'UNI',
- 'fulltext' => 'FULLTEXT',
- 'spatial' => 'SPATIAL'
- ),
- $parts[0], ''
- );
- }
- $columnMeta['Comment']
- = isset($submit_fulltext[$columnNumber])
- && ($submit_fulltext[$columnNumber] == $columnNumber)
- ? 'FULLTEXT' : false;
- switch ($columnMeta['DefaultType']) {
- case 'NONE':
- $columnMeta['Default'] = null;
- break;
- case 'USER_DEFINED':
- $columnMeta['Default'] = $columnMeta['DefaultValue'];
- break;
- case 'NULL':
- case 'CURRENT_TIMESTAMP':
- case 'current_timestamp()':
- $columnMeta['Default'] = $columnMeta['DefaultType'];
- break;
- }
- $length = Util::getValueByKey($_POST, "field_length.${columnNumber}", $length);
- $submit_attribute = Util::getValueByKey(
- $_POST, "field_attribute.${columnNumber}", false
- );
- $comments_map[$columnMeta['Field']] = Util::getValueByKey(
- $_POST, "field_comments.${columnNumber}"
- );
- $mime_map[$columnMeta['Field']] = array_merge(
- isset($mime_map[$columnMeta['Field']]) ? $mime_map[$columnMeta['Field']] : [],
- array(
- 'mimetype' => Util::getValueByKey($_POST, "field_mimetype.${$columnNumber}"),
- 'transformation' => Util::getValueByKey(
- $_POST, "field_transformation.${$columnNumber}"
- ),
- 'transformation_options' => Util::getValueByKey(
- $_POST, "field_transformation_options.${$columnNumber}"
- ),
- )
- );
- } elseif (isset($fields_meta[$columnNumber])) {
- $columnMeta = $fields_meta[$columnNumber];
- $virtual = array(
- 'VIRTUAL', 'PERSISTENT', 'VIRTUAL GENERATED', 'STORED GENERATED'
- );
- if (in_array($columnMeta['Extra'], $virtual)) {
- $tableObj = new Table($GLOBALS['table'], $GLOBALS['db']);
- $expressions = $tableObj->getColumnGenerationExpression(
- $columnMeta['Field']
- );
- $columnMeta['Expression'] = $expressions[$columnMeta['Field']];
- }
- switch ($columnMeta['Default']) {
- case null:
- if (is_null($columnMeta['Default'])) { // null
- if ($columnMeta['Null'] == 'YES') {
- $columnMeta['DefaultType'] = 'NULL';
- $columnMeta['DefaultValue'] = '';
- } else {
- $columnMeta['DefaultType'] = 'NONE';
- $columnMeta['DefaultValue'] = '';
- }
- } else { // empty
- $columnMeta['DefaultType'] = 'USER_DEFINED';
- $columnMeta['DefaultValue'] = $columnMeta['Default'];
- }
- break;
- case 'CURRENT_TIMESTAMP':
- case 'current_timestamp()':
- $columnMeta['DefaultType'] = 'CURRENT_TIMESTAMP';
- $columnMeta['DefaultValue'] = '';
- break;
- default:
- $columnMeta['DefaultType'] = 'USER_DEFINED';
- if ('text' === substr($columnMeta['Type'], -4)) {
- $textDefault = substr($columnMeta['Default'], 1, -1);
- $columnMeta['Default'] = stripcslashes($textDefault !== false ? $textDefault : $columnMeta['Default']);
- }
- $columnMeta['DefaultValue'] = $columnMeta['Default'];
- break;
- }
- }
- if (isset($columnMeta['Type'])) {
- $extracted_columnspec = Util::extractColumnSpec(
- $columnMeta['Type']
- );
- if ($extracted_columnspec['type'] == 'bit') {
- $columnMeta['Default']
- = Util::convertBitDefaultValue($columnMeta['Default']);
- }
- $type = $extracted_columnspec['type'];
- if ($length == '') {
- $length = $extracted_columnspec['spec_in_brackets'];
- }
- } else {
- // creating a column
- $columnMeta['Type'] = '';
- }
- // Variable tell if current column is bound in a foreign key constraint or not.
- // MySQL version from 5.6.6 allow renaming columns with foreign keys
- if (isset($columnMeta['Field'])
- && isset($form_params['table'])
- && $GLOBALS['dbi']->getVersion() < 50606
- ) {
- $columnMeta['column_status'] = $relation->checkChildForeignReferences(
- $form_params['db'],
- $form_params['table'],
- $columnMeta['Field'],
- $foreigners,
- $child_references
- );
- }
- // some types, for example longtext, are reported as
- // "longtext character set latin7" when their charset and / or collation
- // differs from the ones of the corresponding database.
- // rtrim the type, for cases like "float unsigned"
- $type = rtrim(
- preg_replace('/[\s]character set[\s][\S]+/', '', $type)
- );
- /**
- * old column attributes
- */
- if ($is_backup) {
- // old column name
- if (isset($columnMeta['Field'])) {
- $form_params['field_orig[' . $columnNumber . ']']
- = $columnMeta['Field'];
- if (isset($columnMeta['column_status'])
- && !$columnMeta['column_status']['isEditable']
- ) {
- $form_params['field_name[' . $columnNumber . ']']
- = $columnMeta['Field'];
- }
- } else {
- $form_params['field_orig[' . $columnNumber . ']'] = '';
- }
- // old column type
- if (isset($columnMeta['Type'])) {
- // keep in uppercase because the new type will be in uppercase
- $form_params['field_type_orig[' . $columnNumber . ']'] = mb_strtoupper($type);
- if (isset($columnMeta['column_status'])
- && !$columnMeta['column_status']['isEditable']
- ) {
- $form_params['field_type[' . $columnNumber . ']'] = mb_strtoupper($type);
- }
- } else {
- $form_params['field_type_orig[' . $columnNumber . ']'] = '';
- }
- // old column length
- $form_params['field_length_orig[' . $columnNumber . ']'] = $length;
- // old column default
- $form_params = array_merge(
- $form_params,
- array(
- "field_default_value_orig[${columnNumber}]" => Util::getValueByKey(
- $columnMeta, 'Default', ''
- ),
- "field_default_type_orig[${columnNumber}]" => Util::getValueByKey(
- $columnMeta, 'DefaultType', ''
- ),
- "field_collation_orig[${columnNumber}]" => Util::getValueByKey(
- $columnMeta, 'Collation', ''
- ),
- "field_attribute_orig[${columnNumber}]" => trim(
- Util::getValueByKey($extracted_columnspec, 'attribute', '')
- ),
- "field_null_orig[${columnNumber}]" => Util::getValueByKey(
- $columnMeta, 'Null', ''
- ),
- "field_extra_orig[${columnNumber}]" => Util::getValueByKey(
- $columnMeta, 'Extra', ''
- ),
- "field_comments_orig[${columnNumber}]" => Util::getValueByKey(
- $columnMeta, 'Comment', ''
- ),
- "field_virtuality_orig[${columnNumber}]" => Util::getValueByKey(
- $columnMeta, 'Virtuality', ''
- ),
- "field_expression_orig[${columnNumber}]" => Util::getValueByKey(
- $columnMeta, 'Expression', ''
- ),
- )
- );
- }
- $content_cells[$columnNumber] = array(
- 'column_number' => $columnNumber,
- 'column_meta' => $columnMeta,
- 'type_upper' => mb_strtoupper($type),
- 'length_values_input_size' => $length_values_input_size,
- 'length' => $length,
- 'extracted_columnspec' => $extracted_columnspec,
- 'submit_attribute' => $submit_attribute,
- 'comments_map' => $comments_map,
- 'fields_meta' => isset($fields_meta) ? $fields_meta : null,
- 'is_backup' => $is_backup,
- 'move_columns' => $move_columns,
- 'cfg_relation' => $cfgRelation,
- 'available_mime' => $available_mime,
- 'mime_map' => isset($mime_map) ? $mime_map : array()
- );
- } // end for
- include 'libraries/tbl_partition_definition.inc.php';
- $html = Template::get('columns_definitions/column_definitions_form')->render([
- 'is_backup' => $is_backup,
- 'fields_meta' => isset($fields_meta) ? $fields_meta : null,
- 'mimework' => $cfgRelation['mimework'],
- 'action' => $action,
- 'form_params' => $form_params,
- 'content_cells' => $content_cells,
- 'partition_details' => $partitionDetails,
- 'primary_indexes' => isset($_POST['primary_indexes']) ? $_POST['primary_indexes'] : null,
- 'unique_indexes' => isset($_POST['unique_indexes']) ? $_POST['unique_indexes'] : null,
- 'indexes' => isset($_POST['indexes']) ? $_POST['indexes'] : null,
- 'fulltext_indexes' => isset($_POST['fulltext_indexes']) ? $_POST['fulltext_indexes'] : null,
- 'spatial_indexes' => isset($_POST['spatial_indexes']) ? $_POST['spatial_indexes'] : null,
- 'table' => isset($_POST['table']) ? $_POST['table'] : null,
- 'comment' => isset($_POST['comment']) ? $_POST['comment'] : null,
- 'tbl_collation' => isset($_POST['tbl_collation']) ? $_POST['tbl_collation'] : null,
- 'tbl_storage_engine' => isset($_POST['tbl_storage_engine']) ? $_POST['tbl_storage_engine'] : null,
- 'connection' => isset($_POST['connection']) ? $_POST['connection'] : null,
- 'change_column' => isset($_POST['change_column']) ? $_POST['change_column'] : null,
- 'is_virtual_columns_supported' => Util::isVirtualColumnsSupported(),
- 'browse_mime' => isset($GLOBALS['cfg']['BrowseMIME']) ? $GLOBALS['cfg']['BrowseMIME'] : null,
- 'server_type' => Util::getServerType(),
- 'max_rows' => intval($GLOBALS['cfg']['MaxRows']),
- 'char_editing' => isset($GLOBALS['cfg']['CharEditing']) ? $GLOBALS['cfg']['CharEditing'] : null,
- 'attribute_types' => $GLOBALS['dbi']->types->getAttributes(),
- 'privs_available' => ((isset($GLOBALS['col_priv']) ? $GLOBALS['col_priv'] : false)
- && (isset($GLOBALS['is_reload_priv']) ? $GLOBALS['is_reload_priv'] : false)
- ),
- 'max_length' => $GLOBALS['dbi']->getVersion() >= 50503 ? 1024 : 255,
- 'have_partitioning' => Partition::havePartitioning(),
- 'dbi' => $GLOBALS['dbi'],
- 'disable_is' => $GLOBALS['cfg']['Server']['DisableIS'],
- ]);
- unset($form_params);
- $response = Response::getInstance();
- $response->getHeader()->getScripts()->addFiles(
- array(
- 'vendor/jquery/jquery.uitablefilter.js',
- 'indexes.js'
- )
- );
- $response->addHTML($html);
|