📄 database_interface.lib.php
字号:
if ( PMA_MYSQL_INT_VERSION < 50002 || empty($tables)) { foreach ( $databases as $each_database ) { if ( true === $tbl_is_group ) { $sql = 'SHOW TABLE STATUS FROM ' . PMA_backquote($each_database) .' LIKE \'' . PMA_escape_mysql_wildcards(addslashes($table)) . '%\''; } else { $sql = 'SHOW TABLE STATUS FROM ' . PMA_backquote($each_database) . ';'; } $each_tables = PMA_DBI_fetch_result($sql, 'Name', null, $link); foreach ( $each_tables as $table_name => $each_table ) { if ( 'comment' === $tbl_is_group && 0 === strpos($each_table['Comment'], $table) ) { // remove table from list unset( $each_tables[$table_name] ); continue; } if ( ! isset( $each_tables[$table_name]['Type'] ) && isset( $each_tables[$table_name]['Engine'] ) ) { // pma BC, same parts of PMA still uses 'Type' $each_tables[$table_name]['Type'] =& $each_tables[$table_name]['Engine']; } elseif ( ! isset( $each_tables[$table_name]['Engine'] ) && isset( $each_tables[$table_name]['Type'] ) ) { // old MySQL reports Type, newer MySQL reports Engine $each_tables[$table_name]['Engine'] =& $each_tables[$table_name]['Type']; } // MySQL forward compatibility // so pma could use this array as if every server is of version >5.0 $each_tables[$table_name]['TABLE_SCHEMA'] = $each_database; $each_tables[$table_name]['TABLE_NAME'] =& $each_tables[$table_name]['Name']; $each_tables[$table_name]['ENGINE'] =& $each_tables[$table_name]['Engine']; $each_tables[$table_name]['VERSION'] =& $each_tables[$table_name]['Version']; $each_tables[$table_name]['ROW_FORMAT'] =& $each_tables[$table_name]['Row_format']; $each_tables[$table_name]['TABLE_ROWS'] =& $each_tables[$table_name]['Rows']; $each_tables[$table_name]['AVG_ROW_LENGTH'] =& $each_tables[$table_name]['Avg_row_length']; $each_tables[$table_name]['DATA_LENGTH'] =& $each_tables[$table_name]['Data_length']; $each_tables[$table_name]['MAX_DATA_LENGTH'] =& $each_tables[$table_name]['Max_data_length']; $each_tables[$table_name]['INDEX_LENGTH'] =& $each_tables[$table_name]['Index_length']; $each_tables[$table_name]['DATA_FREE'] =& $each_tables[$table_name]['Data_free']; $each_tables[$table_name]['AUTO_INCREMENT'] =& $each_tables[$table_name]['Auto_increment']; $each_tables[$table_name]['CREATE_TIME'] =& $each_tables[$table_name]['Create_time']; $each_tables[$table_name]['UPDATE_TIME'] =& $each_tables[$table_name]['Update_time']; $each_tables[$table_name]['CHECK_TIME'] =& $each_tables[$table_name]['Check_time']; $each_tables[$table_name]['TABLE_COLLATION'] =& $each_tables[$table_name]['Collation']; $each_tables[$table_name]['CHECKSUM'] =& $each_tables[$table_name]['Checksum']; $each_tables[$table_name]['CREATE_OPTIONS'] =& $each_tables[$table_name]['Create_options']; $each_tables[$table_name]['TABLE_COMMENT'] =& $each_tables[$table_name]['Comment']; if ( strtoupper( $each_tables[$table_name]['Comment'] ) === 'VIEW' ) { $each_tables[$table_name]['TABLE_TYPE'] = 'VIEW'; } else { // TODO difference between 'TEMPORARY' and 'BASE TABLE' // but how to detect? $each_tables[$table_name]['TABLE_TYPE'] = 'BASE TABLE'; } } $tables[$each_database] = $each_tables; } } if ( $GLOBALS['cfg']['NaturalOrder'] ) { foreach ( $tables as $key => $val ) { uksort($tables[$key], 'strnatcasecmp'); } } if (! is_array($database)) { if (isset($tables[$database])) { return $tables[$database]; } elseif (isset($tables[strtolower($database)])) { // on windows with lower_case_table_names = 1 // MySQL returns // with SHOW DATABASES or information_schema.SCHEMATA: `Test` // but information_schema.TABLES gives `test` // bug #1436171 // sf.net/tracker/?func=detail&aid=1436171&group_id=23067&atid=377408 return $tables[strtolower($database)]; } else { return $tables; } } else { return $tables; }}/** * returns count of databases for current server * * @param string $database databases to count * @param resource $link mysql db link */function PMA_DBI_get_databases_count($database = null, $link = null){ return count(PMA_DBI_get_dblist($link));}/** * returns array with databases containing extended infos about them * * @param string $databases database * @param boolean $force_stats retrieve stats also for MySQL < 5 * @param resource $link mysql link * @param string $sort_by collumn to order by * @param string $sort_order ASC or DESC * @param integer $limit_offset starting offset for LIMIT * @param bool|int $limit_count row count for LIMIT or true for $GLOBALS['cfg']['MaxDbList'] * @return array $databases */function PMA_DBI_get_databases_full($database = null, $force_stats = false, $link = null, $sort_by = 'SCHEMA_NAME', $sort_order = 'ASC', $limit_offset = 0, $limit_count = false){ $sort_order = strtoupper($sort_order); if (true === $limit_count) { $limit_count = $GLOBALS['cfg']['MaxDbList']; } // initialize to avoid errors when there are no databases $databases = array(); $apply_limit_and_order_manual = true; if (PMA_MYSQL_INT_VERSION >= 50002) { /** * if $GLOBALS['cfg']['NaturalOrder'] is enabled, we cannot use LIMIT * cause MySQL does not support natural ordering, we have to do it afterward */ if ($GLOBALS['cfg']['NaturalOrder']) { $limit = ''; } else { if ($limit_count) { $limit = ' LIMIT ' . $limit_count . ' OFFSET ' . $limit_offset; } $apply_limit_and_order_manual = false; } // get table information from information_schema if ( $database ) { $sql_where_schema = 'WHERE `SCHEMA_NAME` LIKE \'' . addslashes( $database ) . '\''; } else { $sql_where_schema = ''; } // for PMA bc: // `SCHEMA_FIELD_NAME` AS `SHOW_TABLE_STATUS_FIELD_NAME` $sql = ' SELECT `information_schema`.`SCHEMATA`.*'; if ($force_stats) { $sql .= ', COUNT(`information_schema`.`TABLES`.`TABLE_SCHEMA`) AS `SCHEMA_TABLES`, SUM(`information_schema`.`TABLES`.`TABLE_ROWS`) AS `SCHEMA_TABLE_ROWS`, SUM(`information_schema`.`TABLES`.`DATA_LENGTH`) AS `SCHEMA_DATA_LENGTH`, SUM(`information_schema`.`TABLES`.`MAX_DATA_LENGTH`) AS `SCHEMA_MAX_DATA_LENGTH`, SUM(`information_schema`.`TABLES`.`INDEX_LENGTH`) AS `SCHEMA_INDEX_LENGTH`, SUM(`information_schema`.`TABLES`.`DATA_LENGTH` + `information_schema`.`TABLES`.`INDEX_LENGTH`) AS `SCHEMA_LENGTH`, SUM(`information_schema`.`TABLES`.`DATA_FREE`) AS `SCHEMA_DATA_FREE`'; } $sql .= ' FROM `information_schema`.`SCHEMATA`'; if ($force_stats) { $sql .= ' LEFT JOIN `information_schema`.`TABLES` ON `information_schema`.`TABLES`.`TABLE_SCHEMA` = `information_schema`.`SCHEMATA`.`SCHEMA_NAME`'; } $sql .= ' ' . $sql_where_schema . ' GROUP BY `information_schema`.`SCHEMATA`.`SCHEMA_NAME` ORDER BY ' . PMA_backquote($sort_by) . ' ' . $sort_order . $limit; $databases = PMA_DBI_fetch_result( $sql, 'SCHEMA_NAME', null, $link ); unset($sql_where_schema, $sql); } else { foreach ( PMA_DBI_get_dblist( $link ) as $database_name ) { // MySQL forward compatibility // so pma could use this array as if every server is of version >5.0 $databases[$database_name]['SCHEMA_NAME'] = $database_name; if ( $force_stats ) { require_once 'mysql_charsets.lib.php'; $databases[$database_name]['DEFAULT_COLLATION_NAME'] = PMA_getDbCollation( $database_name ); // get additonal info about tables $databases[$database_name]['SCHEMA_TABLES'] = 0; $databases[$database_name]['SCHEMA_TABLE_ROWS'] = 0; $databases[$database_name]['SCHEMA_DATA_LENGTH'] = 0; $databases[$database_name]['SCHEMA_MAX_DATA_LENGTH'] = 0; $databases[$database_name]['SCHEMA_INDEX_LENGTH'] = 0; $databases[$database_name]['SCHEMA_LENGTH'] = 0; $databases[$database_name]['SCHEMA_DATA_FREE'] = 0; $res = PMA_DBI_query('SHOW TABLE STATUS FROM ' . PMA_backquote( $database_name ) . ';'); while ( $row = PMA_DBI_fetch_assoc( $res ) ) { $databases[$database_name]['SCHEMA_TABLES']++; $databases[$database_name]['SCHEMA_TABLE_ROWS'] += $row['Rows']; $databases[$database_name]['SCHEMA_DATA_LENGTH'] += $row['Data_length']; $databases[$database_name]['SCHEMA_MAX_DATA_LENGTH'] += $row['Max_data_length']; $databases[$database_name]['SCHEMA_INDEX_LENGTH'] += $row['Index_length']; $databases[$database_name]['SCHEMA_DATA_FREE'] += $row['Data_free']; $databases[$database_name]['SCHEMA_LENGTH'] += $row['Data_length'] + $row['Index_length']; } PMA_DBI_free_result( $res ); unset( $res ); } } } /** * apply limit and order manually now * (caused by older MySQL < 5 or $GLOBALS['cfg']['NaturalOrder']) */ if ($apply_limit_and_order_manual) { /** * first apply ordering */ if ($GLOBALS['cfg']['NaturalOrder']) { $sorter = 'strnatcasecmp'; } else { $sorter = 'strcasecmp'; } // produces f.e.: // return -1 * strnatcasecmp($a["SCHEMA_TABLES"], $b["SCHEMA_TABLES"]) $sort_function = ' return ' . ($sort_order == 'ASC' ? 1 : -1) . ' * ' . $sorter . '($a["' . $sort_by . '"], $b["' . $sort_by . '"]); '; usort($databases, create_function('$a, $b', $sort_function)); /** * now apply limit */ if ($limit_count) { $databases = array_slice($databases, $limit_offset, $limit_count); } } return $databases;}/** * returns detailed array with all columns for given table in database, * or all tables/databases * * @param string $database name of database * @param string $table name of table to retrieve columns from * @param string $column name of specific column * @param mixed $link mysql link resource */function PMA_DBI_get_columns_full($database = null, $table = null, $column = null, $link = null){ $columns = array(); if ( PMA_MYSQL_INT_VERSION >= 50002 ) { $sql_wheres = array(); $array_keys = array(); // get columns information from information_schema if ( null !== $database ) { $sql_wheres[] = '`TABLE_SCHEMA` = \'' . addslashes($database) . '\' '; } else { $array_keys[] = 'TABLE_SCHEMA'; } if ( null !== $table ) { $sql_wheres[] = '`TABLE_NAME` = \'' . addslashes($table) . '\' '; } else { $array_keys[] = 'TABLE_NAME'; } if ( null !== $column ) { $sql_wheres[] = '`COLUMN_NAME` = \'' . addslashes($column) . '\' '; } else { $array_keys[] = 'COLUMN_NAME'; } // for PMA bc: // `[SCHEMA_FIELD_NAME]` AS `[SHOW_FULL_COLUMNS_FIELD_NAME]` $sql = ' SELECT *, `COLUMN_NAME` AS `Field`, `COLUMN_TYPE` AS `Type`, `COLLATION_NAME` AS `Collation`,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -