diff options
Diffstat (limited to 'hugo/tbl_change.php')
| -rw-r--r-- | hugo/tbl_change.php | 437 |
1 files changed, 437 insertions, 0 deletions
diff --git a/hugo/tbl_change.php b/hugo/tbl_change.php new file mode 100644 index 0000000..795eaee --- /dev/null +++ b/hugo/tbl_change.php @@ -0,0 +1,437 @@ +<?php +/* vim: set expandtab sw=4 ts=4 sts=4: */ +/** + * Displays form for editing and inserting new table rows + * + * register_globals_save (mark this file save for disabling register globals) + * + * @package PhpMyAdmin + */ + +/** + * Gets the variables sent or posted to this script and displays the header + */ +require_once 'libraries/common.inc.php'; + +/** + * Ensures db and table are valid, else moves to the "parent" script + */ +require_once 'libraries/db_table_exists.lib.php'; + +/** + * functions implementation for this script + */ +require_once 'libraries/insert_edit.lib.php'; + +/** + * Sets global variables. + * Here it's better to use a if, instead of the '?' operator + * to avoid setting a variable to '' when it's not present in $_REQUEST + */ + +if (isset($_REQUEST['where_clause'])) { + $where_clause = $_REQUEST['where_clause']; +} +if (isset($_SESSION['edit_next'])) { + $where_clause = $_SESSION['edit_next']; + unset($_SESSION['edit_next']); + $after_insert = 'edit_next'; +} +if (isset($_REQUEST['ShowFunctionFields'])) { + $cfg['ShowFunctionFields'] = $_REQUEST['ShowFunctionFields']; +} +if (isset($_REQUEST['ShowFieldTypesInDataEditView'])) { + $cfg['ShowFieldTypesInDataEditView'] = $_REQUEST['ShowFieldTypesInDataEditView']; +} +if (isset($_REQUEST['after_insert'])) { + $after_insert = $_REQUEST['after_insert']; +} +/** + * file listing + */ +require_once 'libraries/file_listing.lib.php'; + + +/** + * Defines the url to return to in case of error in a sql statement + * (at this point, $GLOBALS['goto'] will be set but could be empty) + */ +if (empty($GLOBALS['goto'])) { + if (strlen($table)) { + // avoid a problem (see bug #2202709) + $GLOBALS['goto'] = 'tbl_sql.php'; + } else { + $GLOBALS['goto'] = 'db_sql.php'; + } +} +/** + * @todo check if we could replace by "db_|tbl_" - please clarify!? + */ +$_url_params = array( + 'db' => $db, + 'sql_query' => $_REQUEST['sql_query'] +); + +if (preg_match('@^tbl_@', $GLOBALS['goto'])) { + $_url_params['table'] = $table; +} + +$err_url = $GLOBALS['goto'] . PMA_generate_common_url($_url_params); +unset($_url_params); + + +/** + * Sets parameters for links + * where is this variable used? + * replace by PMA_generate_common_url($url_params); + */ +$url_query = PMA_generate_common_url($url_params, 'html', ''); + +/** + * get table information + * @todo should be done by a Table object + */ +require_once 'libraries/tbl_info.inc.php'; + +/** + * Get comments for table fileds/columns + */ +$comments_map = array(); + +if ($GLOBALS['cfg']['ShowPropertyComments']) { + $comments_map = PMA_getComments($db, $table); +} + +/** + * START REGULAR OUTPUT + */ + +/** + * Load JavaScript files + */ +$response = PMA_Response::getInstance(); +$header = $response->getHeader(); +$scripts = $header->getScripts(); +$scripts->addFile('functions.js'); +$scripts->addFile('tbl_change.js'); +$scripts->addFile('jquery/jquery-ui-timepicker-addon.js'); +$scripts->addFile('gis_data_editor.js'); + +/** + * Displays the query submitted and its result + * + * @todo where does $disp_message and $disp_query come from??? + */ +if (! empty($disp_message)) { + if (! isset($disp_query)) { + $disp_query = null; + } + $response->addHTML(PMA_Util::getMessage($disp_message, $disp_query)); +} + +/** + * Get the analysis of SHOW CREATE TABLE for this table + */ +$analyzed_sql = PMA_Table::analyzeStructure($db, $table); + +/** + * Get the list of the fields of the current table + */ +PMA_DBI_select_db($db); +$table_fields = array_values(PMA_DBI_get_columns($db, $table)); + +$paramTableDbArray = array($table, $db); + +/** + * Determine what to do, edit or insert? + */ +if (isset($where_clause)) { + // we are editing + $insert_mode = false; + $where_clause_array = PMA_getWhereClauseArray($where_clause); + list($where_clauses, $result, $rows, $found_unique_key) + = PMA_analyzeWhereClauses($where_clause_array, $table, $db); +} else { + // we are inserting + $insert_mode = true; + $where_clause = null; + list($result, $rows) = PMA_loadFirstRow($table, $db); + $where_clauses = null; + $where_clause_array = null; + $found_unique_key = false; +} + +// Copying a row - fetched data will be inserted as a new row, +// therefore the where clause is needless. +if (isset($_REQUEST['default_action']) && $_REQUEST['default_action'] === 'insert') { + $where_clause = $where_clauses = null; +} + +// retrieve keys into foreign fields, if any +$foreigners = PMA_getForeigners($db, $table); + +// Retrieve form parameters for insert/edit form +$_form_params = PMA_getFormParametersForInsertForm( + $db, $table, $where_clauses, $where_clause_array, $err_url +); + +/** + * Displays the form + */ +// autocomplete feature of IE kills the "onchange" event handler and it +// must be replaced by the "onpropertychange" one in this case +$chg_evt_handler = (PMA_USR_BROWSER_AGENT == 'IE' + && PMA_USR_BROWSER_VER >= 5 + && PMA_USR_BROWSER_VER < 7 +) + ? 'onpropertychange' + : 'onchange'; +// Had to put the URI because when hosted on an https server, +// some browsers send wrongly this form to the http server. + +$html_output = ''; +// Set if we passed the first timestamp field +$timestamp_seen = false; +$columns_cnt = count($table_fields); + +$tabindex = 0; +$tabindex_for_function = +3000; +$tabindex_for_null = +6000; +$tabindex_for_value = 0; +$o_rows = 0; +$biggest_max_file_size = 0; + +$url_params['db'] = $db; +$url_params['table'] = $table; +$url_params = PMA_urlParamsInEditMode( + $url_params, $where_clause_array, $where_clause +); + +//Insert/Edit form +//If table has blob fields we have to disable ajax. +$has_blob_field = false; +foreach ($table_fields as $column) { + if (PMA_isColumnBlob($column)) { + $has_blob_field = true; + break; + } +} +$html_output .='<form id="insertForm" '; +if ($has_blob_field && $is_upload) { + $html_output .='class="disableAjax" '; +} +$html_output .='method="post" action="tbl_replace.php" name="insertForm" '; +if ($is_upload) { + $html_output .= ' enctype="multipart/form-data"'; +} +$html_output .= '>'; +$html_output .= PMA_generate_common_hidden_inputs($_form_params); + +$titles['Browse'] = PMA_Util::getIcon('b_browse.png', __('Browse foreign values')); + +// user can toggle the display of Function column and column types +// (currently does not work for multi-edits) +if (! $cfg['ShowFunctionFields'] || ! $cfg['ShowFieldTypesInDataEditView']) { + $html_output .= __('Show'); +} + +if (! $cfg['ShowFunctionFields']) { + $html_output .= PMA_showFunctionFieldsInEditMode($url_params, false); +} + +if (! $cfg['ShowFieldTypesInDataEditView']) { + $html_output .= PMA_showColumnTypesInDataEditView($url_params, false); +} + +foreach ($rows as $row_id => $current_row) { + if ($current_row === false) { + unset($current_row); + } + + $jsvkey = $row_id; + $rownumber_param = '&rownumber=' . $row_id; + $vkey = '[multi_edit][' . $jsvkey . ']'; + + $current_result = (isset($result) && is_array($result) && isset($result[$row_id]) + ? $result[$row_id] + : $result); + if ($insert_mode && $row_id > 0) { + $html_output .= '<input type="checkbox" checked="checked"' + . ' name="insert_ignore_' . $row_id . '"' + . ' id="insert_ignore_' . $row_id . '" />' + .'<label for="insert_ignore_' . $row_id . '">' + . __('Ignore') + . '</label><br />' . "\n"; + } + + $html_output .= PMA_getHeadAndFootOfInsertRowTable($url_params) + . '<tbody>'; + + // Sets a multiplier used for input-field counts + // (as zero cannot be used, advance the counter plus one) + $m_rows = $o_rows + 1; + //store the default value for CharEditing + $default_char_editing = $cfg['CharEditing']; + + $odd_row = true; + for ($i = 0; $i < $columns_cnt; $i++) { + if (! isset($table_fields[$i]['processed'])) { + $column = $table_fields[$i]; + $column = PMA_analyzeTableColumnsArray( + $column, $comments_map, $timestamp_seen + ); + } + + $extracted_columnspec + = PMA_Util::extractColumnSpec($column['Type']); + + if (-1 === $column['len']) { + $column['len'] = PMA_DBI_field_len($current_result, $i); + // length is unknown for geometry fields, + // make enough space to edit very simple WKTs + if (-1 === $column['len']) { + $column['len'] = 30; + } + } + //Call validation when the form submited... + $unnullify_trigger = $chg_evt_handler + . "=\"return verificationsAfterFieldChange('" + . PMA_escapeJsString($column['Field_md5']) . "', '" + . PMA_escapeJsString($jsvkey) . "','".$column['pma_type'] . "')\""; + + // Use an MD5 as an array index to avoid having special characters + // in the name atttibute (see bug #1746964 ) + $column_name_appendix = $vkey . '[' . $column['Field_md5'] . ']'; + + if ($column['Type'] == 'datetime' + && ! isset($column['Default']) + && ! is_null($column['Default']) + && ($insert_mode || ! isset($current_row[$column['Field']])) + ) { + // INSERT case or + // UPDATE case with an NULL value + $current_row[$column['Field']] = date('Y-m-d H:i:s', time()); + } + + $html_output .= '<tr class="noclick ' . ($odd_row ? 'odd' : 'even' ) . '">' + . '<td ' . ($cfg['LongtextDoubleTextarea'] && strstr($column['True_Type'], 'longtext') ? 'rowspan="2"' : '') . 'class="center">' + . $column['Field_title'] + . '<input type="hidden" name="fields_name' . $column_name_appendix . '" value="' . $column['Field_html'] . '"/>' + . '</td>'; + if ($cfg['ShowFieldTypesInDataEditView']) { + $html_output .= '<td class="center' . $column['wrap'] . '">' + . '<span class="column_type">' . $column['pma_type'] . '</span>' + . '</td>'; + } //End if + + // Get a list of GIS data types. + $gis_data_types = PMA_Util::getGISDatatypes(); + + // Prepares the field value + $real_null_value = false; + $special_chars_encoded = ''; + if (isset($current_row)) { + // (we are editing) + list( + $real_null_value, $special_chars_encoded, $special_chars, + $data, $backup_field + ) + = PMA_getSpecialCharsAndBackupFieldForExistingRow( + $current_row, $column, $extracted_columnspec, + $real_null_value, $gis_data_types, $column_name_appendix + ); + } else { + // (we are inserting) + // display default values + list($real_null_value, $data, $special_chars, $backup_field, $special_chars_encoded) + = PMA_getSpecialCharsAndBackupFieldForInsertingMode($column, $real_null_value); + } + + $idindex = ($o_rows * $columns_cnt) + $i + 1; + $tabindex = $idindex; + + // Get a list of data types that are not yet supported. + $no_support_types = PMA_Util::unsupportedDatatypes(); + + // The function column + // ------------------- + if ($cfg['ShowFunctionFields']) { + $html_output .= PMA_getFunctionColumn( + $column, $is_upload, $column_name_appendix, + $unnullify_trigger, $no_support_types, $tabindex_for_function, + $tabindex, $idindex, $insert_mode + ); + } + + // The null column + // --------------- + $foreignData = PMA_getForeignData( + $foreigners, $column['Field'], false, '', '' + ); + $html_output .= PMA_getNullColumn( + $column, $column_name_appendix, $real_null_value, + $tabindex, $tabindex_for_null, $idindex, $vkey, $foreigners, + $foreignData + ); + + // The value column (depends on type) + // ---------------- + // See bug #1667887 for the reason why we don't use the maxlength + // HTML attribute + $html_output .= ' <td>' . "\n"; + // Will be used by js/tbl_change.js to set the default value + // for the "Continue insertion" feature + $html_output .= '<span class="default_value hide">' + . $special_chars . '</span>'; + + $html_output .= PMA_getValueColumn( + $column, $backup_field, $column_name_appendix, $unnullify_trigger, + $tabindex, $tabindex_for_value, $idindex, $data, $special_chars, + $foreignData, $odd_row, $paramTableDbArray, $rownumber_param, $titles, + $text_dir, $special_chars_encoded, $vkey, $is_upload, + $biggest_max_file_size, $default_char_editing, + $no_support_types, $gis_data_types, $extracted_columnspec + ); + + $html_output .= '</td>' + . '</tr>'; + + $odd_row = !$odd_row; + } // end for + $o_rows++; + $html_output .= ' </tbody>' + . '</table><br />'; +} // end foreach on multi-edit + +$html_output .='<div id="gis_editor"></div>' + . '<div id="popup_background"></div>' + . '<br />'; + +if (! isset($after_insert)) { + $after_insert = 'back'; +} + +//action panel +$html_output .= PMA_getActionsPanel( + $where_clause, $after_insert, $tabindex, + $tabindex_for_value, $found_unique_key +); + +if ($biggest_max_file_size > 0) { + $html_output .= ' ' + . PMA_Util::generateHiddenMaxFileSize( + $biggest_max_file_size + ) . "\n"; +} +$html_output .= '</form>'; +// end Insert/Edit form + +if ($insert_mode) { + //Continue insertion form + $html_output .= PMA_getContinueInsertionForm( + $table, $db, $where_clause_array, $err_url + ); +} +$response->addHTML($html_output); + +?> |
