echo '<th width="40">', __('Null'), '</th>'; echo '<th width="70">', __('Default'), '</th>'; if ($have_rel) { echo ' <th>', __('Links to'), '</th>', "\n"; } echo ' <th>', __('Comments'), '</th>', "\n"; if ($cfgRelation['mimework']) { echo ' <th>MIME</th>', "\n"; } echo '</tr>'; $odd_row = true; foreach ($columns as $row) { if ($row['Null'] == '') { $row['Null'] = 'NO'; } $extracted_columnspec = PMA\libraries\Util::extractColumnSpec($row['Type']); // reformat mysql query output // set or enum types: slashes single quotes inside options $type = htmlspecialchars($extracted_columnspec['print_type']); $attribute = $extracted_columnspec['attribute']; if (!isset($row['Default'])) { if ($row['Null'] != 'NO') { $row['Default'] = '<i>NULL</i>'; } } else { $row['Default'] = htmlspecialchars($row['Default']); } $column_name = $row['Field']; echo '<tr class="'; echo $odd_row ? 'odd' : 'even'; $odd_row = !$odd_row;
/** * Function to get html for field * * @param int $index index * @param array $field field * @param string $style style * * @return string */ function PMA_getHtmlForField($index, $field, $style) { $html = '<tr class="noclick ' . $style . '">'; $html .= '<td>' . $index . '</td>'; $html .= '<td><b>' . htmlspecialchars($field['Field']); if ($field['Key'] == 'PRI') { $html .= ' ' . PMA\libraries\Util::getImage('b_primary.png', __('Primary')); } elseif (!empty($field['Key'])) { $html .= ' ' . PMA\libraries\Util::getImage('bd_primary.png', __('Index')); } $html .= '</b></td>'; $html .= "\n"; $html .= '<td>' . htmlspecialchars($field['Type']) . '</td>'; $html .= '<td>' . htmlspecialchars($field['Collation']) . '</td>'; $html .= '<td>' . ($field['Null'] == 'YES' ? __('Yes') : __('No')) . '</td>'; $html .= '<td>'; if (isset($field['Default'])) { $extracted_columnspec = PMA\libraries\Util::extractColumnSpec($field['Type']); if ($extracted_columnspec['type'] == 'bit') { // here, $field['Default'] contains something like b'010' $html .= PMA\libraries\Util::convertBitDefaultValue($field['Default']); } else { $html .= htmlspecialchars($field['Default']); } } else { if ($field['Null'] == 'YES') { $html .= '<i>NULL</i>'; } else { $html .= '<i>' . _pgettext('None for default', 'None') . '</i>'; } } $html .= '</td>'; $html .= '<td>' . htmlspecialchars($field['Extra']) . '</td>'; $html .= '<td>' . htmlspecialchars($field['Comment']) . '</td>'; $html .= '</tr>'; return $html; }
/** * Function to get html for each insert/edit column * * @param array $table_columns table columns * @param int $column_number column index in table_columns * @param array $comments_map comments map * @param bool $timestamp_seen whether timestamp seen * @param array $current_result current result * @param string $chg_evt_handler javascript change event handler * @param string $jsvkey javascript validation key * @param string $vkey validation key * @param bool $insert_mode whether insert mode * @param array $current_row current row * @param bool $odd_row whether odd row * @param int &$o_rows row offset * @param int &$tabindex tab index * @param int $columns_cnt columns count * @param bool $is_upload whether upload * @param int $tabindex_for_function tab index offset for function * @param array $foreigners foreigners * @param int $tabindex_for_null tab index offset for null * @param int $tabindex_for_value tab index offset for value * @param string $table table * @param string $db database * @param int $row_id row id * @param array $titles titles * @param int $biggest_max_file_size biggest max file size * @param string $default_char_editing default char editing mode which is stored * in the config.inc.php script * @param string $text_dir text direction * @param array $repopulate the data to be repopulated * @param array $column_mime the mime information of column * @param string $where_clause the where clause * * @return string */ function PMA_getHtmlForInsertEditFormColumn($table_columns, $column_number, $comments_map, $timestamp_seen, $current_result, $chg_evt_handler, $jsvkey, $vkey, $insert_mode, $current_row, $odd_row, &$o_rows, &$tabindex, $columns_cnt, $is_upload, $tabindex_for_function, $foreigners, $tabindex_for_null, $tabindex_for_value, $table, $db, $row_id, $titles, $biggest_max_file_size, $default_char_editing, $text_dir, $repopulate, $column_mime, $where_clause) { $column = $table_columns[$column_number]; if (!isset($column['processed'])) { $column = PMA_analyzeTableColumnsArray($column, $comments_map, $timestamp_seen); } $as_is = false; if (!empty($repopulate) && !empty($current_row)) { $current_row[$column['Field']] = $repopulate[$column['Field_md5']]; $as_is = true; } $extracted_columnspec = PMA\libraries\Util::extractColumnSpec($column['Type']); if (-1 === $column['len']) { $column['len'] = $GLOBALS['dbi']->fieldLen($current_result, $column_number); // 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 submitted... $onChangeClause = $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 attribute (see bug #1746964 ) $column_name_appendix = $vkey . '[' . $column['Field_md5'] . ']'; if ($column['Type'] === 'datetime' && !isset($column['Default']) && !is_null($column['Default']) && $insert_mode) { $column['Default'] = date('Y-m-d H:i:s', time()); } $html_output = PMA_getHtmlForFunctionOption($odd_row, $column, $column_name_appendix); if ($GLOBALS['cfg']['ShowFieldTypesInDataEditView']) { $html_output .= PMA_getHtmlForInsertEditColumnType($column); } //End if // Get a list of GIS data types. $gis_data_types = PMA\libraries\Util::getGISDatatypes(); // Prepares the field value $real_null_value = false; $special_chars_encoded = ''; if (!empty($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, $as_is); } else { // (we are inserting) // display default values $tmp = $column; if (isset($repopulate[$column['Field_md5']])) { $tmp['Default'] = $repopulate[$column['Field_md5']]; } list($real_null_value, $data, $special_chars, $backup_field, $special_chars_encoded) = PMA_getSpecialCharsAndBackupFieldForInsertingMode($tmp, $real_null_value); unset($tmp); } $idindex = $o_rows * $columns_cnt + $column_number + 1; $tabindex = $idindex; // Get a list of data types that are not yet supported. $no_support_types = PMA\libraries\Util::unsupportedDatatypes(); // The function column // ------------------- if ($GLOBALS['cfg']['ShowFunctionFields']) { $html_output .= PMA_getFunctionColumn($column, $is_upload, $column_name_appendix, $onChangeClause, $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 //add data attributes "no of decimals" and "data type" $no_decimals = 0; $type = current(explode("(", $column['pma_type'])); if (preg_match('/\\(([^()]+)\\)/', $column['pma_type'], $match)) { $match[0] = trim($match[0], '()'); $no_decimals = $match[0]; } $html_output .= '<td' . ' data-type="' . $type . '"' . ' data-decimals="' . $no_decimals . '">' . "\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>'; // Check input transformation of column $transformed_html = ''; if (!empty($column_mime['input_transformation'])) { $file = $column_mime['input_transformation']; $include_file = 'libraries/plugins/transformations/' . $file; if (is_file($include_file)) { include_once $include_file; $class_name = PMA_getTransformationClassName($include_file); $transformation_plugin = new $class_name(); $transformation_options = PMA_Transformation_getOptions($column_mime['input_transformation_options']); $_url_params = array('db' => $db, 'table' => $table, 'transform_key' => $column['Field'], 'where_clause' => $where_clause); $transformation_options['wrapper_link'] = PMA_URL_getCommon($_url_params); $current_value = ''; if (isset($current_row[$column['Field']])) { $current_value = $current_row[$column['Field']]; } if (method_exists($transformation_plugin, 'getInputHtml')) { $transformed_html = $transformation_plugin->getInputHtml($column, $row_id, $column_name_appendix, $transformation_options, $current_value, $text_dir, $tabindex, $tabindex_for_value, $idindex); } if (method_exists($transformation_plugin, 'getScripts')) { $GLOBALS['plugin_scripts'] = array_merge($GLOBALS['plugin_scripts'], $transformation_plugin->getScripts()); } } } if (!empty($transformed_html)) { $html_output .= $transformed_html; } else { $html_output .= PMA_getValueColumn($column, $backup_field, $column_name_appendix, $onChangeClause, $tabindex, $tabindex_for_value, $idindex, $data, $special_chars, $foreignData, $odd_row, array($table, $db), $row_id, $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>'; return $html_output; }
/** * Test case for parsing SHOW COLUMNS output * * @param string $in Column specification * @param array $out Expected value * * @return void * * @dataProvider provider */ public function testParsing($in, $out) { $this->assertEquals($out, PMA\libraries\Util::extractColumnSpec($in)); }