📄 relation.lib.php
字号:
<?php/* vim: set expandtab sw=4 ts=4 sts=4: *//** * Set of functions used with the relation and pdf feature * * @version $Id: relation.lib.php 11657 2008-10-19 00:42:04Z lem9 $ */if (! defined('PHPMYADMIN')) { exit;}/** * */require_once './libraries/Table.class.php';/** * Executes a query as controluser if possible, otherwise as normal user * * @param string the query to execute * @param boolean whether to display SQL error messages or not * * @return integer the result set, or false if no result set * * @access public * * @author Mike Beck <mikebeck@users.sourceforge.net> */function PMA_query_as_cu($sql, $show_error = true, $options = 0){ if ($show_error) { $result = PMA_DBI_query($sql, $GLOBALS['controllink'], $options); } else { $result = @PMA_DBI_try_query($sql, $GLOBALS['controllink'], $options); } // end if... else... if ($result) { return $result; } else { return false; }} // end of the "PMA_query_as_cu()" function/** * @uses $_SESSION['relation' . $GLOBALS['server']] for caching * @uses $GLOBALS['cfgRelation'] to set it * @uses $GLOBALS['server'] to ensure we are using server-specific pmadb * @uses PMA__getRelationsParam() * @uses PMA_printRelationsParamDiagnostic() * @param bool $verbose whether to print diagnostic info * @return array $cfgRelation */function PMA_getRelationsParam($verbose = false){ if (empty($_SESSION['relation' . $GLOBALS['server']])) { $_SESSION['relation' . $GLOBALS['server']] = PMA__getRelationsParam(); } if ($verbose) { PMA_printRelationsParamDiagnostic($_SESSION['relation' . $GLOBALS['server']]); } // just for BC $GLOBALS['cfgRelation'] = $_SESSION['relation' . $GLOBALS['server']]; return $_SESSION['relation' . $GLOBALS['server']];}/** * prints out diagnostic info for pma relation feature * * @uses $GLOBALS['server'] * @uses $GLOBALS['controllink'] * @uses $GLOBALS['strNotOK'] * @uses $GLOBALS['strDocu'] * @uses $GLOBALS['strGeneralRelationFeat'] * @uses $GLOBALS['strDisabled'] * @uses $GLOBALS['strEnabled'] * @uses $GLOBALS['strDisplayFeat'] * @uses $GLOBALS['strCreatePdfFeat'] * @uses $GLOBALS['strColComFeat'] * @uses $GLOBALS['strBookmarkQuery'] * @uses $GLOBALS['strUpdComTab'] * @uses $GLOBALS['strQuerySQLHistory'] * @uses $GLOBALS['strDesigner'] * @uses $cfg['Server']['pmadb'] * @uses sprintf() * @uses PMA_printDiagMessageForFeature() * @uses PMA_printDiagMessageForParameter() * @param array $cfgRelation */function PMA_printRelationsParamDiagnostic($cfgRelation){ $messages['error'] = '<font color="red"><strong>' . $GLOBALS['strNotOK'] . '</strong></font> [ <a href="Documentation.html#%s" target="documentation">' . $GLOBALS['strDocu'] . '</a> ]'; $messages['ok'] = '<font color="green"><strong>' . $GLOBALS['strOK'] . '</strong></font>'; $messages['enabled'] = '<font color="green">' . $GLOBALS['strEnabled'] . '</font>'; $messages['disabled'] = '<font color="red">' . $GLOBALS['strDisabled'] . '</font>'; if (false === $GLOBALS['cfg']['Server']['pmadb']) { echo 'PMA Database ... ' . sprintf($messages['error'], 'pmadb') . '<br />' . "\n" . $GLOBALS['strGeneralRelationFeat'] . ' <font color="green">' . $GLOBALS['strDisabled'] . '</font>' . "\n"; return; } echo '<table>' . "\n"; PMA_printDiagMessageForParameter('pmadb', $GLOBALS['cfg']['Server']['pmadb'], $messages, 'pmadb'); PMA_printDiagMessageForParameter('relation', isset($cfgRelation['relation']), $messages, 'relation'); PMA_printDiagMessageForFeature('strGeneralRelationFeat', 'relwork', $messages); PMA_printDiagMessageForParameter('table_info', isset($cfgRelation['displaywork']), $messages, 'table_info'); PMA_printDiagMessageForFeature('strDisplayFeat', 'displaywork', $messages); PMA_printDiagMessageForParameter('table_coords', isset($cfgRelation['table_coords']), $messages, 'table_coords'); PMA_printDiagMessageForParameter('pdf_pages', isset($cfgRelation['pdf_pages']), $messages, 'table_coords'); PMA_printDiagMessageForFeature('strCreatePdfFeat', 'pdfwork', $messages); PMA_printDiagMessageForParameter('column_info', isset($cfgRelation['column_info']), $messages, 'col_com'); PMA_printDiagMessageForFeature('strColComFeat', 'commwork', $messages, false); PMA_printDiagMessageForFeature('strBookmarkQuery', 'bookmarkwork', $messages, false); PMA_printDiagMessageForFeature('strMIME_transformation', 'mimework', $messages); if ($cfgRelation['commwork'] && ! $cfgRelation['mimework']) { echo '<tr><td colspan=2 align="left">' . $GLOBALS['strUpdComTab'] . '</td></tr>' . "\n"; } PMA_printDiagMessageForParameter('history', isset($cfgRelation['history']), $messages, 'history'); PMA_printDiagMessageForFeature('strQuerySQLHistory', 'historywork', $messages); PMA_printDiagMessageForParameter('designer_coords', isset($cfgRelation['designer_coords']), $messages, 'designer_coords'); PMA_printDiagMessageForFeature('strDesigner', 'designerwork', $messages); echo '</table>' . "\n";}/** * prints out one diagnostic message for a feature * * @param string feature name in a message string * @param string the $GLOBALS['cfgRelation'] parameter to check * @param array utility messages * @param boolean whether to skip a line after the message */function PMA_printDiagMessageForFeature($feature_name, $relation_parameter, $messages, $skip_line=true){ echo ' <tr><td colspan=2 align="right">' . $GLOBALS[$feature_name] . ': ' . ($GLOBALS['cfgRelation'][$relation_parameter] ? $messages['enabled'] : $messages['disabled']) . '</td></tr>' . "\n"; if ($skip_line) { echo ' <tr><td> </td></tr>' . "\n"; }}/** * prints out one diagnostic message for a configuration parameter * * @param string config parameter name to display * @param boolean whether this parameter is set * @param array utility messages * @param string anchor in Documentation.html */function PMA_printDiagMessageForParameter($parameter, $relation_parameter_set, $messages, $doc_anchor){ echo ' <tr><th align="left">'; echo '$cfg[\'Servers\'][$i][\'' . $parameter . '\'] ... </th><td align="right">'; echo ($relation_parameter_set ? $messages['ok'] : sprintf($messages['error'], $doc_anchor)) . '</td></tr>' . "\n";}/** * Defines the relation parameters for the current user * just a copy of the functions used for relations ;-) * but added some stuff to check what will work * * @uses $cfg['Server']['user'] * @uses $cfg['Server']['pmadb'] * @uses $cfg['Server']['verbose_check'] * @uses $GLOBALS['server'] * @uses $GLOBALS['controllink'] * @uses PMA_DBI_QUERY_STORE * @uses PMA_DBI_select_db() * @uses PMA_backquote() * @uses PMA_query_as_cu() * @uses PMA_DBI_fetch_row() * @uses PMA_DBI_free_result() * @access protected * @author Mike Beck <mikebeck@users.sourceforge.net> * @return array the relation parameters for the current user */function PMA__getRelationsParam(){ $cfgRelation = array(); $cfgRelation['relwork'] = false; $cfgRelation['displaywork'] = false; $cfgRelation['bookmarkwork']= false; $cfgRelation['pdfwork'] = false; $cfgRelation['commwork'] = false; $cfgRelation['mimework'] = false; $cfgRelation['historywork'] = false; $cfgRelation['designerwork'] = false; $cfgRelation['allworks'] = false; $cfgRelation['user'] = null; $cfgRelation['db'] = null; if ($GLOBALS['server'] == 0 || empty($GLOBALS['cfg']['Server']['pmadb']) || ! PMA_DBI_select_db($GLOBALS['cfg']['Server']['pmadb'], $GLOBALS['controllink'])) { // No server selected -> no bookmark table // we return the array with the falses in it, // to avoid some 'Unitialized string offset' errors later $GLOBALS['cfg']['Server']['pmadb'] = false; return $cfgRelation; } $cfgRelation['user'] = $GLOBALS['cfg']['Server']['user']; $cfgRelation['db'] = $GLOBALS['cfg']['Server']['pmadb']; // Now I just check if all tables that i need are present so I can for // example enable relations but not pdf... // I was thinking of checking if they have all required columns but I // fear it might be too slow $tab_query = 'SHOW TABLES FROM ' . PMA_backquote($GLOBALS['cfg']['Server']['pmadb']); $tab_rs = PMA_query_as_cu($tab_query, false, PMA_DBI_QUERY_STORE); if (! $tab_rs) { // query failed ... ? //$GLOBALS['cfg']['Server']['pmadb'] = false; return $cfgRelation; } while ($curr_table = @PMA_DBI_fetch_row($tab_rs)) { if ($curr_table[0] == $GLOBALS['cfg']['Server']['bookmarktable']) { $cfgRelation['bookmark'] = $curr_table[0]; } elseif ($curr_table[0] == $GLOBALS['cfg']['Server']['relation']) { $cfgRelation['relation'] = $curr_table[0]; } elseif ($curr_table[0] == $GLOBALS['cfg']['Server']['table_info']) { $cfgRelation['table_info'] = $curr_table[0]; } elseif ($curr_table[0] == $GLOBALS['cfg']['Server']['table_coords']) { $cfgRelation['table_coords'] = $curr_table[0]; } elseif ($curr_table[0] == $GLOBALS['cfg']['Server']['designer_coords']) { $cfgRelation['designer_coords'] = $curr_table[0]; } elseif ($curr_table[0] == $GLOBALS['cfg']['Server']['column_info']) { $cfgRelation['column_info'] = $curr_table[0]; } elseif ($curr_table[0] == $GLOBALS['cfg']['Server']['pdf_pages']) { $cfgRelation['pdf_pages'] = $curr_table[0]; } elseif ($curr_table[0] == $GLOBALS['cfg']['Server']['history']) { $cfgRelation['history'] = $curr_table[0]; } } // end while PMA_DBI_free_result($tab_rs); if (isset($cfgRelation['relation'])) { $cfgRelation['relwork'] = true; if (isset($cfgRelation['table_info'])) { $cfgRelation['displaywork'] = true; } } if (isset($cfgRelation['table_coords']) && isset($cfgRelation['pdf_pages'])) { $cfgRelation['pdfwork'] = true; } if (isset($cfgRelation['column_info'])) { $cfgRelation['commwork'] = true; if ($GLOBALS['cfg']['Server']['verbose_check']) { $mime_query = 'SHOW FIELDS FROM ' . PMA_backquote($cfgRelation['db']) . '.' . PMA_backquote($cfgRelation['column_info']); $mime_rs = PMA_query_as_cu($mime_query, false); $mime_field_mimetype = false; $mime_field_transformation = false; $mime_field_transformation_options = false; while ($curr_mime_field = @PMA_DBI_fetch_row($mime_rs)) { if ($curr_mime_field[0] == 'mimetype') { $mime_field_mimetype = true; } elseif ($curr_mime_field[0] == 'transformation') { $mime_field_transformation = true; } elseif ($curr_mime_field[0] == 'transformation_options') { $mime_field_transformation_options = true; } } PMA_DBI_free_result($mime_rs); if ($mime_field_mimetype && $mime_field_transformation && $mime_field_transformation_options) { $cfgRelation['mimework'] = true; } } else { $cfgRelation['mimework'] = true; } } if (isset($cfgRelation['history'])) { $cfgRelation['historywork'] = true; } // we do not absolutely need that the internal relations or the PDF // schema feature be activated if (isset($cfgRelation['designer_coords'])) { $cfgRelation['designerwork'] = true; } if (isset($cfgRelation['bookmark'])) { $cfgRelation['bookmarkwork'] = true; } if ($cfgRelation['relwork'] && $cfgRelation['displaywork'] && $cfgRelation['pdfwork'] && $cfgRelation['commwork'] && $cfgRelation['mimework'] && $cfgRelation['historywork'] && $cfgRelation['bookmarkwork'] && $cfgRelation['designerwork']) { $cfgRelation['allworks'] = true; } return $cfgRelation;} // end of the 'PMA_getRelationsParam()' function/** * Gets all Relations to foreign tables for a given table or * optionally a given column in a table * * @author Mike Beck <mikebeck@users.sourceforge.net> * @author Marc Delisle * @access public * @uses $GLOBALS['controllink'] * @uses $GLOBALS['information_schema_relations'] * @uses PMA_getRelationsParam() * @uses PMA_backquote() * @uses PMA_sqlAddslashes() * @uses PMA_DBI_fetch_result() * @uses PMA_DBI_fetch_value() * @uses PMA_SQP_analyze() * @uses PMA_SQP_parse() * @uses count() * @uses strlen() * @param string $db the name of the db to check for * @param string $table the name of the table to check for * @param string $column the name of the column to check for * @param string $source the source for foreign key information * @return array db,table,column */function PMA_getForeigners($db, $table, $column = '', $source = 'both'){ $cfgRelation = PMA_getRelationsParam(); $foreign = array(); if ($cfgRelation['relwork'] && ($source == 'both' || $source == 'internal')) { $rel_query = ' SELECT `master_field`, `foreign_db`, `foreign_table`, `foreign_field` FROM ' . PMA_backquote($cfgRelation['db']) . '.' . PMA_backquote($cfgRelation['relation']) . ' WHERE `master_db` = \'' . PMA_sqlAddslashes($db) . '\' AND `master_table` = \'' . PMA_sqlAddslashes($table) . '\' '; if (strlen($column)) { $rel_query .= ' AND `master_field` = \'' . PMA_sqlAddslashes($column) . '\''; } $foreign = PMA_DBI_fetch_result($rel_query, 'master_field', null, $GLOBALS['controllink']); } if (($source == 'both' || $source == 'foreign') && strlen($table)) { $show_create_table_query = 'SHOW CREATE TABLE ' . PMA_backquote($db) . '.' . PMA_backquote($table); $show_create_table = PMA_DBI_fetch_value($show_create_table_query, 0, 1); $analyzed_sql = PMA_SQP_analyze(PMA_SQP_parse($show_create_table)); foreach ($analyzed_sql[0]['foreign_keys'] as $one_key) { // The analyzer may return more than one column name in the // index list or the ref_index_list; if this happens, // the current logic just discards the whole index; having // more than one index field is currently unsupported (see FAQ 3.6)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -