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. |
|
(Beispiel Datei-Icons)
|
Auf das Icon klicken um den Quellcode anzuzeigen |
functions_install.php
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 ?>