Documentation TYPO3 par Ameos

common.lib.php

00001 <?php
00002 /* $Id: common.lib.php,v 2.151.2.1 2005/10/21 02:40:23 lem9 Exp $ */
00003 // vim: expandtab sw=4 ts=4 sts=4:
00004 
00050 // grab_globals.lib.php should really go before common.lib.php
00051 // TODO: remove direct calling from elsewhere
00052 require_once('./libraries/grab_globals.lib.php');
00053 
00058 if (!isset($is_minimum_common)) {
00059     $is_minimum_common = FALSE;
00060 }
00061 
00065 if (!isset($use_backquotes)) {
00066     $use_backquotes   = 0;
00067 }
00068 if (!isset($pos)) {
00069     $pos              = 0;
00070 }
00071 
00076 unset($cfg);
00077 
00081 if (file_exists('./config.inc.developer.php')) {
00082     $cfgfile_to_load = 'config.inc.developer.php';
00083 } else {
00084     $cfgfile_to_load = 'config.inc.php';
00085 }
00086 
00091 $old_error_reporting = error_reporting(0);
00092 // We can not use include as it fails on parse error
00093 $config_fd = fopen($cfgfile_to_load, 'r');
00094 $result = eval('?>' . fread($config_fd, filesize($cfgfile_to_load)));
00095 fclose($config_fd);
00096 // Eval failed
00097 if ($result === FALSE || (!isset($cfgServers) && !isset($cfg['Servers']))) {
00098     // Creates fake settings
00099     $cfg = array('DefaultLang'           => 'en-iso-8859-1',
00100                     'AllowAnywhereRecoding' => FALSE);
00101     // Loads the language file
00102     require_once('./libraries/select_lang.lib.php');
00103     // Displays the error message
00104     // (do not use &amp; for parameters sent by header)
00105     header( 'Location: error.php'
00106             . '?lang='  . urlencode( $available_languages[$lang][2] )
00107             . '&char='  . urlencode( $charset )
00108             . '&dir='   . urlencode( $text_dir )
00109             . '&type='  . urlencode( $strError )
00110             . '&error=' . urlencode( strtr($strConfigFileError, array('<br />' => '[br]')) . '[br][br]' . '[a@' . $cfgfile_to_load . '@_blank]' . $cfgfile_to_load . '[/a]' )
00111              );
00112     exit();
00113 }
00114 error_reporting($old_error_reporting);
00115 unset($old_error_reporting, $cfgfile_to_load);
00116 
00121 if (isset($cfg['FileRevision'])) {
00122     // converting revision string into an array
00123     //     e.g. "Revision: 2.0" becomes array(2, 0).
00124     $cfg['FileRevision'] = str_replace('$' . 'Revision: ', '', $cfg['FileRevision']);
00125     $cfg['FileRevision'] = str_replace(' $', '', $cfg['FileRevision']);
00126     $cfg['FileRevision'] = explode('.', $cfg['FileRevision']);
00127 } else {
00128     $cfg['FileRevision'] = array(1, 1);
00129 }
00130 if ($cfg['FileRevision'][0] < 2 || ($cfg['FileRevision'][0] == 2 && $cfg['FileRevision'][1] < 64)) {
00131     require_once('./libraries/config_import.lib.php');
00132 }
00133 
00137 require_once('./libraries/select_lang.lib.php');
00143 require_once('./libraries/defines.lib.php');
00144 
00145 /* Input sanitizing */
00146 require_once('./libraries/sanitizing.lib.php');
00147 
00148 // XSS
00149 if (isset($convcharset)) {
00150     $convcharset = PMA_sanitize($convcharset);
00151 }
00152 
00153 if ($is_minimum_common == FALSE) {
00158       $is_upload = TRUE;
00159       if (strtolower(@ini_get('file_uploads')) == 'off'
00160              || @ini_get('file_uploads') == 0) {
00161           $is_upload = FALSE;
00162       }
00163 
00171     function get_real_size($size=0) {
00173         if (!$size) {
00174             return 0;
00175         }
00176         $scan['MB'] = 1048576;
00177         $scan['Mb'] = 1048576;
00178         $scan['M'] = 1048576;
00179         $scan['m'] = 1048576;
00180         $scan['KB'] = 1024;
00181         $scan['Kb'] = 1024;
00182         $scan['K'] = 1024;
00183         $scan['k'] = 1024;
00184 
00185         while (list($key) = each($scan)) {
00186             if ((strlen($size)>strlen($key))&&(substr($size, strlen($size) - strlen($key))==$key)) {
00187                 $size = substr($size, 0, strlen($size) - strlen($key)) * $scan[$key];
00188                 break;
00189             }
00190         }
00191         return $size;
00192     } // end function
00193 
00194 
00195     if (!$filesize = ini_get('upload_max_filesize')) {
00196         $filesize = "5M";
00197     }
00198     $max_upload_size = get_real_size($filesize);
00199 
00200     if ($postsize = ini_get('post_max_size')) {
00201         $postsize = get_real_size($postsize);
00202         if ($postsize < $max_upload_size) {
00203             $max_upload_size = $postsize;
00204         }
00205     }
00206     unset($filesize);
00207     unset($postsize);
00208 
00222      function PMA_displayMaximumUploadSize($max_upload_size) {
00223          list($max_size, $max_unit) = PMA_formatByteDown($max_upload_size);
00224          return '(' . sprintf($GLOBALS['strMaximumSize'], $max_size, $max_unit) . ')';
00225      }
00226 
00237      function PMA_generateHiddenMaxFileSize($max_size){
00238          return '<input type="hidden" name="MAX_FILE_SIZE" value="' .$max_size . '" />';
00239      }
00240 
00244     require_once('./libraries/charset_conversion.lib.php');
00245 
00249     require_once('./libraries/string.lib.php');
00250 }
00251 
00264 function PMA_securePath($path) {
00265 
00266     // change .. to .
00267     $path = preg_replace('@\.\.*@','.',$path);
00268 
00269     return $path;
00270 } // end function
00271 
00272 // If zlib output compression is set in the php configuration file, no
00273 // output buffering should be run
00274 if (@ini_get('zlib.output_compression')) {
00275     $cfg['OBGzip'] = FALSE;
00276 }
00277 
00278 // disable output-buffering (if set to 'auto') for IE6, else enable it.
00279 if (strtolower($cfg['OBGzip']) == 'auto') {
00280     if (PMA_USR_BROWSER_AGENT == 'IE' && PMA_USR_BROWSER_VER >= 6 && PMA_USR_BROWSER_VER < 7) {
00281         $cfg['OBGzip'] = FALSE;
00282     } else {
00283         $cfg['OBGzip'] = TRUE;
00284     }
00285 }
00286 
00287 
00288 /* Theme Manager
00289  * 2004-05-20 Michael Keck (mail_at_michaelkeck_dot_de)
00290  *            This little script checks if there're themes available
00291  *            and if the directory $ThemePath/$theme/img/ exists
00292  *            If not, it will use default images
00293 */
00294 // Allow different theme per server
00295 $theme_cookie_name = 'pma_theme';
00296 if ($GLOBALS['cfg']['ThemePerServer'] && isset($server)) {
00297     $theme_cookie_name .= '-' . $server;
00298 }
00299 //echo $theme_cookie_name;
00300 // Theme Manager
00301 if (!$cfg['ThemeManager'] || !isset($_COOKIE[$theme_cookie_name]) || empty($_COOKIE[$theme_cookie_name])){
00302     $GLOBALS['theme'] = $cfg['ThemeDefault'];
00303     $ThemeDefaultOk = FALSE;
00304     if ($cfg['ThemePath']!='' && $cfg['ThemePath'] != FALSE) {
00305         $tmp_theme_mainpath = $cfg['ThemePath'];
00306         $tmp_theme_fullpath = $cfg['ThemePath'] . '/' .$cfg['ThemeDefault'];
00307         if (@is_dir($tmp_theme_mainpath)) {
00308             if (isset($cfg['ThemeDefault']) && @is_dir($tmp_theme_fullpath)) {
00309                 $ThemeDefaultOk = TRUE;
00310             }
00311         }
00312     }
00313     if ($ThemeDefaultOk == TRUE){
00314         $GLOBALS['theme'] = $cfg['ThemeDefault'];
00315     } else {
00316         $GLOBALS['theme'] = 'original';
00317     }
00318 } else {
00319     // if we just changed theme, we must take the new one so that
00320     // index.php takes the correct one for height computing
00321     if (isset($_POST['set_theme'])) {
00322         $GLOBALS['theme'] = PMA_securePath($_POST['set_theme']);
00323     } else {
00324         $GLOBALS['theme'] = PMA_securePath($_COOKIE[$theme_cookie_name]);
00325     }
00326 }
00327 
00328 // check for theme requires/name
00329 unset($theme_name, $theme_generation, $theme_version);
00330 @include($cfg['ThemePath'] . '/' . $GLOBALS['theme'] . '/info.inc.php');
00331 
00332 // did it set correctly?
00333 if (!isset($theme_name, $theme_generation, $theme_version)) {
00334     $GLOBALS['theme'] = 'original'; // invalid theme
00335 } elseif ($theme_generation != PMA_THEME_GENERATION) {
00336     $GLOBALS['theme'] = 'original'; // different generation
00337 } elseif ($theme_version < PMA_THEME_VERSION) {
00338     $GLOBALS['theme'] = 'original'; // too old version
00339 }
00340 
00341 $pmaThemeImage  = $cfg['ThemePath'] . '/' . $GLOBALS['theme'] . '/img/';
00342 $tmp_layout_file = $cfg['ThemePath'] . '/' . $GLOBALS['theme'] . '/layout.inc.php';
00343 if (@file_exists($tmp_layout_file)) {
00344     include($tmp_layout_file);
00345 }
00346 if (!is_dir($pmaThemeImage)) {
00347     $pmaThemeImage = $cfg['ThemePath'] . '/original/img/';
00348 }
00349 // end theme manager
00350 
00354  // (could be improved by executing it after the MySQL connection only if
00355  //  PMA_MYSQL_INT_VERSION >= 40100 )
00356 if (isset($_COOKIE) && !empty($_COOKIE['pma_collation_connection']) && empty($_POST['collation_connection'])) {
00357     $collation_connection = $_COOKIE['pma_collation_connection'];
00358 }
00359 
00360 
00361 if ($is_minimum_common == FALSE) {
00365     require_once('./libraries/url_generating.lib.php');
00366 
00384     function PMA_sqlAddslashes($a_string = '', $is_like = FALSE, $crlf = FALSE, $php_code = FALSE)
00385     {
00386         if ($is_like) {
00387             $a_string = str_replace('\\', '\\\\\\\\', $a_string);
00388         } else {
00389             $a_string = str_replace('\\', '\\\\', $a_string);
00390         }
00391 
00392         if ($crlf) {
00393             $a_string = str_replace("\n", '\n', $a_string);
00394             $a_string = str_replace("\r", '\r', $a_string);
00395             $a_string = str_replace("\t", '\t', $a_string);
00396         }
00397 
00398         if ($php_code) {
00399             $a_string = str_replace('\'', '\\\'', $a_string); 
00400         } else {
00401             $a_string = str_replace('\'', '\'\'', $a_string);
00402         } 
00403 
00404         return $a_string;
00405     } // end of the 'PMA_sqlAddslashes()' function
00406 
00407 
00419     function PMA_escape_mysql_wildcards($name)
00420     {
00421         $name = str_replace('_', '\\_', $name);
00422         $name = str_replace('%', '\\%', $name);
00423 
00424         return $name;
00425     } // end of the 'PMA_escape_mysql_wildcards()' function
00426 
00427 
00442     function PMA_formatSql($parsed_sql, $unparsed_sql = '')
00443     {
00444         global $cfg;
00445 
00446         // Check that we actually have a valid set of parsed data
00447         // well, not quite
00448         // first check for the SQL parser having hit an error
00449         if (PMA_SQP_isError()) {
00450             return $parsed_sql;
00451         }
00452         // then check for an array
00453         if (!is_array($parsed_sql)) {
00454             // We don't so just return the input directly
00455             // This is intended to be used for when the SQL Parser is turned off
00456             $formatted_sql = '<pre>' . "\n"
00457                             . (($cfg['SQP']['fmtType'] == 'none' && $unparsed_sql != '') ? $unparsed_sql : $parsed_sql) . "\n"
00458                             . '</pre>';
00459             return $formatted_sql;
00460         }
00461 
00462         $formatted_sql        = '';
00463 
00464         switch ($cfg['SQP']['fmtType']) {
00465             case 'none':
00466                 if ($unparsed_sql != '') {
00467                     $formatted_sql = "<pre>\n" . PMA_SQP_formatNone(array('raw' => $unparsed_sql)) . "\n</pre>";
00468                 } else {
00469                     $formatted_sql = PMA_SQP_formatNone($parsed_sql);
00470                 }
00471                 break;
00472             case 'html':
00473                 $formatted_sql = PMA_SQP_formatHtml($parsed_sql,'color');
00474                 break;
00475             case 'text':
00476                 //$formatted_sql = PMA_SQP_formatText($parsed_sql);
00477                 $formatted_sql = PMA_SQP_formatHtml($parsed_sql,'text');
00478                 break;
00479             default:
00480                 break;
00481         } // end switch
00482 
00483         return $formatted_sql;
00484     } // end of the "PMA_formatSql()" function
00485 
00486 
00497 // 2004-05-04: replaced with a modified function from Michael Keck (mkkeck)
00498         function PMA_showMySQLDocu($chapter, $link)
00499         {
00500 
00501             if (!empty($GLOBALS['cfg']['MySQLManualBase'])) {
00502                 if (!empty($GLOBALS['cfg']['MySQLManualType'])) {
00503                     switch ($GLOBALS['cfg']['MySQLManualType']) {
00504                         case 'old':
00505                             if ($GLOBALS['cfg']['ReplaceHelpImg']) {
00506                                 return '<a href="' . $GLOBALS['cfg']['MySQLManualBase'] . '/' . $link[0] . '/' . $link[1] . '/' . $link . '.html" target="mysql_doc"><img src="' . $GLOBALS['pmaThemeImage'] . 'b_help.png" width="11" height="11" border="0" alt="' . $GLOBALS['strDocu'] . '" title="' . $GLOBALS['strDocu'] . '" hspace="2" align="middle" /></a>';
00507                             }else{
00508                                 return '[<a href="' . $GLOBALS['cfg']['MySQLManualBase'] . '/' . $link[0] . '/' . $link[1] . '/' . $link . '.html" target="mysql_doc">' . $GLOBALS['strDocu'] . '</a>]';
00509                            }
00510                         case 'chapters':
00511                             if ($GLOBALS['cfg']['ReplaceHelpImg']) {
00512                                 return '<a href="' . $GLOBALS['cfg']['MySQLManualBase'] . '/manual_' . $chapter . '.html#' . $link . '" target="mysql_doc"><img src="' . $GLOBALS['pmaThemeImage'] . 'b_help.png" width="11" height="11" border="0" alt="' . $GLOBALS['strDocu'] . '" title="' . $GLOBALS['strDocu'] . '" hspace="2" align="middle" /></a>';
00513                            } else {
00514                                return '[<a href="' . $GLOBALS['cfg']['MySQLManualBase'] . '/manual_' . $chapter . '.html#' . $link . '" target="mysql_doc">' . $GLOBALS['strDocu'] . '</a>]'; }
00515                         case 'big':
00516                             if ($GLOBALS['cfg']['ReplaceHelpImg']) {
00517                                 return '<a href="' . $GLOBALS['cfg']['MySQLManualBase'] . '#' . $link . '" target="mysql_doc"><img src="' . $GLOBALS['pmaThemeImage'] . 'b_help.png" width="11" height="11" border="0" alt="' . $GLOBALS['strDocu'] . '" title="' . $GLOBALS['strDocu'] . '" hspace="2" align="middle" /></a>';
00518                             } else {
00519                                 return '[<a href="' . $GLOBALS['cfg']['MySQLManualBase'] . '#' . $link . '" target="mysql_doc">' . $GLOBALS['strDocu'] . '</a>]';
00520                             }
00521                         case 'none':
00522                             return '';
00523                         case 'searchable':
00524                         default:
00525                             if ($GLOBALS['cfg']['ReplaceHelpImg']) {
00526                                 return '<a href="' . $GLOBALS['cfg']['MySQLManualBase'] . '/' . $link . '.html" target="mysql_doc"><img src="' . $GLOBALS['pmaThemeImage'] . 'b_help.png" width="11" height="11" border="0" alt="' . $GLOBALS['strDocu'] . '" title="' . $GLOBALS['strDocu'] . '" hspace="2" align="middle" /></a>';
00527                             } else {
00528                                 return '[<a href="' . $GLOBALS['cfg']['MySQLManualBase'] . '/' . $link . '.html" target="mysql_doc">' . $GLOBALS['strDocu'] . '</a>]';
00529                             }
00530                     }
00531                 } else {
00532                     // no Type defined, show the old one
00533                     if ($GLOBALS['cfg']['ReplaceHelpImg']) {
00534                         return '<a href="' . $GLOBALS['cfg']['MySQLManualBase'] . '/' . $link[0] . '/' . $link[1] . '/' . $link . '.html" target="mysql_doc"><img src="' . $GLOBALS['pmaThemeImage'] . 'b_help.png" width="11" height="11" border="0" alt="' . $GLOBALS['strDocu'] . '" title="' . $GLOBALS['strDocu'] . '" hspace="2" align="middle" /></a>';
00535                     } else {
00536                         return '[<a href="' . $GLOBALS['cfg']['MySQLManualBase'] . '/' . $link[0] . '/' . $link[1] . '/' . $link . '.html" target="mysql_doc">' . $GLOBALS['strDocu'] . '</a>]';
00537                     }
00538                 }
00539             } else {
00540                 // no URL defined
00541                 if (!empty($GLOBALS['cfg']['ManualBaseShort'])) {
00542                     // the old configuration
00543                     if ($GLOBALS['cfg']['ReplaceHelpImg']) {
00544                         return '<a href="' . $GLOBALS['cfg']['MySQLManualBase'] . '/' . $link[0] . '/' . $link[1] . '/' . $link . '.html" target="mysql_doc"><img src="' . $GLOBALS['pmaThemeImage'] . 'b_help.png" width="11" height="11" border="0" alt="' . $GLOBALS['strDocu'] . '" title="' . $GLOBALS['strDocu'] . '" hspace="2" align="middle" /></a>';
00545                     } else {
00546                         return '[<a href="' . $GLOBALS['cfg']['MySQLManualBase'] . '/' . $link[0] . '/' . $link[1] . '/' . $link . '.html" target="mysql_doc">' . $GLOBALS['strDocu'] . '</a>]';
00547                    }
00548                 } else {
00549                     return '';
00550                 }
00551             }
00552         }
00553                  // end of the 'PMA_showDocu()' function
00554 
00562      function PMA_showHint($hint_message)
00563      {
00564          //return '<img class="lightbulb" src="' . $GLOBALS['pmaThemeImage'] . 'b_tipp.png" width="16" height="16" border="0" alt="' . $hint_message . '" title="' . $hint_message . '" align="middle" onclick="alert(\'' . PMA_jsFormat($hint_message, FALSE) . '\');" />';
00565          return '<img class="lightbulb" src="' . $GLOBALS['pmaThemeImage'] . 'b_tipp.png" width="16" height="16" border="0" alt="Tip" title="Tip" align="middle" onmouseover="pmaTooltip(\'' .  PMA_jsFormat($hint_message, FALSE) . '\'); return false;" onmouseout="swapTooltip(\'default\'); return false;" />';
00566      }
00567 
00581     function PMA_mysqlDie($error_message = '', $the_query = '',
00582                             $is_modify_link = TRUE, $back_url = '',
00583                             $exit = TRUE)
00584     {
00585         global $cfg, $table, $db, $sql_query;
00586 
00587         require_once('./header.inc.php');
00588 
00589         if (!$error_message) {
00590             $error_message = PMA_DBI_getError();
00591         }
00592         if (!$the_query && !empty($GLOBALS['sql_query'])) {
00593             $the_query = $GLOBALS['sql_query'];
00594         }
00595 
00596         // --- Added to solve bug #641765
00597         // Robbat2 - 12 January 2003, 9:46PM
00598         // Revised, Robbat2 - 13 January 2003, 2:59PM
00599         if (!function_exists('PMA_SQP_isError') || PMA_SQP_isError()) {
00600             $formatted_sql = htmlspecialchars($the_query);
00601         } else {
00602             $formatted_sql = PMA_formatSql(PMA_SQP_parse(PMA_sanitize($the_query)), $the_query);
00603         }
00604         // ---
00605         echo "\n" . '<!-- PMA-SQL-ERROR -->' . "\n";
00606         echo '    <table border="0" cellpadding="2" cellspacing="1">'
00607            . '        <tr>' . "\n"
00608            . '            <th class="tblHeadError"><div class="errorhead">' . $GLOBALS['strError'] . '</div></th>' . "\n"
00609            . '        </tr>' . "\n"
00610            . '        <tr>' . "\n"
00611            . '            <td>';
00612         // if the config password is wrong, or the MySQL server does not
00613         // respond, do not show the query that would reveal the
00614         // username/password
00615         if (!empty($the_query) && !strstr($the_query, 'connect')) {
00616             // --- Added to solve bug #641765
00617             // Robbat2 - 12 January 2003, 9:46PM
00618             // Revised, Robbat2 - 13 January 2003, 2:59PM
00619             if (function_exists('PMA_SQP_isError') && PMA_SQP_isError()) {
00620                 echo PMA_SQP_getErrorString();
00621             }
00622             // ---
00623             // modified to show me the help on sql errors (Michael Keck)
00624             echo '<div class="tblWarn"><p>' . "\n";
00625             echo '    <b>' . $GLOBALS['strSQLQuery'] . ':</b>' . "\n";
00626             if (strstr(strtolower($formatted_sql),'select')) { // please show me help to the error on select
00627                 echo PMA_showMySQLDocu('Reference', 'SELECT');
00628             }
00629             if ($is_modify_link && isset($db)) {
00630                 if (isset($table)) {
00631                     $doedit_goto = '<a href="tbl_properties.php?' . PMA_generate_common_url($db, $table) . '&amp;sql_query=' . urlencode($the_query) . '&amp;show_query=1">';
00632                 } else {
00633                     $doedit_goto = '<a href="db_details.php?' . PMA_generate_common_url($db) . '&amp;sql_query=' . urlencode($the_query) . '&amp;show_query=1">';
00634                 }
00635                 if ($GLOBALS['cfg']['PropertiesIconic']) {
00636                     echo $doedit_goto
00637                        . '<img src=" '. $GLOBALS['pmaThemeImage'] . 'b_edit.png" width="16" height="16" border="0" hspace="2" align="middle" alt="' . $GLOBALS['strEdit'] .'" />'
00638                        . '</a>';
00639                 } else {
00640                     echo '    ['
00641                        . $doedit_goto . $GLOBALS['strEdit'] . '</a>'
00642                        . ']' . "\n";
00643                 }
00644             } // end if
00645             echo '</p>' . "\n"
00646                     . '<p>' . "\n"
00647                     . '    ' . $formatted_sql . "\n"
00648                     . '</p></div>' . "\n";
00649         } // end if
00650 
00651         $tmp_mysql_error = ''; // for saving the original $error_message
00652         if (!empty($error_message)) {
00653             $tmp_mysql_error = strtolower($error_message); // save the original $error_message
00654             $error_message = htmlspecialchars($error_message);
00655             $error_message = preg_replace("@((\015\012)|(\015)|(\012)){3,}@", "\n\n", $error_message);
00656         }
00657         // modified to show me the help on error-returns (Michael Keck)
00658         echo '<div class="tblWarn"><p>' . "\n"
00659                 . '    <b>' . $GLOBALS['strMySQLSaid'] . '</b>'
00660                 . PMA_showMySQLDocu('Error-returns', 'Error-returns')
00661                 . "\n"
00662                 . '</p>' . "\n";
00663 
00664         // The error message will be displayed within a CODE segment.
00665         // To preserve original formatting, but allow wordwrapping, we do a couple of replacements
00666 
00667         // Replace all non-single blanks with their HTML-counterpart
00668         $error_message = str_replace('  ', '&nbsp;&nbsp;', $error_message);
00669         // Replace TAB-characters with their HTML-counterpart
00670         $error_message = str_replace("\t", '&nbsp;&nbsp;&nbsp;&nbsp;', $error_message);
00671         // Replace linebreaks
00672         $error_message = nl2br($error_message);
00673 
00674         echo '<code>' . "\n"
00675             . $error_message . "\n"
00676             . '</code><br />' . "\n";
00677 
00678         // feature request #1036254:
00679         // Add a link by MySQL-Error #1062 - Duplicate entry
00680         // 2004-10-20 by mkkeck
00681         // 2005-01-17 modified by mkkeck bugfix
00682         if (substr($error_message, 1, 4) == '1062') {
00683             // get the duplicate entry
00684             $mysql_error_values = array();
00685             $mysql_error_words  = explode(' ',$tmp_mysql_error);
00686             foreach ($mysql_error_words as $mysql_error_word) {
00687                 if (strstr($mysql_error_word, "'")) {
00688                    $mysql_error_values = explode('-', preg_replace("/'/", "", $mysql_error_word));
00689                    break; // exit 'foreach'
00690                 }
00691             }
00692             $duplicate_sql_query = '';
00693             if (isset($mysql_error_values[0])) {
00694                 $tmp_fields = PMA_DBI_get_fields($db, $table, NULL);
00695                 if ($tmp_fields) {
00696                     foreach ($tmp_fields as $tmp_field) {
00697                         $duplicate_sql_query .= (($duplicate_sql_query!='') ? ' OR ' : '') . PMA_backquote($tmp_field['Field']) . " LIKE '" . $mysql_error_values[0] . "'";
00698                     }
00699                 }
00700             }
00701             if ($duplicate_sql_query!='') {
00702                 $duplicate_sql_query = "SELECT * FROM " . PMA_backquote($table) . " WHERE (" . $duplicate_sql_query . ")";
00703             } else {
00704                 $duplicate_sql_query = "SELECT * FROM " . PMA_backquote($table) . "";
00705             }
00706             echo '        <form method="post" action="read_dump.php" style="padding: 0px; margin: 0px">' ."\n"
00707                     . '            <input type="hidden" name="sql_query" value="' . $duplicate_sql_query . '" />' . "\n"
00708                     . '            ' . PMA_generate_common_hidden_inputs($db, $table) . "\n"
00709                     . '            <input type="submit" name="submit" value="' . $GLOBALS['strBrowse'] . '" />' . "\n"
00710                     . '        </form>' . "\n";
00711         } // end of show duplicate entry
00712 
00713         echo '</div>';
00714 
00715         if (!empty($back_url) && $exit) {
00716             $goto_back_url='<a href="' . (strstr($back_url, '?') ? $back_url . '&amp;no_history=true' : $back_url . '?no_history=true') . '">&nbsp;';
00717             echo '            </td> ' . "\n"
00718                . '        </tr>' . "\n"
00719                . '        <tr><td class="tblHeaders" align="center">';
00720             echo '[' . $goto_back_url . $GLOBALS['strBack'] . '&nbsp;</a>]';
00721         }
00722         echo '            </td>' . "\n"
00723            . '        </tr>' . "\n"
00724            . '    </table>' . "\n\n";
00725         if ($exit) {
00726             require_once('./footer.inc.php');
00727         }
00728     } // end of the 'PMA_mysqlDie()' function
00729 
00730 
00742     function PMA_isInto($toFind = '', &$in)
00743     {
00744         $max = count($in);
00745         for ($i = 0; $i < $max && ($toFind != $in[$i]); $i++) {
00746             // void();
00747         }
00748 
00749         return ($i < $max) ? $i : -1;
00750     }  // end of the 'PMA_isInto()' function
00751 
00752 
00764     function PMA_convert_using($string, $mode='unquoted') {
00765 
00766         if ($mode == 'quoted') {
00767             $possible_quote = "'";
00768         } else {
00769             $possible_quote = "";
00770         }
00771 
00772         if (PMA_MYSQL_INT_VERSION >= 40100) {
00773             list($conn_charset) = explode('_', $GLOBALS['collation_connection']);
00774             $converted_string = "CONVERT(" . $possible_quote . $string . $possible_quote . " USING " . $conn_charset . ")";
00775         } else {
00776             $converted_string = $possible_quote . $string . $possible_quote;
00777         }
00778         return $converted_string;
00779     } // end function
00780 
00781 }
00782 
00798 function PMA_safe_db_list($only_db_check, $dbh, $dblist_cnt, $rs, $userlink, $cfg, $dblist) {
00799     if ($only_db_check == FALSE) {
00800         // try to get the available dbs list
00801         // use userlink by default
00802         $dblist = PMA_DBI_get_dblist();
00803         $dblist_cnt   = count($dblist);
00804 
00805         // did not work so check for available databases in the "mysql" db;
00806         // I don't think we can fall here now...
00807         if (!$dblist_cnt) {
00808             $auth_query   = 'SELECT User, Select_priv '
00809                           . 'FROM mysql.user '
00810                           . 'WHERE User = \'' . PMA_sqlAddslashes($cfg['Server']['user']) . '\'';
00811             $rs           = PMA_DBI_try_query($auth_query, $dbh);
00812         } // end
00813     }
00814 
00815     // Access to "mysql" db allowed and dblist still empty -> gets the
00816     // usable db list
00817     if (!$dblist_cnt
00818         && ($rs && @PMA_DBI_num_rows($rs))) {
00819         $row = PMA_DBI_fetch_assoc($rs);
00820         PMA_DBI_free_result($rs);
00821         // Correction uva 19991215
00822         // Previous code assumed database "mysql" admin table "db" column
00823         // "db" contains literal name of user database, and works if so.
00824         // Mysql usage generally (and uva usage specifically) allows this
00825         // column to contain regular expressions (we have all databases
00826         // owned by a given student/faculty/staff beginning with user i.d.
00827         // and governed by default by a single set of privileges with
00828         // regular expression as key). This breaks previous code.
00829         // This maintenance is to fix code to work correctly for regular
00830         // expressions.
00831         if ($row['Select_priv'] != 'Y') {
00832 
00833             // 1. get allowed dbs from the "mysql.db" table
00834             // lem9: User can be blank (anonymous user)
00835             $local_query = 'SELECT DISTINCT Db FROM mysql.db WHERE Select_priv = \'Y\' AND (User = \'' . PMA_sqlAddslashes($cfg['Server']['user']) . '\' OR User = \'\')';
00836             $rs          = PMA_DBI_try_query($local_query, $dbh);
00837             if ($rs && @PMA_DBI_num_rows($rs)) {
00838                 // Will use as associative array of the following 2 code
00839                 // lines:
00840                 //   the 1st is the only line intact from before
00841                 //     correction,
00842                 //   the 2nd replaces $dblist[] = $row['Db'];
00843                 $uva_mydbs = array();
00844                 // Code following those 2 lines in correction continues
00845                 // populating $dblist[], as previous code did. But it is
00846                 // now populated with actual database names instead of
00847                 // with regular expressions.
00848                 while ($row = PMA_DBI_fetch_assoc($rs)) {
00849                     // loic1: all databases cases - part 1
00850                     if (empty($row['Db']) || $row['Db'] == '%') {
00851                         $uva_mydbs['%'] = 1;
00852                         break;
00853                     }
00854                     // loic1: avoid multiple entries for dbs
00855                     if (!isset($uva_mydbs[$row['Db']])) {
00856                         $uva_mydbs[$row['Db']] = 1;
00857                     }
00858                 } // end while
00859                 PMA_DBI_free_result($rs);
00860                 $uva_alldbs = PMA_DBI_query('SHOW DATABASES;', $GLOBALS['dbh']);
00861                 // loic1: all databases cases - part 2
00862                 if (isset($uva_mydbs['%'])) {
00863                     while ($uva_row = PMA_DBI_fetch_row($uva_alldbs)) {
00864                         $dblist[] = $uva_row[0];
00865                     } // end while
00866                 } // end if
00867                 else {
00868                     while ($uva_row = PMA_DBI_fetch_row($uva_alldbs)) {
00869                         $uva_db = $uva_row[0];
00870                         if (isset($uva_mydbs[$uva_db]) && $uva_mydbs[$uva_db] == 1) {
00871                             $dblist[]           = $uva_db;
00872                             $uva_mydbs[$uva_db] = 0;
00873                         } else if (!isset($dblist[$uva_db])) {
00874                             foreach ($uva_mydbs AS $uva_matchpattern => $uva_value) {
00875                                 // loic1: fixed bad regexp
00876                                 // TODO: db names may contain characters
00877                                 //       that are regexp instructions
00878                                 $re        = '(^|(\\\\\\\\)+|[^\])';
00879                                 $uva_regex = ereg_replace($re . '%', '\\1.*', ereg_replace($re . '_', '\\1.{1}', $uva_matchpattern));
00880                                 // Fixed db name matching
00881                                 // 2000-08-28 -- Benjamin Gandon
00882                                 if (ereg('^' . $uva_regex . '$', $uva_db)) {
00883                                     $dblist[] = $uva_db;
00884                                     break;
00885                                 }
00886                             } // end while
00887                         } // end if ... else if....
00888                     } // end while
00889                 } // end else
00890                 PMA_DBI_free_result($uva_alldbs);
00891                 unset($uva_mydbs);
00892             } // end if
00893 
00894             // 2. get allowed dbs from the "mysql.tables_priv" table
00895             $local_query = 'SELECT DISTINCT Db FROM mysql.tables_priv WHERE Table_priv LIKE \'%Select%\' AND User = \'' . PMA_sqlAddslashes($cfg['Server']['user']) . '\'';
00896             $rs          = PMA_DBI_try_query($local_query, $dbh);
00897             if ($rs && @PMA_DBI_num_rows($rs)) {
00898                 while ($row = PMA_DBI_fetch_assoc($rs)) {
00899                     if (PMA_isInto($row['Db'], $dblist) == -1) {
00900                         $dblist[] = $row['Db'];
00901                     }
00902                 } // end while
00903                 PMA_DBI_free_result($rs);
00904             } // end if
00905         } // end if
00906     } // end building available dbs from the "mysql" db
00907 
00908     return $dblist;
00909 }
00910 
00929 function PMA_setFontSizes()
00930 {
00931     global $font_size, $font_biggest, $font_bigger, $font_smaller, $font_smallest;
00932 
00933     // IE (<7)/Opera (<7) for win case: needs smaller fonts than anyone else
00934     if (PMA_USR_OS == 'Win'
00935         && ((PMA_USR_BROWSER_AGENT == 'IE' && PMA_USR_BROWSER_VER < 7)
00936         || (PMA_USR_BROWSER_AGENT == 'OPERA' && PMA_USR_BROWSER_VER < 7))) {
00937         $font_size     = 'x-small';
00938         $font_biggest  = 'large';
00939         $font_bigger   = 'medium';
00940         $font_smaller  = '90%';
00941         $font_smallest = '7pt';
00942     }
00943     // IE6 and other browsers for win case
00944     else if (PMA_USR_OS == 'Win') {
00945         $font_size     = 'small';
00946         $font_biggest  = 'large';
00947         $font_bigger   = 'medium';
00948         $font_smaller  = (PMA_USR_BROWSER_AGENT == 'IE')
00949                         ? '90%'
00950                         : 'x-small';
00951         $font_smallest = 'x-small';
00952     }
00953     // Some mac browsers need also smaller default fonts size (OmniWeb &
00954     // Opera)...
00955     // and a beta version of Safari did also, but not the final 1.0 version
00956     // so I remove   || PMA_USR_BROWSER_AGENT == 'SAFARI'
00957     // but we got a report that Safari 1.0 build 85.5 needs it!
00958 
00959     else if (PMA_USR_OS == 'Mac'
00960                 && (PMA_USR_BROWSER_AGENT == 'OMNIWEB' || PMA_USR_BROWSER_AGENT == 'OPERA' || PMA_USR_BROWSER_AGENT == 'SAFARI')) {
00961         $font_size     = 'x-small';
00962         $font_biggest  = 'large';
00963         $font_bigger   = 'medium';
00964         $font_smaller  = '90%';
00965         $font_smallest = '7pt';
00966     }
00967     // ... but most of them (except IE 5+ & NS 6+) need bigger fonts
00968     else if ((PMA_USR_OS == 'Mac'
00969                 && ((PMA_USR_BROWSER_AGENT != 'IE' && PMA_USR_BROWSER_AGENT != 'MOZILLA')
00970                     || PMA_USR_BROWSER_VER < 5))
00971             || PMA_USR_BROWSER_AGENT == 'KONQUEROR') {
00972         $font_size     = 'medium';
00973         $font_biggest  = 'x-large';
00974         $font_bigger   = 'large';
00975         $font_smaller  = 'small';
00976         $font_smallest = 'x-small';
00977     }
00978     // OS/2 browser
00979     else if (PMA_USR_OS == 'OS/2'
00980                 && PMA_USR_BROWSER_AGENT == 'OPERA') {
00981         $font_size     = 'small';
00982         $font_biggest  = 'medium';
00983         $font_bigger   = 'medium';
00984         $font_smaller  = 'x-small';
00985         $font_smallest = 'x-small';
00986     }
00987     else {
00988         $font_size     = 'small';
00989         $font_biggest  = 'large';
00990         $font_bigger   = 'medium';
00991         $font_smaller  = 'x-small';
00992         $font_smallest = 'x-small';
00993     }
00994 
00995     return TRUE;
00996 } // end of the 'PMA_setFontSizes()' function
00997 
00998 
00999 if ($is_minimum_common == FALSE) {
01006     // Setup a default value to let the people and lazy syadmins work anyway,
01007     // they'll get an error if the autodetect code doesn't work
01008     if (empty($cfg['PmaAbsoluteUri'])) {
01009 
01010         $url = array();
01011 
01012         // At first we try to parse REQUEST_URI, it might contain full URI
01013         if (!empty($_SERVER['REQUEST_URI'])) {
01014             $url = parse_url($_SERVER['REQUEST_URI']);
01015         }
01016 
01017         // If we don't have scheme, we didn't have full URL so we need to dig deeper
01018         if (empty($url['scheme'])) {
01019             // Scheme
01020             if (!empty($_SERVER['HTTP_SCHEME'])) {
01021                 $url['scheme'] = $_SERVER['HTTP_SCHEME'];
01022             } else {
01023                 $url['scheme'] = (!empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) != 'off') ? 'https' : 'http';
01024             }
01025 
01026             // Host and port
01027             if (!empty($_SERVER['HTTP_HOST'])) {
01028                 if (strpos($_SERVER['HTTP_HOST'], ':') > 0) {
01029                     list($url['host'], $url['port']) = explode(':', $_SERVER['HTTP_HOST']);
01030                 } else {
01031                     $url['host'] = $_SERVER['HTTP_HOST'];
01032                 }
01033             } else if (!empty($_SERVER['SERVER_NAME'])) {
01034                 $url['host'] = $_SERVER['SERVER_NAME'];
01035             } else {
01036                 // Displays the error message
01037                 header( 'Location: error.php'
01038                         . '?lang='  . urlencode( $available_languages[$lang][2] )
01039                         . '&char='  . urlencode( $charset )
01040                         . '&dir='   . urlencode( $text_dir )
01041                         . '&type='  . urlencode( $strError )
01042                         . '&error=' . urlencode( strtr($strPmaUriError, array('<tt>' => '[tt]', '</tt>' => '[/tt]')))
01043                          );
01044                 exit();
01045             }
01046 
01047             // If we didn't set port yet...
01048             if (empty($url['port']) && !empty($_SERVER['SERVER_PORT'])) {
01049                 $url['port'] = $_SERVER['SERVER_PORT'];
01050             }
01051 
01052             // And finally the path could be already set from REQUEST_URI
01053             if (empty($url['path'])) {
01054                 if (!empty($_SERVER['PATH_INFO'])) {
01055                     $path = parse_url($_SERVER['PATH_INFO']);
01056                 } else {
01057                     // PHP_SELF in CGI often points to cgi executable, so use it as last choice
01058                     $path = parse_url($_SERVER['PHP_SELF']);
01059                 }
01060                 $url['path'] = $path['path'];
01061                 unset($path);
01062             }
01063         }
01064 
01065         // Make url from parts we have
01066         $cfg['PmaAbsoluteUri'] = $url['scheme'] . '://';
01067         // Was there user information?
01068         if (!empty($url['user'])) {
01069             $cfg['PmaAbsoluteUri'] .= $url['user'];
01070             if (!empty($url['pass'])) {
01071                 $cfg['PmaAbsoluteUri'] .= ':' . $url['pass'];
01072             }
01073             $cfg['PmaAbsoluteUri'] .= '@';
01074         }
01075         // Add hostname
01076         $cfg['PmaAbsoluteUri'] .= $url['host'];
01077         // Add port, if it not the default one
01078         if (!empty($url['port']) && (($url['scheme'] == 'http' && $url['port'] != 80) || ($url['scheme'] == 'https' && $url['port'] != 443))) {
01079             $cfg['PmaAbsoluteUri'] .= ':' . $url['port'];
01080         }
01081         // And finally path, without script name
01082         $cfg['PmaAbsoluteUri'] .= substr($url['path'], 0, strrpos($url['path'], '/') + 1);
01083 
01084         unset($url);
01085 
01086         // We used to display a warning if PmaAbsoluteUri wasn't set, but now
01087         // the autodetect code works well enough that we don't display the
01088         // warning at all. The user can still set PmaAbsoluteUri manually.
01089         // See https://sourceforge.net/tracker/index.php?func=detail&aid=1257134&group_id=23067&atid=377411
01090         
01091     } else {
01092         // The URI is specified, however users do often specify this
01093         // wrongly, so we try to fix this.
01094 
01095         // Adds a trailing slash et the end of the phpMyAdmin uri if it
01096         // does not exist.
01097         if (substr($cfg['PmaAbsoluteUri'], -1) != '/') {
01098             $cfg['PmaAbsoluteUri'] .= '/';
01099         }
01100 
01101         // If URI doesn't start with http:// or https://, we will add
01102         // this.
01103         if (substr($cfg['PmaAbsoluteUri'], 0, 7) != 'http://' && substr($cfg['PmaAbsoluteUri'], 0, 8) != 'https://') {
01104             $cfg['PmaAbsoluteUri']          = ((!empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) != 'off') ? 'https' : 'http') . ':'
01105                                             . (substr($cfg['PmaAbsoluteUri'], 0, 2) == '//' ? '' : '//')
01106                                             . $cfg['PmaAbsoluteUri'];
01107         }
01108     }
01109 
01110     // some variables used mostly for cookies:
01111     $pma_uri_parts = parse_url($cfg['PmaAbsoluteUri']);
01112     $cookie_path   = substr($pma_uri_parts['path'], 0, strrpos($pma_uri_parts['path'], '/')) . '/';
01113     $is_https      = (isset($pma_uri_parts['scheme']) && $pma_uri_parts['scheme'] == 'https') ? 1 : 0;
01114 
01115     $dblist       = array();
01116 
01120     foreach ($cfg['Servers'] AS $key => $val) {
01121         // Don't use servers with no hostname
01122         if ( ($val['connect_type'] == 'tcp') && empty($val['host'])) {
01123             unset($cfg['Servers'][$key]);
01124         }
01125 
01126         // Final solution to bug #582890
01127         // If we are using a socket connection
01128         // and there is nothing in the verbose server name
01129         // or the host field, then generate a name for the server
01130         // in the form of "Server 2", localized of course!
01131         if ( ($val['connect_type'] == 'socket') && empty($val['host']) && empty($val['verbose']) ) {
01132             $cfg['Servers'][$key]['verbose'] = $GLOBALS['strServer'] . $key;
01133             $val['verbose']                  = $GLOBALS['strServer'] . $key;
01134         }
01135     }
01136 
01137     if (empty($server) || !isset($cfg['Servers'][$server]) || !is_array($cfg['Servers'][$server])) {
01138         $server = $cfg['ServerDefault'];
01139     }
01140 
01141 
01150     if ($server == 0) {
01151         $cfg['Server'] = array();
01152     }
01153 
01157     else if (isset($cfg['Servers'][$server])) {
01158         $cfg['Server'] = $cfg['Servers'][$server];
01159 
01163         require_once('./libraries/database_interface.lib.php');
01164 
01165         // Gets the authentication library that fits the $cfg['Server'] settings
01166         // and run authentication
01167 
01168         // (for a quick check of path disclosure in auth/cookies:)
01169         $coming_from_common = TRUE;
01170 
01171         require_once('./libraries/auth/' . $cfg['Server']['auth_type'] . '.auth.lib.php');
01172         if (!PMA_auth_check()) {
01173             PMA_auth();
01174         } else {
01175             PMA_auth_set_user();
01176         }
01177 
01178         // Check IP-based Allow/Deny rules as soon as possible to reject the
01179         // user
01180         // Based on mod_access in Apache:
01181         // http://cvs.apache.org/viewcvs.cgi/httpd-2.0/modules/aaa/mod_access.c?rev=1.37&content-type=text/vnd.viewcvs-markup
01182         // Look at: "static int check_dir_access(request_rec *r)"
01183         // Robbat2 - May 10, 2002
01184         if (isset($cfg['Server']['AllowDeny']) && isset($cfg['Server']['AllowDeny']['order'])) {
01185             require_once('./libraries/ip_allow_deny.lib.php');
01186 
01187             $allowDeny_forbidden         = FALSE; // default
01188             if ($cfg['Server']['AllowDeny']['order'] == 'allow,deny') {
01189                 $allowDeny_forbidden     = TRUE;
01190                 if (PMA_allowDeny('allow')) {
01191                     $allowDeny_forbidden = FALSE;
01192                 }
01193                 if (PMA_allowDeny('deny')) {
01194                     $allowDeny_forbidden = TRUE;
01195                 }
01196             } else if ($cfg['Server']['AllowDeny']['order'] == 'deny,allow') {
01197                 if (PMA_allowDeny('deny')) {
01198                     $allowDeny_forbidden = TRUE;
01199                 }
01200                 if (PMA_allowDeny('allow')) {
01201                     $allowDeny_forbidden = FALSE;
01202                 }
01203             } else if ($cfg['Server']['AllowDeny']['order'] == 'explicit') {
01204                 if (PMA_allowDeny('allow')
01205                     && !PMA_allowDeny('deny')) {
01206                     $allowDeny_forbidden = FALSE;
01207                 } else {
01208                     $allowDeny_forbidden = TRUE;
01209                 }
01210             } // end if... else if... else if
01211 
01212             // Ejects the user if banished
01213             if ($allowDeny_forbidden) {
01214                PMA_auth_fails();
01215             }
01216             unset($allowDeny_forbidden); //Clean up after you!
01217         } // end if
01218 
01219         // is root allowed?
01220         if (!$cfg['Server']['AllowRoot'] && $cfg['Server']['user'] == 'root') {
01221             $allowDeny_forbidden = TRUE;
01222             PMA_auth_fails();
01223             unset($allowDeny_forbidden); //Clean up after you!
01224         }
01225 
01226         // The user can work with only some databases
01227         if (isset($cfg['Server']['only_db']) && $cfg['Server']['only_db'] != '') {
01228             if (is_array($cfg['Server']['only_db'])) {
01229                 $dblist   = $cfg['Server']['only_db'];
01230             } else {
01231                 $dblist[] = $cfg['Server']['only_db'];
01232             }
01233         } // end if
01234 
01235         $bkp_track_err = @ini_set('track_errors', 1);
01236 
01237         // Try to connect MySQL with the control user profile (will be used to
01238         // get the privileges list for the current user but the true user link
01239         // must be open after this one so it would be default one for all the
01240         // scripts)
01241         if ($cfg['Server']['controluser'] != '') {
01242             $dbh = PMA_DBI_connect($cfg['Server']['controluser'], $cfg['Server']['controlpass'], TRUE);
01243         } else {
01244             $dbh = PMA_DBI_connect($cfg['Server']['user'], $cfg['Server']['password'], TRUE);
01245         } // end if ... else
01246 
01247         // Pass #1 of DB-Config to read in master level DB-Config will go here
01248         // Robbat2 - May 11, 2002
01249 
01250         // Connects to the server (validates user's login)
01251         $userlink = PMA_DBI_connect($cfg['Server']['user'], $cfg['Server']['password'], FALSE);
01252 
01253         // Pass #2 of DB-Config to read in user level DB-Config will go here
01254         // Robbat2 - May 11, 2002
01255 
01256         @ini_set('track_errors', $bkp_track_err);
01257         unset($bkp_track_err);
01258 
01262         require_once('./libraries/sqlparser.lib.php');
01263 
01267         require_once('./libraries/sqlvalidator.lib.php');
01268 
01269         // if 'only_db' is set for the current user, there is no need to check for
01270         // available databases in the "mysql" db
01271         $dblist_cnt = count($dblist);
01272         if ($dblist_cnt) {
01273             $true_dblist  = array();
01274             $is_show_dbs  = TRUE;
01275 
01276             $dblist_asterisk_bool = FALSE;
01277             for ($i = 0; $i < $dblist_cnt; $i++) {
01278 
01279                 // The current position
01280                 if ($dblist[$i] == '*' && $dblist_asterisk_bool == FALSE) {
01281                     $dblist_asterisk_bool = TRUE;
01282                     $dblist_full = PMA_safe_db_list(FALSE, $dbh, FALSE, $rs, $userlink, $cfg, $dblist);
01283                     foreach ($dblist_full AS $dbl_key => $dbl_val) {
01284                         if (!in_array($dbl_val, $dblist)) {
01285                             $true_dblist[] = $dbl_val;
01286                         }
01287                     }
01288 
01289                     continue;
01290                 } elseif ($dblist[$i] == '*') {
01291                     // We don't want more than one asterisk inside our 'only_db'.
01292                     continue;
01293                 }
01294                 if ($is_show_dbs && ereg('(^|[^\])(_|%)', $dblist[$i])) {
01295                     $local_query = 'SHOW DATABASES LIKE \'' . $dblist[$i] . '\'';
01296                     // here, a PMA_DBI_query() could fail silently
01297                     // if SHOW DATABASES is disabled
01298                     $rs          = PMA_DBI_try_query($local_query, $dbh);
01299 
01300                     if ($i == 0
01301                         && (substr(PMA_DBI_getError($dbh), 1, 4) == 1045)) {
01302                         // "SHOW DATABASES" statement is disabled
01303                         $true_dblist[] = str_replace('\\_', '_', str_replace('\\%', '%', $dblist[$i]));
01304                         $is_show_dbs   = FALSE;
01305                     }
01306                     // Debug
01307                     // else if (PMA_DBI_getError($dbh)) {
01308                     //    PMA_mysqlDie(PMA_DBI_getError($dbh), $local_query, FALSE);
01309                     // }
01310                     while ($row = @PMA_DBI_fetch_row($rs)) {
01311                         $true_dblist[] = $row[0];
01312                     } // end while
01313                     if ($rs) {
01314                         PMA_DBI_free_result($rs);
01315                     }
01316                 } else {
01317                     $true_dblist[]     = str_replace('\\_', '_', str_replace('\\%', '%', $dblist[$i]));
01318                 } // end if... else...
01319             } // end for
01320             $dblist       = $true_dblist;
01321             unset($true_dblist);
01322             $only_db_check = TRUE;
01323         } // end if
01324 
01325         // 'only_db' is empty for the current user...
01326         else {
01327             $only_db_check = FALSE;
01328         } // end if (!$dblist_cnt)
01329 
01330         if (isset($dblist_full) && !count($dblist_full)) {
01331             $dblist = PMA_safe_db_list($only_db_check, $dbh, $dblist_cnt, $rs, $userlink, $cfg, $dblist);
01332         }
01333 
01334     } // end server connecting
01338     else {
01339         echo $strHostEmpty;
01340     }
01341 
01350      function PMA_sendHeaderLocation($uri)
01351      {
01352          if (PMA_IS_IIS && strlen($uri) > 600) {
01353 
01354              echo '<html><head><title>- - -</title>' . "\n";
01355              echo '<meta http-equiv="expires" content="0">' . "\n";
01356              echo '<meta http-equiv="Pragma" content="no-cache">' . "\n";
01357              echo '<meta http-equiv="Cache-Control" content="no-cache">' . "\n";
01358              echo '<meta http-equiv="Refresh" content="0;url=' .$uri . '">' . "\n";
01359              echo '<script language="JavaScript">' . "\n";
01360              echo 'setTimeout ("window.location = unescape(\'"' . $uri . '"\')",2000); </script>' . "\n";
01361              echo '</head>' . "\n";
01362              echo '<body> <script language="JavaScript">' . "\n";
01363              echo 'document.write (\'<p><a href="' . $uri . '">' . $GLOBALS['strGo'] . '</a></p>\');' . "\n";
01364              echo '</script></body></html>' . "\n";
01365 
01366          } else {
01367              header('Location: ' . $uri);
01368          }
01369      }
01370 
01371 
01383     function PMA_availableDatabases($error_url = '')
01384     {
01385         global $dblist;
01386         global $num_dbs;
01387         global $cfg;
01388 
01389         $num_dbs = count($dblist);
01390 
01391         // 1. A list of allowed databases has already been defined by the
01392         //    authentification process -> gets the available databases list
01393         if ($num_dbs) {
01394             $true_dblist = array();
01395             for ($i = 0; $i < $num_dbs; $i++) {
01396                 $dblink  = @PMA_DBI_select_db($dblist[$i]);
01397                 if ($dblink) {
01398                     $true_dblist[] = $dblist[$i];
01399                 } // end if
01400             } // end for
01401             $dblist      = array();
01402             $dblist      = $true_dblist;
01403             unset($true_dblist);
01404             $num_dbs     = count($dblist);
01405         } // end if
01406         // 2. Allowed database list is empty -> gets the list of all databases
01407         //    on the server
01408         else if (!isset($cfg['Server']['only_db']) || $cfg['Server']['only_db'] == '') {
01409             $dblist = PMA_DBI_get_dblist(); // needed? or PMA_mysqlDie('', 'SHOW DATABASES;', FALSE, $error_url);
01410             $num_dbs = count($dblist);
01411         } // end else
01412 
01413         return TRUE;
01414     } // end of the 'PMA_availableDatabases()' function
01415 
01416 
01417 
01418     /* ----------------------- Set of misc functions ----------------------- */
01419 
01420 
01437     function PMA_backquote($a_name, $do_it = TRUE)
01438     {
01439         // '0' is also empty for php :-(
01440         if ($do_it
01441             && (!empty($a_name) || $a_name == '0') && $a_name != '*') {
01442 
01443             if (is_array($a_name)) {
01444                  $result = array();
01445                  foreach ($a_name AS $key => $val) {
01446                      $result[$key] = '`' . $val . '`';
01447                  }
01448                  return $result;
01449             } else {
01450                 return '`' . $a_name . '`';
01451             }
01452         } else {
01453             return $a_name;
01454         }
01455     } // end of the 'PMA_backquote()' function
01456 
01457 
01470     function PMA_jsFormat($a_string = '', $add_backquotes = TRUE)
01471     {
01472         if (is_string($a_string)) {
01473             $a_string = htmlspecialchars($a_string);
01474             $a_string = str_replace('\\', '\\\\', $a_string);
01475             $a_string = str_replace('\'', '\\\'', $a_string);
01476             $a_string = str_replace('#', '\\#', $a_string);
01477             $a_string = str_replace("\012", '\\\\n', $a_string);
01478             $a_string = str_replace("\015", '\\\\r', $a_string);
01479         }
01480 
01481         return (($add_backquotes) ? PMA_backquote($a_string) : $a_string);
01482     } // end of the 'PMA_jsFormat()' function
01483 
01484 
01492     function PMA_whichCrlf()
01493     {
01494         $the_crlf = "\n";
01495 
01496         // The 'PMA_USR_OS' constant is defined in "./libraries/defines.lib.php"
01497         // Win case
01498         if (PMA_USR_OS == 'Win') {
01499             $the_crlf = "\r\n";
01500         }
01501         // Mac case
01502         else if (PMA_USR_OS == 'Mac') {
01503             $the_crlf = "\r";
01504         }
01505         // Others
01506         else {
01507             $the_crlf = "\n";
01508         }
01509 
01510         return $the_crlf;
01511     } // end of the 'PMA_whichCrlf()' function
01512 
01513 
01529     function PMA_countRecords($db, $table, $ret = FALSE, $force_exact = FALSE)
01530     {
01531         global $err_url, $cfg;
01532         if (!$force_exact) {
01533             $result       = PMA_DBI_query('SHOW TABLE STATUS FROM ' . PMA_backquote($db) . ' LIKE \'' . PMA_sqlAddslashes($table, TRUE) . '\';');
01534             $showtable    = PMA_DBI_fetch_assoc($result);
01535             $num     = (isset($showtable['Rows']) ? $showtable['Rows'] : 0);
01536             if ($num < $cfg['MaxExactCount']) {
01537                 unset($num);
01538             }
01539             PMA_DBI_free_result($result);
01540         }
01541 
01542         if (!isset($num)) {
01543             $result    = PMA_DBI_query('SELECT COUNT(*) AS num FROM ' . PMA_backquote($db) . '.' . PMA_backquote($table));
01544             list($num) = ($result) ? PMA_DBI_fetch_row($result) : array(0);
01545             PMA_DBI_free_result($result);
01546         }
01547         if ($ret) {
01548             return $num;
01549         } else {
01550             echo number_format($num, 0, $GLOBALS['number_decimal_separator'], $GLOBALS['number_thousands_separator']);
01551             return TRUE;
01552         }
01553     } // end of the 'PMA_countRecords()' function
01554 
01563     function PMA_reloadNavigation() {
01564         global $cfg;
01565 
01566         // Reloads the navigation frame via JavaScript if required
01567         if (isset($GLOBALS['reload']) && $GLOBALS['reload']) {
01568             echo "\n";
01569             $reload_url = './left.php?' . PMA_generate_common_url((isset($GLOBALS['db']) ? $GLOBALS['db'] : ''), '', '&');
01570             ?>
01571 <script type="text/javascript" language="javascript1.2">
01572 <!--
01573 if (typeof(window.parent) != 'undefined'
01574     && typeof(window.parent.frames['nav']) != 'undefined') {
01575     window.parent.frames['nav'].goTo('<?php echo $reload_url; ?>&hash=' + <?php echo (($cfg['QueryFrame'] && $cfg['QueryFrameJS']) ? 'window.parent.frames[\'queryframe\'].document.hashform.hash.value' : "'" . md5($cfg['PmaAbsoluteUri']) . "'"); ?>);
01576 }
01577 //-->
01578 </script>
01579             <?php
01580             unset($GLOBALS['reload']);
01581         }
01582     }
01583 
01593     function PMA_showMessage($message)
01594     {
01595         global $cfg;
01596 
01597         // Sanitizes $message
01598         $message = PMA_sanitize($message);
01599 
01600         // Corrects the tooltip text via JS if required
01601         if (!empty($GLOBALS['table']) && $cfg['ShowTooltip']) {
01602             $result = PMA_DBI_try_query('SHOW TABLE STATUS FROM ' . PMA_backquote($GLOBALS['db']) . ' LIKE \'' . PMA_sqlAddslashes($GLOBALS['table'], TRUE) . '\'');
01603             if ($result) {
01604                 $tbl_status = PMA_DBI_fetch_assoc($result);
01605                 $tooltip    = (empty($tbl_status['Comment']))
01606                             ? ''
01607                             : $tbl_status['Comment'] . ' ';
01608                 $tooltip .= '(' . $tbl_status['Rows'] . ' ' . $GLOBALS['strRows'] . ')';
01609                 PMA_DBI_free_result($result);
01610                 $md5_tbl = md5($GLOBALS['table']);
01611                 echo "\n";
01612                 ?>
01613 <script type="text/javascript" language="javascript1.2">
01614 <!--
01615 if (typeof(document.getElementById) != 'undefined'
01616     && typeof(window.parent.frames['nav']) != 'undefined'
01617     && typeof(window.parent.frames['nav'].document) != 'undefined' && typeof(window.parent.frames['nav'].document) != 'unknown'
01618     && (window.parent.frames['nav'].document.getElementById('<?php echo 'tbl_' . $md5_tbl; ?>'))
01619     && typeof(window.parent.frames['nav'].document.getElementById('<?php echo 'tbl_' . $md5_tbl; ?>')) != 'undefined'
01620     && typeof(window.parent.frames['nav'].document.getElementById('<?php echo 'tbl_' . $md5_tbl; ?>').title) == 'string') {
01621     window.parent.frames['nav'].document.getElementById('<?php echo 'tbl_' . $md5_tbl; ?>').title = '<?php echo PMA_jsFormat($tooltip, FALSE); ?>';
01622 }
01623 //-->
01624 </script>
01625                 <?php
01626             } // end if
01627         } // end if... else if
01628 
01629         // Checks if the table needs to be repaired after a TRUNCATE query.
01630         if (isset($GLOBALS['table']) && isset($GLOBALS['sql_query'])
01631             && $GLOBALS['sql_query'] == 'TRUNCATE TABLE ' . PMA_backquote($GLOBALS['table'])) {
01632             if (!isset($tbl_status)) {
01633                 $result = @PMA_DBI_try_query('SHOW TABLE STATUS FROM ' . PMA_backquote($GLOBALS['db']) . ' LIKE \'' . PMA_sqlAddslashes($GLOBALS['table'], TRUE) . '\'');
01634                 if ($result) {
01635                     $tbl_status = PMA_DBI_fetch_assoc($result);
01636                     PMA_DBI_free_result($result);
01637                 }
01638             }
01639             if (isset($tbl_status) && (int) $tbl_status['Index_length'] > 1024) {
01640                 PMA_DBI_try_query('REPAIR TABLE ' . PMA_backquote($GLOBALS['table']));
01641             }
01642         }
01643         unset($tbl_status);
01644 
01645         echo "\n";
01646         ?>
01647 <br />
01648 <div align="<?php echo $GLOBALS['cell_align_left']; ?>">
01649     <table border="<?php echo $cfg['Border']; ?>" cellpadding="5" cellspacing="1">
01650     <?php if (isset($GLOBALS['show_error_header']) && $GLOBALS['show_error_header']) { ?>
01651     <tr><th class="tblHeadError"><div class="errorhead"><?php echo $GLOBALS['strError']; ?></div></th></tr>
01652     <?php } ?>
01653     <tr>
01654         <th<?php echo ($GLOBALS['theme'] != 'original') ? ' class="tblHeaders"' : ' bgcolor="' . $cfg['ThBgcolor'] . '"'; ?>>
01655             <b><?php echo $message; ?></b>
01656         </th>
01657     </tr>
01658         <?php
01659         if ($cfg['ShowSQL'] == TRUE && (!empty($GLOBALS['sql_query']) || !empty($GLOBALS['display_query']))) {
01660             $local_query = !empty($GLOBALS['display_query']) ? $GLOBALS['display_query'] : (($cfg['SQP']['fmtType'] == 'none' && isset($GLOBALS['unparsed_sql']) && $GLOBALS['unparsed_sql'] != '') ? $GLOBALS['unparsed_sql'] : $GLOBALS['sql_query']);
01661             // Basic url query part
01662             $url_qpart = '?' . PMA_generate_common_url(isset($GLOBALS['db']) ? $GLOBALS['db'] : '', isset($GLOBALS['table']) ? $GLOBALS['table'] : '');
01663             echo "\n";
01664             ?>
01665     <tr>
01666         <td bgcolor="<?php echo $cfg['BgcolorOne']; ?>">
01667             <?php
01668             echo "\n";
01669             // Html format the query to be displayed
01670             // The nl2br function isn't used because its result isn't a valid
01671             // xhtml1.0 statement before php4.0.5 ("<br>" and not "<br />")
01672             // If we want to show some sql code it is easiest to create it here
01673              /* SQL-Parser-Analyzer */
01674             
01675             if (!empty($GLOBALS['show_as_php'])) {
01676                 $new_line = '\'<br />' . "\n" . '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;. \' ';
01677             }
01678             if (isset($new_line)) {
01679                  /* SQL-Parser-Analyzer */
01680                 $query_base = PMA_sqlAddslashes(htmlspecialchars($local_query), FALSE, FALSE, TRUE);
01681                  /* SQL-Parser-Analyzer */
01682                 $query_base = preg_replace("@((\015\012)|(\015)|(\012))+@", $new_line, $query_base);
01683             } else {
01684                 $query_base = $local_query;
01685             }
01686 
01687             // Here we append the LIMIT added for navigation, to
01688             // enable its display. Adding it higher in the code
01689             // to $local_query would create a problem when
01690             // using the Refresh or Edit links.
01691 
01692             // Only append it on SELECTs.
01693 
01694             // FIXME: what would be the best to do when someone
01695             // hits Refresh: use the current LIMITs ?
01696 
01697             // TODO: use the parser instead of preg_match()
01698 
01699             if (preg_match('@^SELECT[[:space:]]+@i', $query_base)
01700              && isset($GLOBALS['sql_limit_to_append'])) {
01701                 $query_base .= $GLOBALS['sql_limit_to_append'];
01702             }
01703 
01704             if (!empty($GLOBALS['show_as_php'])) {
01705                 $query_base = '$sql  = \'' . $query_base;
01706             } else if (!empty($GLOBALS['validatequery'])) {
01707                 $query_base = PMA_validateSQL($query_base);
01708             } else {
01709                 // avoid reparsing query:
01710                 if (isset($GLOBALS['parsed_sql']) && $query_base == $GLOBALS['parsed_sql']['raw']) {
01711                     $parsed_sql = $GLOBALS['parsed_sql'];
01712                 } else {
01713                     $parsed_sql = PMA_SQP_parse($query_base);
01714                 }
01715                 $query_base = PMA_formatSql($parsed_sql, $query_base);
01716             }
01717 
01718             // Prepares links that may be displayed to edit/explain the query
01719             // (don't go to default pages, we must go to the page
01720             // where the query box is available)
01721             // (also, I don't see why we should check the goto variable)
01722 
01723             //if (!isset($GLOBALS['goto'])) {
01724                 //$edit_target = (isset($GLOBALS['table'])) ? $cfg['DefaultTabTable'] : $cfg['DefaultTabDatabase'];
01725             $edit_target = isset($GLOBALS['db']) ? (isset($GLOBALS['table']) ? 'tbl_properties.php' : 'db_details.php') : '';
01726             //} else if ($GLOBALS['goto'] != 'main.php') {
01727             //    $edit_target = $GLOBALS['goto'];
01728             //} else {
01729             //    $edit_target = '';
01730             //}
01731 
01732             if (isset($cfg['SQLQuery']['Edit'])
01733                 && ($cfg['SQLQuery']['Edit'] == TRUE )
01734                 && (!empty($edit_target))) {
01735 
01736                 $onclick = '';
01737                 if ($cfg['QueryFrameJS'] && $cfg['QueryFrame']) {
01738                     $onclick = 'focus_querywindow(\'' . urlencode($local_query) . '\'); return false;';
01739                 }
01740 
01741                 $edit_link = $edit_target
01742                            . $url_qpart
01743                            . '&amp;sql_query=' . urlencode($local_query)
01744                            . '&amp;show_query=1#querybox"';
01745                 $edit_link = ' [' . PMA_linkOrButton( $edit_link, $GLOBALS['strEdit'], array( 'onclick' => $onclick ) ) . ']';
01746             } else {
01747                 $edit_link = '';
01748             }
01749 
01750             // Want to have the query explained (Mike Beck 2002-05-22)
01751             // but only explain a SELECT (that has not been explained)
01752             /* SQL-Parser-Analyzer */
01753             if (isset($cfg['SQLQuery']['Explain'])
01754                 && $cfg['SQLQuery']['Explain'] == TRUE) {
01755 
01756                 // Detect if we are validating as well
01757                 // To preserve the validate uRL data
01758                 if (!empty($GLOBALS['validatequery'])) {
01759                     $explain_link_validate = '&amp;validatequery=1';
01760                 } else {
01761                     $explain_link_validate = '';
01762                 }
01763 
01764                 $explain_link = 'read_dump.php'
01765                               . $url_qpart
01766                               . $explain_link_validate
01767                               . '&amp;sql_query=';
01768 
01769                 if (preg_match('@^SELECT[[:space:]]+@i', $local_query)) {
01770                     $explain_link .= urlencode('EXPLAIN ' . $local_query);
01771                     $message = $GLOBALS['strExplain'];
01772                 } else if (preg_match('@^EXPLAIN[[:space:]]+SELECT[[:space:]]+@i', $local_query)) {
01773                     $explain_link .= urlencode(substr($local_query, 8));
01774                     $message = $GLOBALS['strNoExplain'];
01775                 } else {
01776                     $explain_link = '';
01777                 }
01778                 if (!empty($explain_link)) {
01779                     $explain_link = ' [' . PMA_linkOrButton( $explain_link, $message ) . ']';
01780                 }
01781             } else {
01782                 $explain_link = '';
01783             } //show explain
01784 
01785             // Also we would like to get the SQL formed in some nice
01786             // php-code (Mike Beck 2002-05-22)
01787             if (isset($cfg['SQLQuery']['ShowAsPHP'])
01788                 && $cfg['SQLQuery']['ShowAsPHP'] == TRUE) {
01789                 $php_link = 'read_dump.php'
01790                           . $url_qpart
01791                           . '&amp;show_query=1'
01792                           . '&amp;sql_query=' . urlencode($local_query)
01793                           . '&amp;show_as_php=';
01794 
01795                 if (!empty($GLOBALS['show_as_php'])) {
01796                     $php_link .= '0';
01797                     $message = $GLOBALS['strNoPhp'];
01798                 } else {
01799                     $php_link .= '1';
01800                     $message = $GLOBALS['strPhp'];
01801                 }
01802                 $php_link = ' [' . PMA_linkOrButton( $php_link, $message ) . ']';
01803 
01804                 if (isset($GLOBALS['show_as_php']) && $GLOBALS['show_as_php'] == '1') {
01805                     $runquery_link
01806                          = 'read_dump.php'
01807                          . $url_qpart
01808                          . '&amp;show_query=1'
01809                          . '&amp;sql_query=' . urlencode($local_query);
01810                     $php_link .= ' [' . PMA_linkOrButton( $runquery_link, $GLOBALS['strRunQuery'] ) . ']';
01811                 }
01812 
01813             } else {
01814                 $php_link = '';
01815             } //show as php
01816 
01817             // Refresh query
01818             if (isset($cfg['SQLQuery']['Refresh'])
01819                 && $cfg['SQLQuery']['Refresh']
01820                 && preg_match('@^(SELECT|SHOW)[[:space:]]+@i', $local_query)) {
01821 
01822                 $refresh_link = 'read_dump.php'
01823                           . $url_qpart
01824                           . '&amp;show_query=1'
01825                           . '&amp;sql_query=' . urlencode($local_query);
01826                 $refresh_link = ' [' . PMA_linkOrButton( $refresh_link, $GLOBALS['strRefresh'] ) . ']';
01827             } else {
01828                 $refresh_link = '';
01829             } //show as php
01830 
01831             if (isset($cfg['SQLValidator']['use'])
01832                 && $cfg['SQLValidator']['use'] == TRUE
01833                 && isset($cfg['SQLQuery']['Validate'])
01834                 && $cfg['SQLQuery']['Validate'] == TRUE) {
01835                 $validate_link = 'read_dump.php'
01836                                . $url_qpart
01837                                . '&amp;show_query=1'
01838                                . '&amp;sql_query=' . urlencode($local_query)
01839                                . '&amp;validatequery=';
01840                 if (!empty($GLOBALS['validatequery'])) {
01841                     $validate_link .= '0';
01842                     $message = $GLOBALS['strNoValidateSQL'] ;
01843                 } else {
01844                     $validate_link .= '1';
01845                     $message = $GLOBALS['strValidateSQL'] ;
01846                 }
01847                 $validate_link = ' [' . PMA_linkOrButton( $validate_link, $GLOBALS['strRefresh'] ) . ']';
01848             } else {
01849                 $validate_link = '';
01850             } //validator
01851 
01852             // Displays the message
01853             echo '            <b>' . $GLOBALS['strSQLQuery'] . ':</b>&nbsp;';
01854             echo '<br />' . "\n";
01855             echo '            ' . $query_base;
01856 
01857             unset($local_query);
01858             //Clean up the end of the PHP
01859             if (!empty($GLOBALS['show_as_php'])) {
01860                 echo '\';';
01861             }
01862             echo "\n";
01863             ?>
01864         </td>
01865     </tr>
01866     <?php
01867             if (!empty($edit_target)) {
01868                 echo '<tr><td class="tblFooters">';
01869                 echo $edit_link . $explain_link . $php_link . $refresh_link . $validate_link;
01870                 echo '</td></tr>' . "\n";
01871             }
01872         }
01873         echo "\n";
01874         ?>
01875     </table>
01876 </div><br />
01877         <?php
01878     } // end of the 'PMA_showMessage()' function
01879 
01880 
01895     function PMA_formatByteDown($value, $limes = 6, $comma = 0)
01896     {
01897         $dh           = pow(10, $comma);
01898         $li           = pow(10, $limes);
01899         $return_value = $value;
01900         $unit         = $GLOBALS['byteUnits'][0];
01901 
01902         for ( $d = 6, $ex = 15; $d >= 1; $d--, $ex-=3 ) {
01903             if (isset($GLOBALS['byteUnits'][$d]) && $value >= $li * pow(10, $ex)) {
01904                 $value = round($value / ( pow(1024, $d) / $dh) ) /$dh;
01905                 $unit = $GLOBALS['byteUnits'][$d];
01906                 break 1;
01907             } // end if
01908         } // end for
01909 
01910         if ($unit != $GLOBALS['byteUnits'][0]) {
01911             $return_value = number_format($value, $comma, $GLOBALS['number_decimal_separator'], $GLOBALS['number_thousands_separator']);
01912         } else {
01913             $return_value = number_format($value, 0, $GLOBALS['number_decimal_separator'], $GLOBALS['number_thousands_separator']);
01914         }
01915 
01916         return array($return_value, $unit);
01917     } // end of the 'PMA_formatByteDown' function
01918 
01919 
01930     function PMA_getEnumSetOptions($type_def) {
01931         $open = strpos($type_def, '(');
01932         $close = strrpos($type_def, ')');
01933         if (!$open || !$close) {
01934             return FALSE;
01935         }
01936         $options = substr($type_def, $open + 2, $close - $open - 3);
01937         $options = explode('\',\'', $options);
01938         return $options;
01939     } // end of the 'PMA_getEnumSetOptions' function
01940 
01950     function PMA_localisedDate($timestamp = -1, $format = '')
01951     {
01952         global $datefmt, $month, $day_of_week;
01953 
01954         if ($format == '') {
01955             $format = $datefmt;
01956         }
01957 
01958         if ($timestamp == -1) {
01959             $timestamp = time();
01960         }
01961 
01962         $date = preg_replace('@%[aA]@', $day_of_week[(int)strftime('%w', $timestamp)], $format);
01963         $date = preg_replace('@%[bB]@', $month[(int)strftime('%m', $timestamp)-1], $date);
01964 
01965         return strftime($date, $timestamp);
01966     } // end of the 'PMA_localisedDate()' function
01967 
01968 
01979     function PMA_getTab( $tab )
01980     {
01981         // default values
01982         $defaults = array(
01983             'text'   => '',
01984             'class'  => '',
01985             'active' => false,
01986             'link'   => '',
01987             'sep'    => '?',
01988             'attr'   => '',
01989             'args'   => '',
01990         );
01991         
01992         $tab = array_merge( $defaults, $tab );
01993         
01994         // determine aditional style-class
01995         if ( empty( $tab['class'] ) ) {
01996             if ($tab['text'] == $GLOBALS['strEmpty'] || $tab['text'] == $GLOBALS['strDrop']) {
01997                 $tab['class'] = 'caution';
01998             }
01999             elseif ( isset( $tab['active'] ) && $tab['active']
02000                   || isset($GLOBALS['active_page']) && $GLOBALS['active_page'] == $tab['link'] 
02001                   || basename($_SERVER['PHP_SELF']) == $tab['link'] )
02002             {
02003                 $tab['class'] = 'active';
02004             }
02005         }
02006         
02007         // build the link
02008         if ( ! empty( $tab['link'] ) ) {
02009             $tab['link'] = htmlentities( $tab['link'] );
02010             $tab['link'] = $tab['link'] . $tab['sep'] . ( empty( $GLOBALS['url_query'] ) ? PMA_generate_common_url() : $GLOBALS['url_query'] );
02011             if ( ! empty( $tab['args'] ) ) {
02012                 foreach( $tab['args'] as $param => $value ) {
02013                     $tab['link'] .= '&amp;' . urlencode( $param ) . '=' . urlencode( $value );
02014                 }
02015             }
02016         }
02017         
02018         // display icon, even if iconic is disabled but the link-text is missing
02019         if ( ( $GLOBALS['cfg']['MainPageIconic'] || empty( $tab['text'] ) )
02020             && isset( $tab['icon'] ) ) {
02021             $image = '<img src="' . htmlentities( $GLOBALS['pmaThemeImage'] ) . '%1$s" width="16" height="16" border="0" alt="%2$s" />%2$s';
02022             $tab['text'] = sprintf( $image, htmlentities( $tab['icon'] ), $tab['text'] );
02023         }
02024         // check to not display an empty link-text
02025         elseif ( empty( $tab['text'] ) ) {
02026             $tab['text'] = '?';
02027             trigger_error( __FILE__ . '(' . __LINE__ . '): ' . 'empty linktext in function ' . __FUNCTION__ . '()', E_USER_NOTICE );
02028         }
02029 
02030         if ( ! empty( $tab['link'] ) ) {
02031             $out = '<a class="tab' . htmlentities( $tab['class'] ) . '" href="' . $tab['link'] . '" ' . $tab['attr'] . '>'
02032                  . $tab['text'] . '</a>';
02033         } else {
02034             $out = '<span class="tab' . htmlentities( $tab['class'] ) . '">' . $tab['text'] . '</span>';
02035         }
02036 
02037         return $out;
02038     } // end of the 'PMA_printTab()' function
02039     
02047     function PMA_getTabs( $tabs, $tag_id = 'topmenu' )
02048     {
02049         $tab_navigation = '<!-- top menu -->' . "\n";
02050         $tab_navigation .= '<div id="' . htmlentities( $tag_id ) . '">' . "\n";
02051         
02052         foreach ( $tabs as $tab )
02053         {
02054             $tab_navigation .= PMA_getTab( $tab ) . "\n";
02055         }
02056         
02057         $tab_navigation .= '</div>' . "\n";
02058         $tab_navigation .= '<!-- end top menu -->' . "\n\n";
02059         
02060         return $tab_navigation;
02061     }
02062 
02063 
02077     function PMA_linkOrButton($url, $message, $tag_params = array(), $new_form = TRUE, $strip_img = FALSE, $target = '')
02078     {
02079         if ( ! is_array( $tag_params ) )
02080         {
02081             $tmp = $tag_params;
02082             $tag_params = array();
02083             if ( ! empty( $tmp ) )
02084             {
02085                 $tag_params['onclick'] = 'return confirmLink(this, \'' . $tmp . '\')';
02086             }
02087             unset( $tmp );
02088         }
02089         if ( ! empty( $target ) ) {
02090             $tag_params['target'] = htmlentities( $target );
02091         }
02092         
02093         $tag_params_strings = array();
02094         foreach( $tag_params as $par_name => $par_value ) {
02095             // htmlentities() only on non javascript
02096             $par_value = substr( $par_name,0 ,2 ) == 'on' ? $par_value : htmlentities( $par_value );
02097             $tag_params_strings[] = $par_name . '="' . $par_value . '"';
02098         }
02099         
02100         // previously the limit was set to 2047, it seems 1000 is better
02101         if (strlen($url) <= 1000) {
02102             $ret            = '<a href="' . $url . '" ' . implode( ' ', $tag_params_strings ) . '>' . "\n"
02103                             . '    ' . $message . '</a>' . "\n";
02104         }
02105         else {
02106             // no spaces (linebreaks) at all
02107             // or after the hidden fields
02108             // IE will display them all
02109             
02110             // add class=link to submit button
02111             if ( empty( $tag_params['class'] ) ) {
02112                 $tag_params['class'] = 'link';
02113             }
02114             $url         = str_replace('&amp;', '&', $url);
02115             $url_parts   = parse_url($url);
02116             $query_parts = explode('&', $url_parts['query']);
02117             if ($new_form) {
02118                 $ret = '<form action="' . $url_parts['path'] . '" class="link"'
02119                      . ' method="post"' . $target . ' style="display: inline;">';
02120                 $subname_open   = '';
02121                 $subname_close  = '';
02122                 $submit_name    = '';
02123             } else {
02124                 $query_parts[] = 'redirect=' . $url_parts['path'];
02125                 if ( empty( $GLOBALS['subform_counter'] ) ) {
02126                     $GLOBALS['subform_counter'] = 0;
02127                 }
02128                 $GLOBALS['subform_counter']++;
02129                 $ret            = '';
02130                 $subname_open   = 'subform[' . $GLOBALS['subform_counter'] . '][';
02131                 $subname_close  = ']';
02132                 $submit_name    = ' name="usesubform[' . $GLOBALS['subform_counter'] . ']"';
02133             }
02134             foreach ($query_parts AS $query_pair) {
02135                 list($eachvar, $eachval) = explode('=', $query_pair);
02136                 $ret .= '<input type="hidden" name="' . $subname_open . $eachvar . $subname_close . '" value="' . htmlspecialchars(urldecode($eachval)) . '" />';
02137             } // end while
02138 
02139             if (stristr($message, '<img')) {
02140                 if ($strip_img) {
02141                     $message = trim( strip_tags( $message ) );
02142                     $ret .= '<input type="submit"' . $submit_name . ' ' . implode( ' ', $tag_params_strings )
02143                           . ' value="' . htmlspecialchars($message) . '" />';
02144                 } else {
02145                     $ret .= '<input type="image"' . $submit_name . ' ' . implode( ' ', $tag_params_strings )
02146                           . ' src="' . preg_replace('°^.*\ssrc="([^"]*)".*$°si', '\1', $message) . '"'
02147                           . ' value="' . htmlspecialchars(preg_replace('°^.*\salt="([^"]*)".*$°si', '\1', $message)) . '" />';
02148                 }
02149             } else {
02150                 $message = trim( strip_tags( $message ) );
02151                 $ret .= '<input type="submit"' . $submit_name . ' ' . implode( ' ', $tag_params_strings )
02152                       . ' value="' . htmlspecialchars($message) . '" />';
02153             }
02154             if ($new_form) {
02155                 $ret .= '</form>';
02156             }
02157         } // end if... else...
02158 
02159             return $ret;
02160     } // end of the 'PMA_linkOrButton()' function
02161 
02162 
02170     function PMA_timespanFormat($seconds)
02171     {
02172         $return_string = '';
02173         $days = floor($seconds / 86400);
02174         if ($days > 0) {
02175             $seconds -= $days * 86400;
02176         }
02177         $hours = floor($seconds / 3600);
02178         if ($days > 0 || $hours > 0) {
02179             $seconds -= $hours * 3600;
02180         }
02181         $minutes = floor($seconds / 60);
02182         if ($days > 0 || $hours > 0 || $minutes > 0) {
02183             $seconds -= $minutes * 60;
02184         }
02185         return sprintf($GLOBALS['timespanfmt'], (string)$days, (string)$hours, (string)$minutes, (string)$seconds);
02186     }
02187 
02200     function PMA_flipstring($string, $Separator = "<br />\n") {
02201         $format_string = '';
02202         $charbuff = false;
02203 
02204         for ($i = 0; $i < strlen($string); $i++) {
02205             $char = $string{$i};
02206             $append = false;
02207 
02208             if ($char == '&') {
02209                 $format_string .= $charbuff;
02210                 $charbuff = $char;
02211                 $append = true;
02212             } elseif (!empty($charbuff)) {
02213                 $charbuff .= $char;
02214             } elseif ($char == ';' && !empty($charbuff)) {
02215                 $format_string .= $charbuff;
02216                 $charbuff = false;
02217                 $append = true;
02218             } else {
02219                 $format_string .= $char;
02220                 $append = true;
02221             }
02222 
02223             if ($append && ($i != strlen($string))) {
02224                 $format_string .= $Separator;
02225             }
02226         }
02227 
02228         return $format_string;
02229     }
02230 
02231 
02249     function PMA_checkParameters($params, $die = TRUE) {
02250         global $PHP_SELF;
02251 
02252         $reported_script_name = basename($PHP_SELF);
02253         $found_error = FALSE;
02254         $error_message = '';
02255 
02256         foreach ($params AS $param) {
02257             if (!isset($GLOBALS[$param])) {
02258                 $error_message .= $reported_script_name . ': Missing parameter: ' . $param . ' <a href="./Documentation.html#faqmissingparameters" target="documentation"> (FAQ 2.8)</a><br />';
02259                 $found_error = TRUE;
02260             }
02261         }
02262         if ($found_error) {
02263             require_once('./libraries/header_meta_style.inc.php');
02264             echo '</head><body><p>' . $error_message . '</p></body></html>';
02265             if ($die) {
02266                 exit();
02267             }
02268         }
02269     } // end function
02270 
02271     // Kanji encoding convert feature appended by Y.Kawada (2002/2/20)
02272     if (@function_exists('mb_convert_encoding')
02273         && strpos(' ' . $lang, 'ja-')
02274         && file_exists('./libraries/kanji-encoding.lib.php')) {
02275         require_once('./libraries/kanji-encoding.lib.php');
02276         define('PMA_MULTIBYTE_ENCODING', 1);
02277     } // end if
02278 
02290     function PMA_checkFileExtensions($file, $extension) {
02291         if (substr($file, -1 * strlen($extension)) == $extension) {
02292             return TRUE;
02293         }
02294         if ($GLOBALS['cfg']['GZipDump'] && @function_exists('gzopen')) {
02295             if (substr($file, -3 - strlen($extension)) == $extension . '.gz') {
02296                 return TRUE;
02297             }
02298         }
02299         if ($GLOBALS['cfg']['BZipDump'] && @function_exists('bzdecompress')) {
02300             if (substr($file, -4 - strlen($extension)) == $extension . '.bz2') {
02301                 return TRUE;
02302             }
02303         }
02304         return FALSE;
02305     } // end function
02306 
02319     function PMA_getUvaCondition($handle, $fields_cnt, $fields_meta, $row) {
02320 
02321         $primary_key              = '';
02322         $unique_key               = '';
02323         $uva_nonprimary_condition = '';
02324 
02325         for ($i = 0; $i < $fields_cnt; ++$i) {
02326             $field_flags = PMA_DBI_field_flags($handle, $i);
02327             $meta      = $fields_meta[$i];
02328             // do not use an alias in a condition
02329             $column_for_condition = $meta->name;
02330             if (isset($analyzed_sql[0]['select_expr']) && is_array($analyzed_sql[0]['select_expr'])) {
02331                 foreach ($analyzed_sql[0]['select_expr'] AS $select_expr_position => $select_expr) {
02332                     $alias = $analyzed_sql[0]['select_expr'][$select_expr_position]['alias'];
02333                     if (!empty($alias)) {
02334                         $true_column = $analyzed_sql[0]['select_expr'][$select_expr_position]['column'];
02335                         if ($alias == $meta->name) {
02336                             $column_for_condition = $true_column;
02337                         } // end if
02338                     } // end if
02339                 } // end while
02340             }
02341 
02342             // to fix the bug where float fields (primary or not)
02343             // can't be matched because of the imprecision of
02344             // floating comparison, use CONCAT
02345             // (also, the syntax "CONCAT(field) IS NULL"
02346             // that we need on the next "if" will work)
02347             if ($meta->type == 'real') {
02348                 $condition = ' CONCAT(' . PMA_backquote($column_for_condition) . ') ';
02349             } else {
02350                 // string and blob fields have to be converted using
02351                 // the system character set (always utf8) since
02352                 // mysql4.1 can use different charset for fields.
02353                 if (PMA_MYSQL_INT_VERSION >= 40100 && ($meta->type == 'string' || $meta->type == 'blob')) {
02354                     $condition = ' CONVERT(' . PMA_backquote($column_for_condition) . ' USING utf8) ';
02355                 } else {
02356                     $condition = ' ' . PMA_backquote($column_for_condition) . ' ';
02357                 }
02358             } // end if... else...
02359 
02360             if (!isset($row[$i]) || is_null($row[$i])) {
02361                 $condition .= 'IS NULL AND';
02362             } else {
02363                 // timestamp is numeric on some MySQL 4.1
02364                 if ($meta->numeric && $meta->type != 'timestamp') {
02365                     $condition .= '= ' . $row[$i] . ' AND';
02366                 } elseif ($meta->type == 'blob'
02367                     // hexify only if this is a true not empty BLOB
02368                      && stristr($field_flags, 'BINARY')
02369                      && !empty($row[$i])) {
02370                         // use a CAST if possible, to avoid problems
02371                         // if the field contains wildcard characters % or _
02372                         if (PMA_MYSQL_INT_VERSION < 40002) {
02373                             $condition .= 'LIKE 0x' . bin2hex($row[$i]). ' AND';
02374                         } else {
02375                             $condition .= '= CAST(0x' . bin2hex($row[$i]). ' AS BINARY) AND';
02376                         }
02377                 } else {
02378                     $condition .= '= \'' . PMA_sqlAddslashes($row[$i], FALSE, TRUE) . '\' AND';
02379                 }
02380             }
02381             if ($meta->primary_key > 0) {
02382                 $primary_key .= $condition;
02383             } else if ($meta->unique_key > 0) {
02384                 $unique_key  .= $condition;
02385             }
02386             $uva_nonprimary_condition .= $condition;
02387         } // end for
02388 
02389         // Correction uva 19991216: prefer primary or unique keys
02390         // for condition, but use conjunction of all values if no
02391         // primary key
02392         if ($primary_key) {
02393             $uva_condition = $primary_key;
02394         } else if ($unique_key) {
02395             $uva_condition = $unique_key;
02396         } else {
02397             $uva_condition = $uva_nonprimary_condition;
02398         }
02399 
02400         return preg_replace('|\s?AND$|', '', $uva_condition);
02401     } // end function
02402 
02415     function PMA_buttonOrImage($button_name, $button_class, $image_name, $text, $image) {
02416         global $pmaThemeImage, $propicon;
02417 
02418         /* Opera has trouble with <input type="image"> */
02419         /* IE has trouble with <button> */
02420         if (PMA_USR_BROWSER_AGENT != 'IE') {
02421             echo '<button class="' . $button_class . '" type="submit" name="' . $button_name . '" value="' . $text . '" title="' . $text . '">' . "\n"
02422                . '<img src="' . $pmaThemeImage . $image . '" title="' . $text . '" alt="' . $text . '" width="16" height="16" />' . (($propicon == 'both') ? '&nbsp;' . $text : '') . "\n"
02423                . '</button>' . "\n";
02424         } else {
02425             echo '<input type="image" name="' . $image_name . '" value="' .$text . '" title="' . $text . '" src="' . $pmaThemeImage . $image . '" />'  . (($propicon == 'both') ? '&nbsp;' . $text : '') . "\n";
02426         }
02427     } // end function
02428 
02452     function PMA_pageselector($url, $rows, $pageNow = 1, $nbTotalPage = 1, $showAll = 200, $sliceStart = 5, $sliceEnd = 5, $percent = 20, $range = 10) {
02453         $gotopage = '<br />' . $GLOBALS['strPageNumber']
02454                   . '<select name="goToPage" onchange="goToUrl(this, \'' . $url . '\');">' . "\n";
02455         if ($nbTotalPage < $showAll) {
02456             $pages = range(1, $nbTotalPage);
02457         } else {
02458             $pages = array();
02459 
02460             // Always show first X pages
02461             for ($i = 1; $i <= $sliceStart; $i++) {
02462                 $pages[] = $i;
02463             }
02464 
02465             // Always show last X pages
02466             for ($i = $nbTotalPage - $sliceEnd; $i <= $nbTotalPage; $i++) {
02467                 $pages[] = $i;
02468             }
02469 
02470             // garvin: Based on the number of results we add the specified $percent percentate to each page number,
02471             // so that we have a representing page number every now and then to immideately jump to specific pages.
02472             // As soon as we get near our currently chosen page ($pageNow - $range), every page number will be
02473             // shown.
02474             $i = $sliceStart;
02475             $x = $nbTotalPage - $sliceEnd;
02476             $met_boundary = false;
02477             while($i <= $x) {
02478                 if ($i >= ($pageNow - $range) && $i <= ($pageNow + $range)) {
02479                     // If our pageselector comes near the current page, we use 1 counter increments
02480                     $i++;
02481                     $met_boundary = true;
02482                 } else {
02483                     // We add the percentate increment to our current page to hop to the next one in range
02484                     $i = $i + floor($nbTotalPage / $percent);
02485 
02486                     // Make sure that we do not cross our boundaries.
02487                     if ($i > ($pageNow - $range) && !$met_boundary) {
02488                         $i = $pageNow - $range;
02489                     }
02490                 }
02491 
02492                 if ($i > 0 && $i <= $x) {
02493                     $pages[] = $i;
02494                 }
02495             }
02496 
02497             // Since because of ellipsing of the current page some numbers may be double,
02498             // we unify our array:
02499             sort($pages);
02500             $pages = array_unique($pages);
02501         }
02502 
02503         foreach($pages AS $i) {
02504             if ($i == $pageNow) {
02505                 $selected = 'selected="selected" style="font-weight: bold"';
02506             } else {
02507                 $selected = '';
02508             }
02509             $gotopage .= '                <option ' . $selected . ' value="' . (($i - 1) * $rows) . '">' . $i . '</option>' . "\n";
02510         }
02511 
02512         $gotopage .= ' </select>';
02513 
02514         return $gotopage;
02515     } // end function
02516 
02517 
02518     function PMA_generateAlterTable($oldcol, $newcol, $full_field_type, $collation, $null, $default, $default_current_timestamp, $extra, $comment='') {
02519 
02520         // $default_current_timestamp has priority over $default
02521         // TODO: on the interface, some js to clear the default value
02522         // when the default current_timestamp is checked
02523 
02524         $query = PMA_backquote($oldcol) . ' ' . PMA_backquote($newcol) . ' '
02525             . $full_field_type;
02526         if (PMA_MYSQL_INT_VERSION >= 40100 && !empty($collation) && $collation != 'NULL' && preg_match('@^(TINYTEXT|TEXT|MEDIUMTEXT|LONGTEXT|VARCHAR\(\d+\)|CHAR\(\d+\))$@i', $full_field_type)) {
02527             $query .= PMA_generateCharsetQueryPart($collation);
02528         }
02529 
02530         if (!empty($null)) {
02531             $query .= ' NOT NULL';
02532         } else {
02533             $query .= ' NULL';
02534         }
02535 
02536         if ($default_current_timestamp && strpos(' ' . strtoupper($full_field_type),'TIMESTAMP') == 1) {
02537             $query .= ' DEFAULT CURRENT_TIMESTAMP';
02538             // 0 is empty in PHP
02539         } elseif (!empty($default) || $default == '0') {
02540             if (strtoupper($default) == 'NULL') {
02541                 $query .= ' DEFAULT NULL';
02542             } else {
02543                 $query .= ' DEFAULT \'' . PMA_sqlAddslashes($default) . '\'';
02544             }
02545         }
02546 
02547         if (!empty($extra)) {
02548             $query .= ' ' . $extra;
02549         }
02550         if (PMA_MYSQL_INT_VERSION >= 40100 && !empty($comment)) {
02551             $query .= " COMMENT '" . PMA_sqlAddslashes($comment) . "'";
02552         }
02553         return $query;
02554     } // end function
02555 
02556 } // end if: minimal common.lib needed?
02557 
02558 ?>


Généré par TYPO3 Ameos avec  doxygen 1.4.6