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  ?>