Verzeichnisstruktur phpBB-3.0.0


Veröffentlicht
12.12.2007

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

      (Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

functions_install.php

Zuletzt modifiziert: 09.10.2024, 12:50 - Dateigröße: 12.62 KiB


 001  <?php
 002  /**
 003  *
 004  * @package install
 005  * @version $Id$
 006  * @copyright (c) 2006 phpBB Group
 007  * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 008  *
 009  */
 010   
 011  /**
 012  * @ignore
 013  */
 014  if (!defined('IN_PHPBB'))
 015  {
 016      exit;
 017  }
 018   
 019  /**
 020  * Determine if we are able to load a specified PHP module and do so if possible
 021  */
 022  function can_load_dll($dll)
 023  {
 024      return ((@ini_get('enable_dl') || strtolower(@ini_get('enable_dl')) == 'on') && (!@ini_get('safe_mode') || strtolower(@ini_get('safe_mode')) == 'off') && @dl($dll . '.' . PHP_SHLIB_SUFFIX)) ? true : false;
 025  }
 026   
 027  /**
 028  * Returns an array of available DBMS with some data, if a DBMS is specified it will only
 029  * return data for that DBMS and will load its extension if necessary.
 030  */
 031  function get_available_dbms($dbms = false, $return_unavailable = false, $only_20x_options = false)
 032  {
 033      global $lang;
 034      $available_dbms = array(
 035          'firebird'    => array(
 036              'LABEL'            => 'FireBird',
 037              'SCHEMA'        => 'firebird',
 038              'MODULE'        => 'interbase',
 039              'DELIM'            => ';;',
 040              'COMMENTS'        => 'remove_remarks',
 041              'DRIVER'        => 'firebird',
 042              'AVAILABLE'        => true,
 043              '2.0.x'            => false,
 044          ),
 045          'mysqli'    => array(
 046              'LABEL'            => 'MySQL with MySQLi Extension',
 047              'SCHEMA'        => 'mysql_41',
 048              'MODULE'        => 'mysqli',
 049              'DELIM'            => ';',
 050              'COMMENTS'        => 'remove_remarks',
 051              'DRIVER'        => 'mysqli',
 052              'AVAILABLE'        => true,
 053              '2.0.x'            => true,
 054          ),
 055          'mysql'        => array(
 056              'LABEL'            => 'MySQL',
 057              'SCHEMA'        => 'mysql',
 058              'MODULE'        => 'mysql',
 059              'DELIM'            => ';',
 060              'COMMENTS'        => 'remove_remarks',
 061              'DRIVER'        => 'mysql',
 062              'AVAILABLE'        => true,
 063              '2.0.x'            => true,
 064          ),
 065          'mssql'        => array(
 066              'LABEL'            => 'MS SQL Server 2000+',
 067              'SCHEMA'        => 'mssql',
 068              'MODULE'        => 'mssql',
 069              'DELIM'            => 'GO',
 070              'COMMENTS'        => 'remove_comments',
 071              'DRIVER'        => 'mssql',
 072              'AVAILABLE'        => true,
 073              '2.0.x'            => true,
 074          ),
 075          'mssql_odbc'=>    array(
 076              'LABEL'            => 'MS SQL Server [ ODBC ]',
 077              'SCHEMA'        => 'mssql',
 078              'MODULE'        => 'odbc',
 079              'DELIM'            => 'GO',
 080              'COMMENTS'        => 'remove_comments',
 081              'DRIVER'        => 'mssql_odbc',
 082              'AVAILABLE'        => true,
 083              '2.0.x'            => true,
 084          ),
 085          'oracle'    =>    array(
 086              'LABEL'            => 'Oracle',
 087              'SCHEMA'        => 'oracle',
 088              'MODULE'        => 'oci8',
 089              'DELIM'            => '/',
 090              'COMMENTS'        => 'remove_comments',
 091              'DRIVER'        => 'oracle',
 092              'AVAILABLE'        => true,
 093              '2.0.x'            => false,
 094          ),
 095          'postgres' => array(
 096              'LABEL'            => 'PostgreSQL 7.x/8.x',
 097              'SCHEMA'        => 'postgres',
 098              'MODULE'        => 'pgsql',
 099              'DELIM'            => ';',
 100              'COMMENTS'        => 'remove_comments',
 101              'DRIVER'        => 'postgres',
 102              'AVAILABLE'        => true,
 103              '2.0.x'            => true,
 104          ),
 105          'sqlite'        => array(
 106              'LABEL'            => 'SQLite',
 107              'SCHEMA'        => 'sqlite',
 108              'MODULE'        => 'sqlite',
 109              'DELIM'            => ';',
 110              'COMMENTS'        => 'remove_remarks',
 111              'DRIVER'        => 'sqlite',
 112              'AVAILABLE'        => true,
 113              '2.0.x'            => false,
 114          ),
 115      );
 116   
 117      if ($dbms)
 118      {
 119          if (isset($available_dbms[$dbms]))
 120          {
 121              $available_dbms = array($dbms => $available_dbms[$dbms]);
 122          }
 123          else
 124          {
 125              return array();
 126          }
 127      }
 128   
 129      // now perform some checks whether they are really available
 130      foreach ($available_dbms as $db_name => $db_ary)
 131      {
 132          if ($only_20x_options && !$db_ary['2.0.x'])
 133          {
 134              if ($return_unavailable)
 135              {
 136                  $available_dbms[$db_name]['AVAILABLE'] = false;
 137              }
 138              else
 139              {
 140                  unset($available_dbms[$db_name]);
 141              }
 142              continue;
 143          }
 144   
 145          $dll = $db_ary['MODULE'];
 146   
 147          if (!@extension_loaded($dll))
 148          {
 149              if (!can_load_dll($dll))
 150              {
 151                  if ($return_unavailable)
 152                  {
 153                      $available_dbms[$db_name]['AVAILABLE'] = false;
 154                  }
 155                  else
 156                  {
 157                      unset($available_dbms[$db_name]);
 158                  }
 159                  continue;
 160              }
 161          }
 162          $any_db_support = true;
 163      }
 164   
 165      if ($return_unavailable)
 166      {
 167          $available_dbms['ANY_DB_SUPPORT'] = $any_db_support;
 168      }
 169      return $available_dbms;
 170  }
 171   
 172  /**
 173  * Generate the drop down of available database options
 174  */
 175  function dbms_select($default = '', $only_20x_options = false)
 176  {
 177      global $lang;
 178      
 179      $available_dbms = get_available_dbms(false, false, $only_20x_options);
 180      $dbms_options = '';
 181      foreach ($available_dbms as $dbms_name => $details)
 182      {
 183          $selected = ($dbms_name == $default) ? ' selected="selected"' : '';
 184          $dbms_options .= '<option value="' . $dbms_name . '"' . $selected .'>' . $lang['DLL_' . strtoupper($dbms_name)] . '</option>';
 185      }
 186      return $dbms_options;
 187  }
 188   
 189  /**
 190  * Get tables of a database
 191  */
 192  function get_tables($db)
 193  {
 194      switch ($db->sql_layer)
 195      {
 196          case 'mysql':
 197          case 'mysql4':
 198          case 'mysqli':
 199              $sql = 'SHOW TABLES';
 200          break;
 201   
 202          case 'sqlite':
 203              $sql = 'SELECT name
 204                  FROM sqlite_master
 205                  WHERE type = "table"';
 206          break;
 207   
 208          case 'mssql':
 209          case 'mssql_odbc':
 210              $sql = "SELECT name
 211                  FROM sysobjects
 212                  WHERE type='U'";
 213          break;
 214   
 215          case 'postgres':
 216              $sql = 'SELECT relname
 217                  FROM pg_stat_user_tables';
 218          break;
 219   
 220          case 'firebird':
 221              $sql = 'SELECT rdb$relation_name
 222                  FROM rdb$relations
 223                  WHERE rdb$view_source is null
 224                      AND rdb$system_flag = 0';
 225          break;
 226   
 227          case 'oracle':
 228              $sql = 'SELECT table_name
 229                  FROM USER_TABLES';
 230          break;
 231      }
 232   
 233      $result = $db->sql_query($sql);
 234   
 235      $tables = array();
 236   
 237      while ($row = $db->sql_fetchrow($result))
 238      {
 239          $tables[] = current($row);
 240      }
 241   
 242      $db->sql_freeresult($result);
 243   
 244      return $tables;
 245  }
 246   
 247  /**
 248  * Used to test whether we are able to connect to the database the user has specified
 249  * and identify any problems (eg there are already tables with the names we want to use
 250  * @param    array    $dbms should be of the format of an element of the array returned by {@link get_available_dbms get_available_dbms()}
 251  *                    necessary extensions should be loaded already
 252  */
 253  function connect_check_db($error_connect, &$error, $dbms_details, $table_prefix, $dbhost, $dbuser, $dbpasswd, $dbname, $dbport, $prefix_may_exist = false, $load_dbal = true, $unicode_check = true)
 254  {
 255      global $phpbb_root_path, $phpEx, $config, $lang;
 256   
 257      $dbms = $dbms_details['DRIVER'];
 258   
 259      if ($load_dbal)
 260      {
 261          // Include the DB layer
 262          include($phpbb_root_path . 'includes/db/' . $dbms . '.' . $phpEx);
 263      }
 264   
 265      // Instantiate it and set return on error true
 266      $sql_db = 'dbal_' . $dbms;
 267      $db = new $sql_db();
 268      $db->sql_return_on_error(true);
 269   
 270      // Check that we actually have a database name before going any further.....
 271      if ($dbms_details['DRIVER'] != 'sqlite' && $dbms_details['DRIVER'] != 'oracle' && $dbname === '')
 272      {
 273          $error[] = $lang['INST_ERR_DB_NO_NAME'];
 274          return false;
 275      }
 276   
 277      // Make sure we don't have a daft user who thinks having the SQLite database in the forum directory is a good idea
 278      if ($dbms_details['DRIVER'] == 'sqlite' && stripos(phpbb_realpath($dbhost), phpbb_realpath('../')) === 0)
 279      {
 280          $error[] = $lang['INST_ERR_DB_FORUM_PATH'];
 281          return false;
 282      }
 283   
 284      // Check the prefix length to ensure that index names are not too long and does not contain invalid characters
 285      switch ($dbms_details['DRIVER'])
 286      {
 287          case 'mysql':
 288          case 'mysqli':
 289              if (strpos($table_prefix, '-') !== false || strpos($table_prefix, '.') !== false)
 290              {
 291                  $error[] = $lang['INST_ERR_PREFIX_INVALID'];
 292                  return false;
 293              }
 294   
 295          // no break;
 296   
 297          case 'postgres':
 298              $prefix_length = 36;
 299          break;
 300   
 301          case 'mssql':
 302          case 'mssql_odbc':
 303              $prefix_length = 90;
 304          break;
 305   
 306          case 'sqlite':
 307              $prefix_length = 200;
 308          break;
 309   
 310          case 'firebird':
 311          case 'oracle':
 312              $prefix_length = 6;
 313          break;
 314      }
 315   
 316      if (strlen($table_prefix) > $prefix_length)
 317      {
 318          $error[] = sprintf($lang['INST_ERR_PREFIX_TOO_LONG'], $prefix_length);
 319          return false;
 320      }
 321   
 322      // Try and connect ...
 323      if (is_array($db->sql_connect($dbhost, $dbuser, $dbpasswd, $dbname, $dbport, false, true)))
 324      {
 325          $db_error = $db->sql_error();
 326          $error[] = $lang['INST_ERR_DB_CONNECT'] . '<br />' . (($db_error['message']) ? $db_error['message'] : $lang['INST_ERR_DB_NO_ERROR']);
 327      }
 328      else
 329      {
 330          // Likely matches for an existing phpBB installation
 331          if (!$prefix_may_exist)
 332          {
 333              $temp_prefix = strtolower($table_prefix);
 334              $table_ary = array($temp_prefix . 'attachments', $temp_prefix . 'config', $temp_prefix . 'sessions', $temp_prefix . 'topics', $temp_prefix . 'users');
 335   
 336              $tables = get_tables($db);
 337              $tables = array_map('strtolower', $tables);
 338              $table_intersect = array_intersect($tables, $table_ary);
 339   
 340              if (sizeof($table_intersect))
 341              {
 342                  $error[] = $lang['INST_ERR_PREFIX'];
 343              }
 344          }
 345   
 346          // Make sure that the user has selected a sensible DBAL for the DBMS actually installed
 347          switch ($dbms_details['DRIVER'])
 348          {
 349              case 'mysqli':
 350                  if (version_compare(mysqli_get_server_info($db->db_connect_id), '4.1.3', '<'))
 351                  {
 352                      $error[] = $lang['INST_ERR_DB_NO_MYSQLI'];
 353                  }
 354              break;
 355   
 356              case 'sqlite':
 357                  if (version_compare(sqlite_libversion(), '2.8.2', '<'))
 358                  {
 359                      $error[] = $lang['INST_ERR_DB_NO_SQLITE'];
 360                  }
 361              break;
 362   
 363              case 'firebird':
 364                  // check the version of FB, use some hackery if we can't get access to the server info
 365                  if ($db->service_handle !== false && function_exists('ibase_server_info'))
 366                  {
 367                      $val = @ibase_server_info($db->service_handle, IBASE_SVC_SERVER_VERSION);
 368                      preg_match('#V([\d.]+)#', $val, $match);
 369                      if ($match[1] < 2)
 370                      {
 371                          $error[] = $lang['INST_ERR_DB_NO_FIREBIRD'];
 372                      }
 373                      $db_info = @ibase_db_info($db->service_handle, $dbname, IBASE_STS_HDR_PAGES);
 374   
 375                      preg_match('/^\\s*Page size\\s*(\\d+)/m', $db_info, $regs);
 376                      $page_size = intval($regs[1]);
 377                      if ($page_size < 8192)
 378                      {
 379                          $error[] = $lang['INST_ERR_DB_NO_FIREBIRD_PS'];
 380                      }
 381                  }
 382                  else
 383                  {
 384                      $sql = "SELECT *
 385                          FROM RDB$FUNCTIONS
 386                          WHERE RDB$SYSTEM_FLAG IS NULL
 387                              AND RDB$FUNCTION_NAME = 'CHAR_LENGTH'";
 388                      $result = $db->sql_query($sql);
 389                      $row = $db->sql_fetchrow($result);
 390                      $db->sql_freeresult($result);
 391   
 392                      // if its a UDF, its too old
 393                      if ($row)
 394                      {
 395                          $error[] = $lang['INST_ERR_DB_NO_FIREBIRD'];
 396                      }
 397                      else
 398                      {
 399                          $sql = "SELECT FIRST 0 char_length('')
 400                              FROM RDB\$DATABASE";
 401                          $result = $db->sql_query($sql);
 402                          if (!$result) // This can only fail if char_length is not defined
 403                          {
 404                              $error[] = $lang['INST_ERR_DB_NO_FIREBIRD'];
 405                          }
 406                          $db->sql_freeresult($result);
 407                      }
 408   
 409                      // Setup the stuff for our random table
 410                      $char_array = array_merge(range('A', 'Z'), range('0', '9'));
 411                      $char_len = mt_rand(7, 9);
 412                      $char_array_len = sizeof($char_array) - 1;
 413   
 414                      $final = '';
 415   
 416                      for ($i = 0; $i < $char_len; $i++)
 417                      {
 418                          $final .= $char_array[mt_rand(0, $char_array_len)];
 419                      }
 420   
 421                      // Create some random table
 422                      $sql = 'CREATE TABLE ' . $final . " (
 423                          FIELD1 VARCHAR(255) CHARACTER SET UTF8 DEFAULT '' NOT NULL COLLATE UNICODE,
 424                          FIELD2 INTEGER DEFAULT 0 NOT NULL);";
 425                      $db->sql_query($sql);
 426   
 427                      // Create an index that should fail if the page size is less than 8192
 428                      $sql = 'CREATE INDEX ' . $final . ' ON ' . $final . '(FIELD1, FIELD2);';
 429                      $db->sql_query($sql);
 430   
 431                      if (ibase_errmsg() !== false)
 432                      {
 433                          $error[] = $lang['INST_ERR_DB_NO_FIREBIRD_PS'];
 434                      }
 435                      else
 436                      {
 437                          // Kill the old table
 438                          $db->sql_query('DROP TABLE ' . $final . ';');
 439                      }
 440                      unset($final);
 441                  }
 442              break;
 443              
 444              case 'oracle':
 445                  if ($unicode_check)
 446                  {
 447                      $sql = "SELECT *
 448                          FROM NLS_DATABASE_PARAMETERS
 449                          WHERE PARAMETER = 'NLS_RDBMS_VERSION'
 450                              OR PARAMETER = 'NLS_CHARACTERSET'";
 451                      $result = $db->sql_query($sql);
 452   
 453                      while ($row = $db->sql_fetchrow($result))
 454                      {
 455                          $stats[$row['parameter']] = $row['value'];
 456                      }
 457                      $db->sql_freeresult($result);
 458   
 459                      if (version_compare($stats['NLS_RDBMS_VERSION'], '9.2', '<') && $stats['NLS_CHARACTERSET'] !== 'UTF8')
 460                      {
 461                          $error[] = $lang['INST_ERR_DB_NO_ORACLE'];
 462                      }
 463                  }
 464              break;
 465              
 466              case 'postgres':
 467                  if ($unicode_check)
 468                  {
 469                      $sql = "SHOW server_encoding;";
 470                      $result = $db->sql_query($sql);
 471                      $row = $db->sql_fetchrow($result);
 472                      $db->sql_freeresult($result);
 473   
 474                      if ($row['server_encoding'] !== 'UNICODE' && $row['server_encoding'] !== 'UTF8')
 475                      {
 476                          $error[] = $lang['INST_ERR_DB_NO_POSTGRES'];
 477                      }
 478                  }
 479              break;
 480          }
 481   
 482      }
 483   
 484      if ($error_connect && (!isset($error) || !sizeof($error)))
 485      {
 486          return true;
 487      }
 488      return false;
 489  }
 490   
 491  /**
 492  * remove_remarks will strip the sql comment lines out of an uploaded sql file
 493  */
 494  function remove_remarks(&$sql)
 495  {
 496      $sql = preg_replace('/\n{2,}/', "\n", preg_replace('/^#.*$/m', "\n", $sql));
 497  }
 498   
 499  /**
 500  * split_sql_file will split an uploaded sql file into single sql statements.
 501  * Note: expects trim() to have already been run on $sql.
 502  */
 503  function split_sql_file($sql, $delimiter)
 504  {
 505      $sql = str_replace("\r" , '', $sql);
 506      $data = preg_split('/' . preg_quote($delimiter, '/') . '$/m', $sql);
 507   
 508      $data = array_map('trim', $data);
 509   
 510      // The empty case
 511      $end_data = end($data);
 512   
 513      if (empty($end_data))
 514      {
 515          unset($data[key($data)]);
 516      }
 517   
 518      return $data;
 519  }
 520   
 521  /**
 522  * For replacing {L_*} strings with preg_replace_callback
 523  */
 524  function adjust_language_keys_callback($matches)
 525  {
 526      if (!empty($matches[1]))
 527      {
 528          global $lang, $db;
 529   
 530          return (!empty($lang[$matches[1]])) ? $db->sql_escape($lang[$matches[1]]) : $db->sql_escape($matches[1]);
 531      }
 532  }
 533   
 534  ?>