~ubuntu-branches/ubuntu/trusty/phpmyadmin/trusty

« back to all changes in this revision

Viewing changes to tbl_alter.php

  • Committer: Bazaar Package Importer
  • Author(s): Thijs Kinkhorst
  • Date: 2009-02-16 17:58:28 UTC
  • mfrom: (13.1.4 jaunty)
  • Revision ID: james.westby@ubuntu.com-20090216175828-d2dllrukk9kecv4k
Tags: 4:3.1.2-2
* Upload to unstable.
* [INTL:es] Spanish debconf template update (Closes: #513690).

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
<?php
2
2
/* vim: set expandtab sw=4 ts=4 sts=4: */
3
3
/**
4
 
 *
5
 
 * @version $Id: tbl_alter.php 10240 2007-04-01 11:02:46Z cybot_tm $
 
4
 * Alter one or more table columns/fields
 
5
 *
 
6
 * linked from table_structure, uses libraries/tbl_properties.inc.php to display
 
7
 * form and handles this form data
 
8
 *
 
9
 * @version $Id: tbl_alter.php 11242 2008-05-07 12:44:28Z cybot_tm $
6
10
 */
7
11
 
8
12
/**
11
15
require_once './libraries/common.inc.php';
12
16
require_once './libraries/Table.class.php';
13
17
 
14
 
$js_to_run = 'functions.js';
 
18
$GLOBALS['js_include'][] = 'functions.js';
15
19
require_once './libraries/header.inc.php';
16
20
 
17
21
// Check parameters
22
26
 */
23
27
require_once './libraries/tbl_common.php';
24
28
require_once './libraries/tbl_info.inc.php';
25
 
/**
26
 
 * Displays top menu links
27
 
 */
 
29
 
28
30
$active_page = 'tbl_structure.php';
29
 
// I don't see the need to display the links here, they will be displayed later
30
 
//require './libraries/tbl_links.inc.php';
31
 
 
32
31
 
33
32
/**
34
33
 * Defines the url to return to in case of error in a sql statement
40
39
 * Modifications have been submitted -> updates the table
41
40
 */
42
41
$abort = false;
43
 
if (isset($do_save_data)) {
44
 
    $field_cnt = count($field_orig);
 
42
if (isset($_REQUEST['do_save_data'])) {
 
43
    $field_cnt = count($_REQUEST['field_orig']);
 
44
    $key_fields = array();
 
45
    $changes = array();
 
46
    
45
47
    for ($i = 0; $i < $field_cnt; $i++) {
46
 
        // to "&quot;" in tbl_sql.php
47
 
        $field_orig[$i]     = urldecode($field_orig[$i]);
48
 
        if (strcmp(str_replace('"', '&quot;', $field_orig[$i]), $field_name[$i]) == 0) {
49
 
            $field_name[$i] = $field_orig[$i];
50
 
        }
51
 
        $field_default_orig[$i] = urldecode($field_default_orig[$i]);
52
 
        if (strcmp(str_replace('"', '&quot;', $field_default_orig[$i]), $field_default[$i]) == 0) {
53
 
            $field_default[$i]  = $field_default_orig[$i];
54
 
        }
55
 
        $field_length_orig[$i] = urldecode($field_length_orig[$i]);
56
 
        if (strcmp(str_replace('"', '&quot;', $field_length_orig[$i]), $field_length[$i]) == 0) {
57
 
            $field_length[$i] = $field_length_orig[$i];
58
 
        }
59
 
        if (!isset($query)) {
60
 
            $query = '';
61
 
        } else {
62
 
            $query .= ', CHANGE ';
63
 
        }
64
 
 
65
 
        $query .= PMA_Table::generateAlter($field_orig[$i], $field_name[$i], $field_type[$i], $field_length[$i], $field_attribute[$i], isset($field_collation[$i]) ? $field_collation[$i] : '', $field_null[$i], $field_default[$i], isset($field_default_current_timestamp[$i]), $field_extra[$i], (isset($field_comments[$i]) ? $field_comments[$i] : ''), $field_default_orig[$i]);
 
48
        $changes[] = 'CHANGE ' . PMA_Table::generateAlter(
 
49
            $_REQUEST['field_orig'][$i], 
 
50
            $_REQUEST['field_name'][$i],
 
51
            $_REQUEST['field_type'][$i], 
 
52
            $_REQUEST['field_length'][$i], 
 
53
            $_REQUEST['field_attribute'][$i],
 
54
            isset($_REQUEST['field_collation'][$i]) 
 
55
                ? $_REQUEST['field_collation'][$i] 
 
56
                : '',
 
57
            isset($_REQUEST['field_null'][$i]) 
 
58
                ? $_REQUEST['field_null'][$i] 
 
59
                : 'NOT NULL',
 
60
            $_REQUEST['field_default_type'][$i], 
 
61
            $_REQUEST['field_default_value'][$i],
 
62
            isset($_REQUEST['field_extra'][$i])
 
63
                ? $_REQUEST['field_extra'][$i]
 
64
                : false,
 
65
            isset($_REQUEST['field_comments'][$i]) 
 
66
                ? $_REQUEST['field_comments'][$i] 
 
67
                : '',
 
68
            $key_fields,
 
69
            $i,
 
70
            $_REQUEST['field_default_orig'][$i]
 
71
        );
66
72
    } // end for
67
73
 
 
74
    // Builds the primary keys statements and updates the table
 
75
    $key_query = '';
 
76
    /**
 
77
     * this is a little bit more complex
 
78
     * 
 
79
     * @todo if someone selects A_I when altering a column we need to check:
 
80
     *  - no other column with A_I
 
81
     *  - the column has an index, if not create one
 
82
     *
 
83
    if (count($key_fields)) {
 
84
        $fields = array();
 
85
        foreach ($key_fields as $each_field) {
 
86
            if (isset($_REQUEST['field_name'][$each_field]) && strlen($_REQUEST['field_name'][$each_field])) {
 
87
                $fields[] = PMA_backquote($_REQUEST['field_name'][$each_field]);
 
88
            }
 
89
        } // end for
 
90
        $key_query = ', ADD KEY (' . implode(', ', $fields) . ') ';
 
91
    }
 
92
     */
 
93
    
68
94
    // To allow replication, we first select the db to use and then run queries
69
95
    // on this db.
70
 
     PMA_DBI_select_db($db) or PMA_mysqlDie(PMA_DBI_getError(), 'USE ' . PMA_backquote($db) . ';', '', $err_url);
 
96
    PMA_DBI_select_db($db) or PMA_mysqlDie(PMA_DBI_getError(), 'USE ' . PMA_backquote($db) . ';', '', $err_url);
71
97
    // Optimization fix - 2 May 2001 - Robbat2
72
 
    $sql_query = 'ALTER TABLE ' . PMA_backquote($table) . ' CHANGE ' . $query;
73
 
    $error_create = FALSE;
74
 
    $result    = PMA_DBI_try_query($sql_query) or $error_create = TRUE;
 
98
    $sql_query = 'ALTER TABLE ' . PMA_backquote($table) . ' ' . implode(', ', $changes) . $key_query;
 
99
    $result    = PMA_DBI_try_query($sql_query);
75
100
 
76
 
    if ($error_create == FALSE) {
77
 
        $message   = $strTable . ' ' . htmlspecialchars($table) . ' ' . $strHasBeenAltered;
78
 
        $btnDrop   = 'Fake';
 
101
    if ($result !== false) {
 
102
        $message = PMA_Message::success('strTableAlteredSuccessfully');
 
103
        $message->addParam($table);
 
104
        $btnDrop = 'Fake';
79
105
 
80
106
        // garvin: If comments were sent, enable relation stuff
81
107
        require_once './libraries/relation.lib.php';
82
108
        require_once './libraries/transformations.lib.php';
83
109
 
84
 
        $cfgRelation = PMA_getRelationsParam();
85
 
 
86
 
        // take care of pmadb internal comments here
87
 
        // garvin: Update comment table, if a comment was set.
88
 
        if (PMA_MYSQL_INT_VERSION < 40100 && isset($field_comments) && is_array($field_comments) && $cfgRelation['commwork']) {
89
 
            foreach ($field_comments AS $fieldindex => $fieldcomment) {
90
 
                if (isset($field_name[$fieldindex]) && strlen($field_name[$fieldindex])) {
91
 
                    PMA_setComment($db, $table, $field_name[$fieldindex], $fieldcomment, $field_orig[$fieldindex], 'pmadb');
 
110
        // updaet field names in relation
 
111
        if (isset($_REQUEST['field_orig']) && is_array($_REQUEST['field_orig'])) {
 
112
            foreach ($_REQUEST['field_orig'] as $fieldindex => $fieldcontent) {
 
113
                if ($_REQUEST['field_name'][$fieldindex] != $fieldcontent) {
 
114
                    PMA_REL_renameField($db, $table, $fieldcontent, 
 
115
                        $_REQUEST['field_name'][$fieldindex]);
92
116
                }
93
117
            }
94
118
        }
95
119
 
96
 
        // garvin: Rename relations&display fields, if altered.
97
 
        if (($cfgRelation['displaywork'] || $cfgRelation['relwork']) && isset($field_orig) && is_array($field_orig)) {
98
 
            foreach ($field_orig AS $fieldindex => $fieldcontent) {
99
 
                if ($field_name[$fieldindex] != $fieldcontent) {
100
 
                    if ($cfgRelation['displaywork']) {
101
 
                        $table_query = 'UPDATE ' . PMA_backquote($GLOBALS['cfgRelation']['db']) . '.' . PMA_backquote($cfgRelation['table_info'])
102
 
                                      . ' SET     display_field = \'' . PMA_sqlAddslashes($field_name[$fieldindex]) . '\''
103
 
                                      . ' WHERE db_name  = \'' . PMA_sqlAddslashes($db) . '\''
104
 
                                      . ' AND table_name = \'' . PMA_sqlAddslashes($table) . '\''
105
 
                                      . ' AND display_field = \'' . PMA_sqlAddslashes($fieldcontent) . '\'';
106
 
                        $tb_rs    = PMA_query_as_cu($table_query);
107
 
                        unset($table_query);
108
 
                        unset($tb_rs);
109
 
                    }
110
 
 
111
 
                    if ($cfgRelation['relwork']) {
112
 
                        $table_query = 'UPDATE ' . PMA_backquote($GLOBALS['cfgRelation']['db']) . '.' . PMA_backquote($cfgRelation['relation'])
113
 
                                      . ' SET     master_field = \'' . PMA_sqlAddslashes($field_name[$fieldindex]) . '\''
114
 
                                      . ' WHERE master_db  = \'' . PMA_sqlAddslashes($db) . '\''
115
 
                                      . ' AND master_table = \'' . PMA_sqlAddslashes($table) . '\''
116
 
                                      . ' AND master_field = \'' . PMA_sqlAddslashes($fieldcontent) . '\'';
117
 
                        $tb_rs    = PMA_query_as_cu($table_query);
118
 
                        unset($table_query);
119
 
                        unset($tb_rs);
120
 
 
121
 
                        $table_query = 'UPDATE ' . PMA_backquote($GLOBALS['cfgRelation']['db']) . '.' . PMA_backquote($cfgRelation['relation'])
122
 
                                      . ' SET     foreign_field = \'' . PMA_sqlAddslashes($field_name[$fieldindex]) . '\''
123
 
                                      . ' WHERE foreign_db  = \'' . PMA_sqlAddslashes($db) . '\''
124
 
                                      . ' AND foreign_table = \'' . PMA_sqlAddslashes($table) . '\''
125
 
                                      . ' AND foreign_field = \'' . PMA_sqlAddslashes($fieldcontent) . '\'';
126
 
                        $tb_rs    = PMA_query_as_cu($table_query);
127
 
                        unset($table_query);
128
 
                        unset($tb_rs);
129
 
                    } // end if relwork
130
 
                } // end if fieldname has changed
131
 
            } // end while check fieldnames
132
 
        } // end if relations/display has to be changed
133
 
 
134
 
        // garvin: Update comment table for mime types [MIME]
135
 
        if (isset($field_mimetype) && is_array($field_mimetype) && $cfgRelation['commwork'] && $cfgRelation['mimework'] && $cfg['BrowseMIME']) {
136
 
            foreach ($field_mimetype AS $fieldindex => $mimetype) {
137
 
                if (isset($field_name[$fieldindex]) && strlen($field_name[$fieldindex])) {
138
 
                    PMA_setMIME($db, $table, $field_name[$fieldindex], $mimetype, $field_transformation[$fieldindex], $field_transformation_options[$fieldindex]);
 
120
        // update mime types
 
121
        if (isset($_REQUEST['field_mimetype'])
 
122
         && is_array($_REQUEST['field_mimetype']) 
 
123
         && $cfg['BrowseMIME']) {
 
124
            foreach ($_REQUEST['field_mimetype'] as $fieldindex => $mimetype) {
 
125
                if (isset($_REQUEST['field_name'][$fieldindex])
 
126
                 && strlen($_REQUEST['field_name'][$fieldindex])) {
 
127
                    PMA_setMIME($db, $table, $_REQUEST['field_name'][$fieldindex], 
 
128
                        $mimetype, 
 
129
                        $_REQUEST['field_transformation'][$fieldindex], 
 
130
                        $_REQUEST['field_transformation_options'][$fieldindex]);
139
131
                }
140
132
            }
141
133
        }
143
135
        $active_page = 'tbl_structure.php';
144
136
        require './tbl_structure.php';
145
137
    } else {
146
 
        PMA_mysqlDie('', '', '', $err_url, FALSE);
 
138
        PMA_mysqlDie('', '', '', $err_url, false);
147
139
        // garvin: An error happened while inserting/updating a table definition.
148
140
        // to prevent total loss of that data, we embed the form once again.
149
141
        // The variable $regenerate will be used to restore data in libraries/tbl_properties.inc.php
150
 
        if (isset($orig_field)) {
151
 
                $field = $orig_field;
 
142
        if (isset($_REQUEST['orig_field'])) {
 
143
            $_REQUEST['field'] = $_REQUEST['orig_field'];
152
144
        }
153
145
 
154
146
        $regenerate = true;
157
149
 
158
150
/**
159
151
 * No modifications yet required -> displays the table fields
 
152
 * 
 
153
 * $selected comes from multi_submits.inc.php
160
154
 */
161
 
if ($abort == FALSE) {
162
 
    if (!isset($selected)) {
 
155
if ($abort == false) {
 
156
    if (! isset($selected)) {
163
157
        PMA_checkParameters(array('field'));
164
 
        $selected[]   = $field;
 
158
        $selected[]   = $_REQUEST['field'];
165
159
        $selected_cnt = 1;
166
160
    } else { // from a multiple submit
167
161
        $selected_cnt = count($selected);
171
165
     * @todo optimize in case of multiple fields to modify
172
166
     */
173
167
    for ($i = 0; $i < $selected_cnt; $i++) {
174
 
        if (!empty($submit_mult)) {
175
 
            $field = PMA_sqlAddslashes(urldecode($selected[$i]), TRUE);
176
 
        } else {
177
 
            $field = PMA_sqlAddslashes($selected[$i], TRUE);
178
 
        }
179
 
        $result        = PMA_DBI_query('SHOW FULL FIELDS FROM ' . PMA_backquote($table) . ' FROM ' . PMA_backquote($db) . ' LIKE \'' . $field . '\';');
 
168
        $_REQUEST['field'] = PMA_sqlAddslashes($selected[$i], true);
 
169
        $result        = PMA_DBI_query('SHOW FULL FIELDS FROM ' . PMA_backquote($table) . ' FROM ' . PMA_backquote($db) . ' LIKE \'' . $_REQUEST['field'] . '\';');
180
170
        $fields_meta[] = PMA_DBI_fetch_assoc($result);
181
171
        PMA_DBI_free_result($result);
182
172
    }
193
183
     * or maybe make it part of PMA_DBI_get_fields();
194
184
     */
195
185
 
196
 
    // We also need this to correctly learn if a TIMESTAMP is NOT NULL, since
197
 
    // SHOW FULL FIELDS says NULL and SHOW CREATE TABLE says NOT NULL (tested
198
 
    // in MySQL 4.0.25).
 
186
    if (PMA_MYSQL_INT_VERSION < 50025) {
 
187
        // We also need this to correctly learn if a TIMESTAMP is NOT NULL, since
 
188
        // SHOW FULL FIELDS says NULL and SHOW CREATE TABLE says NOT NULL (tested
 
189
        // in MySQL 4.0.25).
199
190
 
200
 
    $show_create_table = PMA_DBI_fetch_value(
201
 
        'SHOW CREATE TABLE ' . PMA_backquote($db) . '.' . PMA_backquote($table),
202
 
        0, 1);
203
 
    $analyzed_sql = PMA_SQP_analyze(PMA_SQP_parse($show_create_table));
 
191
        $show_create_table = PMA_DBI_fetch_value(
 
192
            'SHOW CREATE TABLE ' . PMA_backquote($db) . '.' . PMA_backquote($table),
 
193
            0, 1);
 
194
        $analyzed_sql = PMA_SQP_analyze(PMA_SQP_parse($show_create_table));
 
195
    }
204
196
 
205
197
    require './libraries/tbl_properties.inc.php';
206
198
}