Beispiel #1
0
/**
 * Function to get the default sql query for browsing page
 *
 * @param String $db    the current database
 * @param String $table the current table
 *
 * @return String $sql_query the default $sql_query for browse page
 */
function PMA_getDefaultSqlQueryForBrowse($db, $table)
{
    include_once 'libraries/bookmark.lib.php';
    $book_sql_query = PMA_Bookmark_get($db, '\'' . PMA_Util::sqlAddSlashes($table) . '\'', 'label', false, true);
    if (!empty($book_sql_query)) {
        $GLOBALS['using_bookmark_message'] = PMA_message::notice(__('Using bookmark "%s" as default browse query.'));
        $GLOBALS['using_bookmark_message']->addParam($table);
        $GLOBALS['using_bookmark_message']->addMessage(PMA_Util::showDocu('faq', 'faq6-22'));
        $sql_query = $book_sql_query;
    } else {
        $defaultOrderByClause = '';
        if (isset($GLOBALS['cfg']['TablePrimaryKeyOrder']) && $GLOBALS['cfg']['TablePrimaryKeyOrder'] !== 'NONE') {
            $primaryKey = null;
            $primary = PMA_Index::getPrimary($table, $db);
            if ($primary !== false) {
                $primarycols = $primary->getColumns();
                foreach ($primarycols as $col) {
                    $primaryKey = $col->getName();
                    break;
                }
                if ($primaryKey != null) {
                    $defaultOrderByClause = ' ORDER BY ' . PMA_Util::backquote($table) . '.' . PMA_Util::backquote($primaryKey) . ' ' . $GLOBALS['cfg']['TablePrimaryKeyOrder'];
                }
            }
        }
        $sql_query = 'SELECT * FROM ' . PMA_Util::backquote($table) . $defaultOrderByClause;
    }
    unset($book_sql_query);
    return $sql_query;
}
/**
 * return html for Print View Columns
 *
 * @param bool   $tbl_is_view  whether table is a view
 * @param array  $columns      columns list
 * @param array  $analyzed_sql analyzed sql
 * @param bool   $have_rel     have relation?
 * @param array  $res_rel      relations array
 * @param string $db           database name
 * @param string $table        table name
 * @param array  $cfgRelation  config from PMA_getRelationsParam
 *
 * @return string
 */
function PMA_getHtmlForPrintViewColumns($tbl_is_view, $columns, $analyzed_sql, $have_rel, $res_rel, $db, $table, $cfgRelation)
{
    $html = '';
    $primary = PMA_Index::getPrimary($table, $db);
    foreach ($columns as $row) {
        $extracted_columnspec = PMA_Util::extractColumnSpec($row['Type']);
        $type = $extracted_columnspec['print_type'];
        if (!isset($row['Default'])) {
            if ($row['Null'] != '' && $row['Null'] != 'NO') {
                $row['Default'] = '<i>NULL</i>';
            }
        } else {
            $row['Default'] = htmlspecialchars($row['Default']);
        }
        $field_name = htmlspecialchars($row['Field']);
        if (!$tbl_is_view) {
            // here, we have a TIMESTAMP that SHOW FULL COLUMNS reports as having
            // the NULL attribute, but SHOW CREATE TABLE says the contrary.
            // Believe the latter.
            /**
             * @todo merge this logic with the one in tbl_structure.php
             * or move it in a function similar to $GLOBALS['dbi']->getColumnsFull()
             * but based on SHOW CREATE TABLE because information_schema
             * cannot be trusted in this case (MySQL bug)
             */
            $analyzed_for_field = $analyzed_sql[0]['create_table_fields'][$field_name];
            if (!empty($analyzed_for_field['type']) && $analyzed_for_field['type'] == 'TIMESTAMP' && $analyzed_for_field['timestamp_not_null']) {
                $row['Null'] = '';
            }
        }
        $html .= "\n";
        $html .= '<tr><td>';
        $html .= '    ' . $field_name . "\n";
        if ($primary && $primary->hasColumn($field_name)) {
            $html .= '    <em>(' . __('Primary') . ')</em>';
        }
        $html .= "\n";
        $html .= '</td>';
        $html .= '<td>' . htmlspecialchars($type) . '<bdo dir="ltr"></bdo></td>';
        $html .= '<td>';
        $html .= $row['Null'] == '' || $row['Null'] == 'NO' ? __('No') : __('Yes');
        $html .= '&nbsp;</td>';
        $html .= '<td>';
        if (isset($row['Default'])) {
            $html .= $row['Default'];
        }
        $html .= '&nbsp;</td>';
        if ($have_rel) {
            $html .= '    <td>';
            $foreigner = PMA_searchColumnInForeigners($res_rel, $field_name);
            if ($foreigner) {
                $html .= htmlspecialchars($foreigner['foreign_table'] . ' -> ' . $foreigner['foreign_field']);
            }
            $html .= '&nbsp;</td>' . "\n";
        }
        $html .= '    <td>';
        $comments = PMA_getComments($db, $table);
        if (isset($comments[$field_name])) {
            $html .= htmlspecialchars($comments[$field_name]);
        }
        $html .= '&nbsp;</td>' . "\n";
        if ($cfgRelation['mimework']) {
            $mime_map = PMA_getMIME($db, $table, true);
            $html .= '    <td>';
            if (isset($mime_map[$field_name])) {
                $html .= htmlspecialchars(str_replace('_', '/', $mime_map[$field_name]['mimetype']));
            }
            $html .= '&nbsp;</td>' . "\n";
        }
        $html .= '</tr>';
    }
    // end foreach
    return $html;
}
Beispiel #3
0
$url_params['back'] = 'tbl_structure.php';
/**
 * Prepares the table structure display
 */
/**
 * Gets tables informations
 */
require_once './libraries/tbl_info.inc.php';
/**
 * Displays top menu links
 */
require_once './libraries/tbl_links.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);
// 3. Get fields
$fields_rs = PMA_DBI_query('SHOW FULL FIELDS FROM ' . PMA_backquote($table) . ';', null, PMA_DBI_QUERY_STORE);
$fields_cnt = PMA_DBI_num_rows($fields_rs);
// 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 FIELDS FROM.
//
// We also need this to correctly learn if a TIMESTAMP is NOT NULL, since
// SHOW FULL FIELDS 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 = PMA_DBI_fetch_value('SHOW CREATE TABLE ' . PMA_backquote($db) . '.' . PMA_backquote($table), 0, 1);
$analyzed_sql = PMA_SQP_analyze(PMA_SQP_parse($show_create_table));
/**
 * Function to send html for column dropdown list
 *
 * @return void
 */
function PMA_sendHtmlForColumnDropdownList()
{
    $response = PMA_Response::getInstance();
    $foreignTable = $_REQUEST['foreignTable'];
    $table_obj = new PMA_Table($foreignTable, $_REQUEST['foreignDb']);
    // Since views do not have keys defined on them provide the full list of columns
    if (PMA_Table::isView($_REQUEST['foreignDb'], $foreignTable)) {
        $columnList = $table_obj->getColumns(false, false);
    } else {
        $columnList = $table_obj->getIndexedColumns(false, false);
    }
    $columns = array();
    foreach ($columnList as $column) {
        $columns[] = htmlspecialchars($column);
    }
    $response->addJSON('columns', $columns);
    // @todo should be: $server->db($db)->table($table)->primary()
    $primary = PMA_Index::getPrimary($foreignTable, $_REQUEST['foreignDb']);
    if (false === $primary) {
        return;
    }
    $primarycols = array_keys($primary->getColumns());
    $response->addJSON('primary', $primarycols);
}
 public function generateIndexSelector()
 {
     $html_options = '';
     foreach (PMA_Index::getIndexChoices() as $each_index_choice) {
         if ($each_index_choice === 'PRIMARY' && $this->_choice !== 'PRIMARY' && PMA_Index::getPrimary($this->_table, $this->_schema)) {
             // skip PRIMARY if there is already one in the table
             continue;
         }
         $html_options .= '<option value="' . $each_index_choice . '"' . ($this->_choice == $each_index_choice ? ' selected="selected"' : '') . '>' . $each_index_choice . '</option>' . "\n";
     }
     return $html_options;
 }
/**
 * find all the possible partial dependencies based on data in the table.
 *
 * @param string $table current table
 * @param string $db    current database
 *
 * @return HTML containing the list of all the possible partial dependencies
 */
function PMA_findPartialDependencies($table, $db)
{
    $dependencyList = array();
    $GLOBALS['dbi']->selectDb($db, $GLOBALS['userlink']);
    $columns = (array) $GLOBALS['dbi']->getColumnNames($db, $table, $GLOBALS['userlink']);
    $columns = (array) PMA_Util::backquote($columns);
    $totalRowsRes = $GLOBALS['dbi']->fetchResult('SELECT COUNT(*) FROM (SELECT * FROM ' . PMA_Util::backquote($table) . ' LIMIT 500) as dt;');
    $totalRows = $totalRowsRes[0];
    $primary = PMA_Index::getPrimary($table, $db);
    $primarycols = $primary->getColumns();
    $pk = array();
    foreach ($primarycols as $col) {
        $pk[] = PMA_Util::backquote($col->getName());
    }
    $partialKeys = PMA_getAllCombinationPartialKeys($pk);
    $distinctValCount = PMA_findDistinctValuesCount(array_unique(array_merge($columns, $partialKeys)), $table);
    foreach ($columns as $column) {
        if (!in_array($column, $pk)) {
            foreach ($partialKeys as $partialKey) {
                if ($partialKey && PMA_checkPartialDependency($partialKey, $column, $table, $distinctValCount[$partialKey], $distinctValCount[$column], $totalRows)) {
                    $dependencyList[$partialKey][] = $column;
                }
            }
        }
    }
    $html = __('This list is based on a subset of the table\'s data ' . 'and is not necessarily accurate. ') . '<div class="dependencies_box">';
    foreach ($dependencyList as $dependon => $colList) {
        $html .= '<span class="displayblock">' . '<input type="button" class="pickPd" value="' . __('Pick') . '"/>' . '<span class="determinants">' . htmlspecialchars(str_replace('`', '', $dependon)) . '</span> -> ' . '<span class="dependents">' . htmlspecialchars(str_replace('`', '', implode(', ', $colList))) . '</span>' . '</span>';
    }
    if (empty($dependencyList)) {
        $html .= '<p class="displayblock desc">' . __('No partial dependencies found!') . '</p>';
    }
    $html .= '</div>';
    return $html;
}
     // if both db and table are selected
     $foreignTable = $_REQUEST['foreignTable'];
     $table_obj = new PMA_Table($foreignTable, $_REQUEST['foreignDb']);
     // Since views do not have keys defined on them provide the full list of columns
     if (PMA_Table::isView($_REQUEST['foreignDb'], $foreignTable)) {
         $columnList = $table_obj->getColumns(false, false);
     } else {
         $columnList = $table_obj->getIndexedColumns(false, false);
     }
     $columns = array();
     foreach ($columnList as $column) {
         $columns[] = htmlspecialchars($column);
     }
     $response->addJSON('columns', $columns);
     // @todo should be: $server->db($db)->table($table)->primary()
     $primary = PMA_Index::getPrimary($foreignTable, $_REQUEST['foreignDb']);
     if (false === $primary) {
         return;
     }
     $primarycols = array_keys($primary->getColumns());
     $response->addJSON('primary', $primarycols);
 } else {
     // if only the db is selected
     $tables = array();
     $foreign = isset($_REQUEST['foreign']) && $_REQUEST['foreign'] === 'true';
     if ($foreign) {
         $tbl_storage_engine = mb_strtoupper(PMA_Table::sGetStatusInfo($_REQUEST['db'], $_REQUEST['table'], 'Engine'));
     }
     // In Drizzle, 'SHOW TABLE STATUS' will show status only for the tables
     // which are currently in the table cache. Hence we have to use 'SHOW TABLES'
     // and manually retrieve table engine values.