<?php/* $Id: sql.php,v 2.83.2.7 2006/04/27 08:57:09 nijel Exp $ */// vim: expandtab sw=4 ts=4 sts=4:/*** Gets some core libraries*/require_once './libraries/common.lib.php';require_once './libraries/tbl_indexes.lib.php';require_once './libraries/check_user_privileges.lib.php';require_once './libraries/bookmark.lib.php';/*** Could be coming from a subform ("T" column expander)*/if (isset($_REQUEST['dontlimitchars'])) {$dontlimitchars = $_REQUEST['dontlimitchars'];}/*** Defines the url to return to in case of error in a sql statement*/// Security checkingsif (!empty($goto)) {$is_gotofile = preg_replace('@^([^?]+).*$@s', '\\1', $goto);if (!@file_exists('./' . $is_gotofile)) {unset($goto);} else {$is_gotofile = ($is_gotofile == $goto);}} // end if (security checkings)if (empty($goto)) {$goto = (! isset($table) || ! strlen($table)) ? $cfg['DefaultTabDatabase'] : $cfg['DefaultTabTable'];$is_gotofile = true;} // end ifif (!isset($err_url)) {$err_url = (!empty($back) ? $back : $goto). '?' . PMA_generate_common_url(isset($db) ? $db : ''). ((strpos(' ' . $goto, 'db_details') != 1 && isset($table)) ? '&table=' . urlencode($table) : '');} // end if// Coming from a bookmark dialogif (isset($fields['query'])) {$sql_query = $fields['query'];}// This one is just to fill $dbif (isset($fields['dbase'])) {$db = $fields['dbase'];}// Default to browse if no query set an we have table (needed for browsing from DefaultTabTable)if (!isset($sql_query) && isset($table) && isset($db)) {require_once './libraries/bookmark.lib.php';$book_sql_query = PMA_queryBookmarks($db, $GLOBALS['cfg']['Bookmark'], '\'' . PMA_sqlAddslashes($table) . '\'', 'label');if (!empty($book_sql_query)) {$sql_query = $book_sql_query;} else {$sql_query = 'SELECT * FROM ' . PMA_backquote($table);}unset($book_sql_query);// set $goto to what will be displayed if query returns 0 rows$goto = 'tbl_properties_structure.php';} else {// Now we can check the parametersPMA_checkParameters(array('sql_query'));}// instead of doing the test twice$is_drop_database = preg_match('/DROP[[:space:]]+(DATABASE|SCHEMA)[[:space:]]+/i',$sql_query);/*** Check rights in case of DROP DATABASE** This test may be bypassed if $is_js_confirmed = 1 (already checked with js)* but since a malicious user may pass this variable by url/form, we don't take* into account this case.*/if (!defined('PMA_CHK_DROP')&& !$cfg['AllowUserDropDatabase']&& $is_drop_database&& !$is_superuser) {require_once './libraries/header.inc.php';PMA_mysqlDie($strNoDropDatabases, '', '', $err_url);} // end if/*** Need to find the real end of rows?*/if (isset($find_real_end) && $find_real_end) {$unlim_num_rows = PMA_countRecords($db, $table, true, true);$pos = @((ceil($unlim_num_rows / $session_max_rows) - 1) * $session_max_rows);}/*** Avoids undefined variables*/elseif (!isset($pos)) {$pos = 0;}/*** Bookmark add*/if (isset($store_bkm)) {PMA_addBookmarks($fields, $cfg['Bookmark'], (isset($bkm_all_users) && $bkm_all_users == 'true' ? true : false));PMA_sendHeaderLocation($cfg['PmaAbsoluteUri'] . $goto);} // end if/*** Gets the true sql query*/// $sql_query has been urlencoded in the confirmation form for drop/delete// queries or in the navigation bar for browsing among recordsif (isset($btnDrop) || isset($navig)) {$sql_query = urldecode($sql_query);}/*** Reformat the query*/$GLOBALS['unparsed_sql'] = $sql_query;$parsed_sql = PMA_SQP_parse($sql_query);$analyzed_sql = PMA_SQP_analyze($parsed_sql);// Bug #641765 - Robbat2 - 12 January 2003, 10:49PM// Reverted - Robbat2 - 13 January 2003, 2:40PM// lem9: for bug 780516: now that we use case insensitive preg_match// or flags from the analyser, do not put back the reformatted query// into $sql_query, to make this kind of query work without// capitalizing keywords://// CREATE TABLE SG_Persons (// id int(10) unsigned NOT NULL auto_increment,// first varchar(64) NOT NULL default '',// PRIMARY KEY (`id`)// )//// Note: now we probably do not need to fill and use $GLOBALS['unparsed_sql']// but I let this intact for now.////$sql_query = PMA_SQP_formatHtml($parsed_sql, 'query_only');// check for a real SELECT ... FROM$is_select = isset($analyzed_sql[0]['queryflags']['select_from']);// If the query is a Select, extract the db and table names and modify// $db and $table, to have correct page headers, links and left frame.// db and table name may be enclosed with backquotes, db is optionnal,// query may contain aliases.// (TODO: if there are more than one table name in the Select:// - do not extract the first table name// - do not show a table name in the page header// - do not display the sub-pages links)if ($is_select) {$prev_db = $db;if (isset($analyzed_sql[0]['table_ref'][0]['table_true_name'])) {$table = $analyzed_sql[0]['table_ref'][0]['table_true_name'];}if (isset($analyzed_sql[0]['table_ref'][0]['db'])&& strlen($analyzed_sql[0]['table_ref'][0]['db'])) {$db = $analyzed_sql[0]['table_ref'][0]['db'];} else {$db = $prev_db;}// Nijel: don't change reload, if we already decided to reload in importif (empty($reload)) {$reload = ($db == $prev_db) ? 0 : 1;}}/*** Sets or modifies the $goto variable if required*/if ($goto == 'sql.php') {$is_gotofile = false;$goto = 'sql.php?'. PMA_generate_common_url($db, $table). '&pos=' . $pos. '&sql_query=' . urlencode($sql_query);} // end if/*** Go back to further page if table should not be dropped*/if (isset($btnDrop) && $btnDrop == $strNo) {if (!empty($back)) {$goto = $back;}if ($is_gotofile) {if (strpos(' ' . $goto, 'db_details') == 1 && isset($table) && strlen($table)) {unset($table);}$active_page = $goto;require './' . PMA_securePath($goto);} else {PMA_sendHeaderLocation($cfg['PmaAbsoluteUri'] . str_replace('&', '&', $goto));}exit();} // end if/*** Displays the confirm page if required** This part of the script is bypassed if $is_js_confirmed = 1 (already checked* with js) because possible security issue is not so important here: at most,* the confirm message isn't displayed.** Also bypassed if only showing php code.or validating a SQL query*/if (!$cfg['Confirm']|| (isset($is_js_confirmed) && $is_js_confirmed)|| isset($btnDrop)// if we are coming from a "Create PHP code" or a "Without PHP Code"// dialog, we won't execute the query anyway, so don't confirm//|| !empty($GLOBALS['show_as_php'])|| isset($GLOBALS['show_as_php'])|| !empty($GLOBALS['validatequery'])) {$do_confirm = false;} else {$do_confirm = isset($analyzed_sql[0]['queryflags']['need_confirm']);}if ($do_confirm) {$stripped_sql_query = $sql_query;require_once './libraries/header.inc.php';if ($is_drop_database) {echo '<h1 class="warning">' . $strDropDatabaseStrongWarning . '</h1>';}echo '<form action="sql.php" method="post">' . "\n".PMA_generate_common_hidden_inputs($db, (isset($table)?$table:''));?><input type="hidden" name="sql_query" value="<?php echo urlencode($sql_query); ?>" /><input type="hidden" name="zero_rows" value="<?php echo isset($zero_rows) ? PMA_sanitize($zero_rows) : ''; ?>" /><input type="hidden" name="goto" value="<?php echo $goto; ?>" /><input type="hidden" name="back" value="<?php echo isset($back) ? PMA_sanitize($back) : ''; ?>" /><input type="hidden" name="reload" value="<?php echo isset($reload) ? PMA_sanitize($reload) : 0; ?>" /><input type="hidden" name="purge" value="<?php echo isset($purge) ? PMA_sanitize($purge) : ''; ?>" /><input type="hidden" name="cpurge" value="<?php echo isset($cpurge) ? PMA_sanitize($cpurge) : ''; ?>" /><input type="hidden" name="purgekey" value="<?php echo isset($purgekey) ? PMA_sanitize($purgekey) : ''; ?>" /><input type="hidden" name="show_query" value="<?php echo isset($show_query) ? PMA_sanitize($show_query) : ''; ?>" /><?phpecho '<fieldset class="confirmation">' . "\n".' <legend>' . $strDoYouReally . '</legend>'.' <tt>' . htmlspecialchars($stripped_sql_query) . '</tt>' . "\n".'</fieldset>' . "\n".'<fieldset class="tblFooters">' . "\n";?><input type="submit" name="btnDrop" value="<?php echo $strYes; ?>" id="buttonYes" /><input type="submit" name="btnDrop" value="<?php echo $strNo; ?>" id="buttonNo" /><?phpecho '</fieldset>' . "\n". '</form>' . "\n";} // end if $do_confirm/*** Executes the query and displays results*/else {if (!isset($sql_query)) {$sql_query = '';}// Defines some variables// A table has to be created or renamed -> left frame should be reloaded// TODO: use the parser/analyzerif (empty($reload)&& preg_match('/^(CREATE|ALTER|DROP)\s+(VIEW|TABLE|DATABASE|SCHEMA)\s+/i', $sql_query)) {$reload = 1;}// Gets the number of rows per pageif (empty($session_max_rows)) {$session_max_rows = $cfg['MaxRows'];} elseif ($session_max_rows != 'all') {$cfg['MaxRows'] = $session_max_rows;}// Defines the display mode (horizontal/vertical) and header "frequency"if (empty($disp_direction)) {$disp_direction = $cfg['DefaultDisplay'];}if (empty($repeat_cells)) {$repeat_cells = $cfg['RepeatCells'];}// SK -- Patch: $is_group added for use in calculation of total number of// rows.// $is_count is changed for more correct "LIMIT" clause// appending in queries like// "SELECT COUNT(...) FROM ... GROUP BY ..."// TODO: detect all this with the parser, to avoid problems finding// those strings in comments or backquoted identifiers$is_explain = $is_count = $is_export = $is_delete = $is_insert = $is_affected = $is_show = $is_maint = $is_analyse = $is_group = $is_func = $is_replace = false;if ($is_select) { // see line 141$is_group = preg_match('@(GROUP[[:space:]]+BY|HAVING|SELECT[[:space:]]+DISTINCT)[[:space:]]+@i', $sql_query);$is_func = !$is_group && (preg_match('@[[:space:]]+(SUM|AVG|STD|STDDEV|MIN|MAX|BIT_OR|BIT_AND)\s*\(@i', $sql_query));$is_count = !$is_group && (preg_match('@^SELECT[[:space:]]+COUNT\((.*\.+)?.*\)@i', $sql_query));$is_export = (preg_match('@[[:space:]]+INTO[[:space:]]+OUTFILE[[:space:]]+@i', $sql_query));$is_analyse = (preg_match('@[[:space:]]+PROCEDURE[[:space:]]+ANALYSE@i', $sql_query));} elseif (preg_match('@^EXPLAIN[[:space:]]+@i', $sql_query)) {$is_explain = true;} elseif (preg_match('@^DELETE[[:space:]]+@i', $sql_query)) {$is_delete = true;$is_affected = true;} elseif (preg_match('@^(INSERT|LOAD[[:space:]]+DATA|REPLACE)[[:space:]]+@i', $sql_query)) {$is_insert = true;$is_affected = true;if (preg_match('@^(REPLACE)[[:space:]]+@i', $sql_query)) {$is_replace = true;}} elseif (preg_match('@^UPDATE[[:space:]]+@i', $sql_query)) {$is_affected = true;} elseif (preg_match('@^SHOW[[:space:]]+@i', $sql_query)) {$is_show = true;} elseif (preg_match('@^(CHECK|ANALYZE|REPAIR|OPTIMIZE)[[:space:]]+TABLE[[:space:]]+@i', $sql_query)) {$is_maint = true;}// Do append a "LIMIT" clause?if (isset($pos)&& (!$cfg['ShowAll'] || $session_max_rows != 'all')&& !($is_count || $is_export || $is_func || $is_analyse)&& isset($analyzed_sql[0]['queryflags']['select_from'])&& !isset($analyzed_sql[0]['queryflags']['offset'])&& !preg_match('@[[:space:]]LIMIT[[:space:]0-9,-]+(;)?$@i', $sql_query)) {$sql_limit_to_append = " LIMIT $pos, ".$cfg['MaxRows'] . " ";$full_sql_query = $analyzed_sql[0]['section_before_limit'] . "\n" . $sql_limit_to_append . $analyzed_sql[0]['section_after_limit'];// FIXME: pretty printing of this modified queryif (isset($display_query)) {// if the analysis of the original query revealed that we found// a section_after_limit, we now have to analyze $display_query// to display it correctlyif (!empty($analyzed_sql[0]['section_after_limit']) && trim($analyzed_sql[0]['section_after_limit']) != ';') {$analyzed_display_query = PMA_SQP_analyze(PMA_SQP_parse($display_query));$display_query = $analyzed_display_query[0]['section_before_limit'] . "\n" . $sql_limit_to_append . $analyzed_display_query[0]['section_after_limit'];}}} else {$full_sql_query = $sql_query;} // end if...elseif (isset($db)) {PMA_DBI_select_db($db);}// If the query is a DELETE query with no WHERE clause, get the number of// rows that will be deleted (mysql_affected_rows will always return 0 in// this case)// Note: testing shows that this no longer applies since MySQL 4.0.xif (PMA_MYSQL_INT_VERSION < 40000) {if ($is_delete&& preg_match('@^DELETE([[:space:]].+)?(FROM[[:space:]](.+))$@i', $sql_query, $parts)&& !preg_match('@[[:space:]]WHERE[[:space:]]@i', $parts[3])) {$cnt_all_result = @PMA_DBI_try_query('SELECT COUNT(*) as count ' . $parts[2]);if ($cnt_all_result) {list($num_rows) = PMA_DBI_fetch_row($cnt_all_result);PMA_DBI_free_result($cnt_all_result);} else {$num_rows = 0;}}}// E x e c u t e t h e q u e r y// Only if we didn't ask to see the php code (mikebeck)if (isset($GLOBALS['show_as_php']) || !empty($GLOBALS['validatequery'])) {unset($result);$num_rows = 0;} else {// garvin: Measure query time.// TODO-Item http://sourceforge.net/tracker/index.php?func=detail&aid=571934&group_id=23067&atid=377411$querytime_before = array_sum(explode(' ', microtime()));$result = @PMA_DBI_try_query($full_sql_query, null, PMA_DBI_QUERY_STORE);$querytime_after = array_sum(explode(' ', microtime()));$GLOBALS['querytime'] = $querytime_after - $querytime_before;// Displays an error message if required and stop parsing the scriptif ($error = PMA_DBI_getError()) {require_once './libraries/header.inc.php';$full_err_url = (preg_match('@^(db_details|tbl_properties)@', $err_url))? $err_url . '&show_query=1&sql_query=' . urlencode($sql_query): $err_url;PMA_mysqlDie($error, $full_sql_query, '', $full_err_url);}unset($error);// Gets the number of rows affected/returned// (This must be done immediately after the query because// mysql_affected_rows() reports about the last query done)if (!$is_affected) {$num_rows = ($result) ? @PMA_DBI_num_rows($result) : 0;} elseif (!isset($num_rows)) {$num_rows = @PMA_DBI_affected_rows();}// Checks if the current database has changed// This could happen if the user sends a query like "USE `database`;"$res = PMA_DBI_query('SELECT DATABASE() AS \'db\';');$row = PMA_DBI_fetch_row($res);if (is_array($row) && isset($row[0]) && (strcasecmp($db, $row[0]) != 0)) {$db = $row[0];$reload = 1;}@PMA_DBI_free_result($res);unset($res, $row);// tmpfile remove after convert encoding appended by Y.Kawadaif (function_exists('PMA_kanji_file_conv')&& (isset($textfile) && file_exists($textfile))) {unlink($textfile);}// Counts the total number of rows for the same 'SELECT' query without the// 'LIMIT' clause that may have been programatically addedif (empty($sql_limit_to_append)) {$unlim_num_rows = $num_rows;// if we did not append a limit, set this to get a correct// "Showing rows..." message$GLOBALS['session_max_rows'] = 'all';} elseif ($is_select) {// c o u n t q u e r y// If we are "just browsing", there is only one table,// and no where clause (or just 'WHERE 1 '),// so we do a quick count (which uses MaxExactCount)// because SQL_CALC_FOUND_ROWS// is not quick on large InnoDB tables// but do not count again if we did it previously// due to $find_real_end == trueif (!$is_group&& !isset($analyzed_sql[0]['queryflags']['union'])&& !isset($analyzed_sql[0]['table_ref'][1]['table_name'])&& (empty($analyzed_sql[0]['where_clause'])|| $analyzed_sql[0]['where_clause'] == '1 ')&& !isset($find_real_end)) {// "j u s t b r o w s i n g"$unlim_num_rows = PMA_countRecords($db, $table, true);} else { // n o t " j u s t b r o w s i n g "if (PMA_MYSQL_INT_VERSION < 40000) {// detect this case:// SELECT DISTINCT x AS foo, y AS bar FROM sometableif (isset($analyzed_sql[0]['queryflags']['distinct'])) {$count_what = 'DISTINCT ';$first_expr = true;foreach ($analyzed_sql[0]['select_expr'] as $part) {$count_what .= (!$first_expr ? ', ' : '') . $part['expr'];$first_expr = false;}} else {$count_what = '*';}// this one does not apply to VIEWs$count_query = 'SELECT COUNT(' . $count_what . ') AS count';}// add the remaining of select expression if there is// a GROUP BY or HAVING clauseif (PMA_MYSQL_INT_VERSION < 40000&& $count_what =='*'&& (!empty($analyzed_sql[0]['group_by_clause'])|| !empty($analyzed_sql[0]['having_clause']))) {$count_query .= ' ,' . $analyzed_sql[0]['select_expr_clause'];}if (PMA_MYSQL_INT_VERSION >= 40000) {// add select expression after the SQL_CALC_FOUND_ROWS// for UNION, just adding SQL_CALC_FOUND_ROWS// after the first SELECT works.// take the left part, could be:// SELECT// (SELECT$count_query = PMA_SQP_formatHtml($parsed_sql, 'query_only', 0, $analyzed_sql[0]['position_of_first_select'] + 1);$count_query .= ' SQL_CALC_FOUND_ROWS ';// add everything that was after the first SELECT$count_query .= PMA_SQP_formatHtml($parsed_sql, 'query_only', $analyzed_sql[0]['position_of_first_select']+1);} else { // PMA_MYSQL_INT_VERSION < 40000if (!empty($analyzed_sql[0]['from_clause'])) {$count_query .= ' FROM ' . $analyzed_sql[0]['from_clause'];}if (!empty($analyzed_sql[0]['where_clause'])) {$count_query .= ' WHERE ' . $analyzed_sql[0]['where_clause'];}if (!empty($analyzed_sql[0]['group_by_clause'])) {$count_query .= ' GROUP BY ' . $analyzed_sql[0]['group_by_clause'];}if (!empty($analyzed_sql[0]['having_clause'])) {$count_query .= ' HAVING ' . $analyzed_sql[0]['having_clause'];}} // end if// if using SQL_CALC_FOUND_ROWS, add a LIMIT to avoid// long delays. Returned count will be complete anyway.// (but a LIMIT would disrupt results in an UNION)if (PMA_MYSQL_INT_VERSION >= 40000&& !isset($analyzed_sql[0]['queryflags']['union'])) {$count_query .= ' LIMIT 1';}// run the count queryif (PMA_MYSQL_INT_VERSION < 40000) {if ($cnt_all_result = PMA_DBI_try_query($count_query)) {if ($is_group && $count_what == '*') {$unlim_num_rows = @PMA_DBI_num_rows($cnt_all_result);} else {$unlim_num_rows = PMA_DBI_fetch_assoc($cnt_all_result);$unlim_num_rows = $unlim_num_rows['count'];}PMA_DBI_free_result($cnt_all_result);} else {if (PMA_DBI_getError()) {// there are some cases where the generated// count_query (for MySQL 3) is wrong,// so we get here.//TODO: use a big unlimited query to get// the correct number of rows (depending// on a config variable?)$unlim_num_rows = 0;}}} else {PMA_DBI_try_query($count_query);// if (mysql_error()) {// void.// I tried the case// (SELECT `User`, `Host`, `Db`, `Select_priv` FROM `db`)// UNION (SELECT `User`, `Host`, "%" AS "Db",// `Select_priv`// FROM `user`) ORDER BY `User`, `Host`, `Db`;// and although the generated count_query is wrong// the SELECT FOUND_ROWS() work! (maybe it gets the// count from the latest query that worked)//// another case where the count_query is wrong:// SELECT COUNT(*), f1 from t1 group by f1// and you click to sort on count(*)// }$cnt_all_result = PMA_DBI_query('SELECT FOUND_ROWS() as count;');list($unlim_num_rows) = PMA_DBI_fetch_row($cnt_all_result);@PMA_DBI_free_result($cnt_all_result);}} // end else "just browsing"} else { // not $is_select$unlim_num_rows = 0;} // end rows total count// garvin: if a table or database gets dropped, check column comments.if (isset($purge) && $purge == '1') {require_once './libraries/relation_cleanup.lib.php';if (isset($table) && isset($db) && strlen($table) && strlen($db)) {PMA_relationsCleanupTable($db, $table);} elseif (isset($db) && strlen($db)) {PMA_relationsCleanupDatabase($db);} else {// garvin: VOID. No DB/Table gets deleted.} // end if relation-stuff} // end if ($purge)// garvin: If a column gets dropped, do relation magic.if (isset($cpurge) && $cpurge == '1' && isset($purgekey)&& isset($db) && isset($table)&& strlen($db) && strlen($table) && !empty($purgekey)) {require_once './libraries/relation_cleanup.lib.php';PMA_relationsCleanupColumn($db, $table, $purgekey);} // end if column PMA_* purge} // end else "didn't ask to see php code"// No rows returned -> move back to the calling pageif ($num_rows < 1 || $is_affected) {if ($is_delete) {$message = $strDeletedRows . ' ' . $num_rows;} elseif ($is_insert) {if ($is_replace) {/* For replace we get DELETED + INSERTED row count, so we have to call it affected */$message = $strAffectedRows . ' ' . $num_rows;} else {$message = $strInsertedRows . ' ' . $num_rows;}$insert_id = PMA_DBI_insert_id();if ($insert_id != 0) {// insert_id is id of FIRST record inserted in one insert, so if we inserted multiple rows, we had to increment this$message .= '[br]'.$strInsertedRowId . ' ' . ($insert_id + $num_rows - 1);}} elseif ($is_affected) {$message = $strAffectedRows . ' ' . $num_rows;// Ok, here is an explanation for the !$is_select.// The form generated by sql_query_form.lib.php// and db_details.php has many submit buttons// on the same form, and some confusion arises from the// fact that $zero_rows is sent for every case.// The $zero_rows containing $strSuccess and sent with// the form should not have priority over// errors like $strEmptyResultSet} elseif (!empty($zero_rows) && !$is_select) {$message = $zero_rows;} elseif (!empty($GLOBALS['show_as_php'])) {$message = $strPhp;} elseif (!empty($GLOBALS['validatequery'])) {$message = $strValidateSQL;} else {$message = $strEmptyResultSet;}$message .= ' ' . (isset($GLOBALS['querytime']) ? '(' . sprintf($strQueryTime, $GLOBALS['querytime']) . ')' : '');if ($is_gotofile) {$goto = PMA_securePath($goto);// Checks for a valid target scriptif (isset($table) && $table == '') {unset($table);}if (isset($db) && $db == '') {unset($db);}$is_db = $is_table = false;if (strpos(' ' . $goto, 'tbl_properties') == 1) {if (!isset($table)) {$goto = 'db_details.php';} else {$is_table = @PMA_DBI_query('SHOW TABLES LIKE \'' . PMA_sqlAddslashes($table, true) . '\';', null, PMA_DBI_QUERY_STORE);if (!($is_table && @PMA_DBI_num_rows($is_table))) {$goto = 'db_details.php';unset($table);}@PMA_DBI_free_result($is_table);} // end if... else...}if (strpos(' ' . $goto, 'db_details') == 1) {if (isset($table)) {unset($table);}if (!isset($db)) {$goto = 'main.php';} else {$is_db = @PMA_DBI_select_db($db);if (!$is_db) {$goto = 'main.php';unset($db);}} // end if... else...}// Loads to target scriptif (strpos(' ' . $goto, 'db_details') == 1|| strpos(' ' . $goto, 'tbl_properties') == 1) {$js_to_run = 'functions.js';}if ($goto != 'main.php') {require_once './libraries/header.inc.php';}$active_page = $goto;require './' . $goto;} else {PMA_sendHeaderLocation($cfg['PmaAbsoluteUri'] . str_replace('&', '&', $goto) . '&message=' . urlencode($message));} // end elseexit();} // end no rows returned// At least one row is returned -> displays a table with resultselse {// Displays the headersif (isset($show_query)) {unset($show_query);}if (isset($printview) && $printview == '1') {require_once './libraries/header_printview.inc.php';} else {$js_to_run = 'functions.js';unset($message);if (isset($table) && strlen($table)) {require './libraries/tbl_properties_common.php';$url_query .= '&goto=tbl_properties.php&back=tbl_properties.php';require './libraries/tbl_properties_table_info.inc.php';require './libraries/tbl_properties_links.inc.php';} elseif (isset($db) && strlen($db)) {require './libraries/db_details_common.inc.php';require './libraries/db_details_db_info.inc.php';} else {require './libraries/server_common.inc.php';require './libraries/server_links.inc.php';}}if (isset($db) && strlen($db)) {require_once './libraries/relation.lib.php';$cfgRelation = PMA_getRelationsParam();}// Gets the list of fields propertiesif (isset($result) && $result) {$fields_meta = PMA_DBI_get_fields_meta($result);$fields_cnt = count($fields_meta);}// Display previous update query (from tbl_replace)if (isset($disp_query) && $cfg['ShowSQL'] == true) {$tmp_sql_query = $GLOBALS['sql_query'];$GLOBALS['sql_query'] = $disp_query;PMA_showMessage($disp_message);$GLOBALS['sql_query'] = $tmp_sql_query;}// Displays the results in a tablerequire_once './libraries/display_tbl.lib.php';if (empty($disp_mode)) {// see the "PMA_setDisplayMode()" function in// libraries/display_tbl.lib.php$disp_mode = 'urdr111101';}if (!isset($dontlimitchars)) {$dontlimitchars = 0;}// hide edit and delete links for information_schemaif (PMA_MYSQL_INT_VERSION >= 50002 && isset($db) && $db == 'information_schema') {$disp_mode = 'nnnn110111';}PMA_displayTable($result, $disp_mode, $analyzed_sql);PMA_DBI_free_result($result);// BEGIN INDEX CHECK See if indexes should be checked.if (isset($query_type) && $query_type == 'check_tbl' && isset($selected) && is_array($selected)) {foreach ($selected AS $idx => $tbl_name) {$indexes = $indexes_info = $indexes_data = array();$tbl_ret_keys = PMA_get_indexes(urldecode($tbl_name), $err_url_0);PMA_extract_indexes($tbl_ret_keys, $indexes, $indexes_info, $indexes_data);$idx_collection = PMA_show_indexes(urldecode($tbl_name), $indexes, $indexes_info, $indexes_data, false);$check = PMA_check_indexes($idx_collection);if (!empty($check)) {?><table border="0" cellpadding="2" cellspacing="0"><tr><td class="tblHeaders" colspan="7"><?php printf($strIndexWarningTable, urldecode($tbl_name)); ?></td></tr><?php echo $check; ?></table><?php}}} // End INDEX CHECKif ($disp_mode[6] == '1' || $disp_mode[9] == '1') {echo "\n";echo '<hr />' . "\n";// Displays "Insert a new row" link if requiredif ($disp_mode[6] == '1') {$lnk_goto = 'sql.php?'. PMA_generate_common_url($db, $table). '&pos=' . $pos. '&session_max_rows=' . $session_max_rows. '&disp_direction=' . $disp_direction. '&repeat_cells=' . $repeat_cells. '&dontlimitchars=' . $dontlimitchars. '&sql_query=' . urlencode($sql_query);$url_query = '?'. PMA_generate_common_url($db, $table). '&pos=' . $pos. '&session_max_rows=' . $session_max_rows. '&disp_direction=' . $disp_direction. '&repeat_cells=' . $repeat_cells. '&dontlimitchars=' . $dontlimitchars. '&sql_query=' . urlencode($sql_query). '&goto=' . urlencode($lnk_goto);echo ' <!-- Insert a new row -->' . "\n";echo PMA_linkOrButton('tbl_change.php' . $url_query,($cfg['PropertiesIconic'] ? '<img class="icon" src="' . $pmaThemeImage . 'b_insrow.png" height="16" width="16" alt="' . $strInsertNewRow . '"/>' : '') . $strInsertNewRow,'', true, true, '') . "\n";if ($disp_mode[9] == '1') {echo ' ';}echo "\n";} // end insert new row// Displays "printable view" link if requiredif ($disp_mode[9] == '1') {$url_query = '?'. PMA_generate_common_url($db, $table). '&pos=' . $pos. '&session_max_rows=' . $session_max_rows. '&disp_direction=' . $disp_direction. '&repeat_cells=' . $repeat_cells. '&printview=1'. '&sql_query=' . urlencode($sql_query);echo ' <!-- Print view -->' . "\n";echo PMA_linkOrButton('sql.php' . $url_query . ((isset($dontlimitchars) && $dontlimitchars == '1') ? '&dontlimitchars=1' : ''),($cfg['PropertiesIconic'] ? '<img class="icon" src="' . $pmaThemeImage . 'b_print.png" height="16" width="16" alt="' . $strPrintView . '"/>' : '') . $strPrintView,'', true, true, 'print_view') . "\n";if (!$dontlimitchars) {echo ' ' . "\n";echo PMA_linkOrButton('sql.php' . $url_query . '&dontlimitchars=1',($cfg['PropertiesIconic'] ? '<img class="icon" src="' . $pmaThemeImage . 'b_print.png" height="16" width="16" alt="' . $strPrintViewFull . '"/>' : '') . $strPrintViewFull,'', true, true, 'print_view') . "\n";}} // end displays "printable view"echo "\n";}// Export link// (the url_query has extra parameters that won't be used to export)// (the single_table parameter is used in display_export.lib.php// to hide the SQL and the structure export dialogs)if (isset($analyzed_sql[0]) && $analyzed_sql[0]['querytype'] == 'SELECT' && !isset($printview)) {if (isset($analyzed_sql[0]['table_ref'][0]['table_true_name']) && !isset($analyzed_sql[0]['table_ref'][1]['table_true_name'])) {$single_table = '&single_table=true';} else {$single_table = '';}echo ' <!-- Export -->' . "\n";echo ' ' . "\n";echo PMA_linkOrButton('tbl_properties_export.php' . $url_query . '&unlim_num_rows=' . $unlim_num_rows . $single_table,($cfg['PropertiesIconic'] ? '<img class="icon" src="' . $pmaThemeImage . 'b_tblexport.png" height="16" width="16" alt="' . $strExport . '" />' : '') . $strExport,'', true, true, '') . "\n";}// Bookmark Support if requiredif ($disp_mode[7] == '1'&& (isset($cfg['Bookmark']) && $cfg['Bookmark']['db'] && $cfg['Bookmark']['table'] && empty($id_bookmark))&& !empty($sql_query)) {echo "\n";$goto = 'sql.php?'. PMA_generate_common_url($db, $table). '&pos=' . $pos. '&session_max_rows=' . $session_max_rows. '&disp_direction=' . $disp_direction. '&repeat_cells=' . $repeat_cells. '&dontlimitchars=' . $dontlimitchars. '&sql_query=' . urlencode($sql_query). '&id_bookmark=1';if ($disp_mode[3] == '1') {echo ' <i>' . $strOr . '</i>';} else {echo '<br /><br />';}?><form action="sql.php" method="post" onsubmit="return emptyFormElements(this, 'fields[label]');"><?php echo PMA_generate_common_hidden_inputs(); ?><input type="hidden" name="goto" value="<?php echo $goto; ?>" /><input type="hidden" name="fields[dbase]" value="<?php echo htmlspecialchars($db); ?>" /><input type="hidden" name="fields[user]" value="<?php echo $cfg['Bookmark']['user']; ?>" /><input type="hidden" name="fields[query]" value="<?php echo urlencode(isset($complete_query) ? $complete_query : $sql_query); ?>" /><fieldset><legend><?phpecho ($cfg['PropertiesIconic'] ? '<img class="icon" src="' . $pmaThemeImage . 'b_bookmark.png" width="16" height="16" alt="' . $strBookmarkThis . '" />' : ''). $strBookmarkThis;?></legend><div class="formelement"><label for="fields_label_"><?php echo $strBookmarkLabel; ?>:</label><input type="text" id="fields_label_" name="fields[label]" value="" /></div><div class="formelement"><input type="checkbox" name="bkm_all_users" id="bkm_all_users" value="true" /><label for="bkm_all_users"><?php echo $strBookmarkAllUsers; ?></label></div><div class="clearfloat"></div></fieldset><fieldset class="tblFooters"><input type="submit" name="store_bkm" value="<?php echo $strBookmarkThis; ?>" /></fieldset></form><?php} // end bookmark support// Do print the page if requiredif (isset($printview) && $printview == '1') {?><script type="text/javascript" language="javascript">//<![CDATA[// Do print the pagewindow.onload = function(){if (typeof(window.print) != 'undefined') {window.print();}}//]]></script><?php} // end print case} // end rows returned} // end executes the query/*** Displays the footer*/require_once './libraries/footer.inc.php';?>