Verzeichnisstruktur phpBB-3.1.0
- Veröffentlicht
- 27.10.2014
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 |
mysql.php
001 <?php
002 /**
003 *
004 * This file is part of the phpBB Forum Software package.
005 *
006 * @copyright (c) phpBB Limited <https://www.phpbb.com>
007 * @license GNU General Public License, version 2 (GPL-2.0)
008 *
009 * For full copyright and license information, please see
010 * the docs/CREDITS.txt file.
011 *
012 */
013
014 namespace phpbb\db\driver;
015
016 /**
017 * MySQL4 Database Abstraction Layer
018 * Compatible with:
019 * MySQL 3.23+
020 * MySQL 4.0+
021 * MySQL 4.1+
022 * MySQL 5.0+
023 */
024 class mysql extends \phpbb\db\driver\mysql_base
025 {
026 var $multi_insert = true;
027 var $connect_error = '';
028
029 /**
030 * {@inheritDoc}
031 */
032 function sql_connect($sqlserver, $sqluser, $sqlpassword, $database, $port = false, $persistency = false, $new_link = false)
033 {
034 $this->persistency = $persistency;
035 $this->user = $sqluser;
036 $this->server = $sqlserver . (($port) ? ':' . $port : '');
037 $this->dbname = $database;
038
039 $this->sql_layer = 'mysql4';
040
041 if ($this->persistency)
042 {
043 if (!function_exists('mysql_pconnect'))
044 {
045 $this->connect_error = 'mysql_pconnect function does not exist, is mysql extension installed?';
046 return $this->sql_error('');
047 }
048 $this->db_connect_id = @mysql_pconnect($this->server, $this->user, $sqlpassword);
049 }
050 else
051 {
052 if (!function_exists('mysql_connect'))
053 {
054 $this->connect_error = 'mysql_connect function does not exist, is mysql extension installed?';
055 return $this->sql_error('');
056 }
057 $this->db_connect_id = @mysql_connect($this->server, $this->user, $sqlpassword, $new_link);
058 }
059
060 if ($this->db_connect_id && $this->dbname != '')
061 {
062 if (@mysql_select_db($this->dbname, $this->db_connect_id))
063 {
064 // Determine what version we are using and if it natively supports UNICODE
065 if (version_compare($this->sql_server_info(true), '4.1.0', '>='))
066 {
067 @mysql_query("SET NAMES 'utf8'", $this->db_connect_id);
068
069 // enforce strict mode on databases that support it
070 if (version_compare($this->sql_server_info(true), '5.0.2', '>='))
071 {
072 $result = @mysql_query('SELECT @@session.sql_mode AS sql_mode', $this->db_connect_id);
073 $row = @mysql_fetch_assoc($result);
074 @mysql_free_result($result);
075 $modes = array_map('trim', explode(',', $row['sql_mode']));
076
077 // TRADITIONAL includes STRICT_ALL_TABLES and STRICT_TRANS_TABLES
078 if (!in_array('TRADITIONAL', $modes))
079 {
080 if (!in_array('STRICT_ALL_TABLES', $modes))
081 {
082 $modes[] = 'STRICT_ALL_TABLES';
083 }
084
085 if (!in_array('STRICT_TRANS_TABLES', $modes))
086 {
087 $modes[] = 'STRICT_TRANS_TABLES';
088 }
089 }
090
091 $mode = implode(',', $modes);
092 @mysql_query("SET SESSION sql_mode='{$mode}'", $this->db_connect_id);
093 }
094 }
095 else if (version_compare($this->sql_server_info(true), '4.0.0', '<'))
096 {
097 $this->sql_layer = 'mysql';
098 }
099
100 return $this->db_connect_id;
101 }
102 }
103
104 return $this->sql_error('');
105 }
106
107 /**
108 * {@inheritDoc}
109 */
110 function sql_server_info($raw = false, $use_cache = true)
111 {
112 global $cache;
113
114 if (!$use_cache || empty($cache) || ($this->sql_server_version = $cache->get('mysql_version')) === false)
115 {
116 $result = @mysql_query('SELECT VERSION() AS version', $this->db_connect_id);
117 $row = @mysql_fetch_assoc($result);
118 @mysql_free_result($result);
119
120 $this->sql_server_version = $row['version'];
121
122 if (!empty($cache) && $use_cache)
123 {
124 $cache->put('mysql_version', $this->sql_server_version);
125 }
126 }
127
128 return ($raw) ? $this->sql_server_version : 'MySQL ' . $this->sql_server_version;
129 }
130
131 /**
132 * SQL Transaction
133 * @access private
134 */
135 function _sql_transaction($status = 'begin')
136 {
137 switch ($status)
138 {
139 case 'begin':
140 return @mysql_query('BEGIN', $this->db_connect_id);
141 break;
142
143 case 'commit':
144 return @mysql_query('COMMIT', $this->db_connect_id);
145 break;
146
147 case 'rollback':
148 return @mysql_query('ROLLBACK', $this->db_connect_id);
149 break;
150 }
151
152 return true;
153 }
154
155 /**
156 * {@inheritDoc}
157 */
158 function sql_query($query = '', $cache_ttl = 0)
159 {
160 if ($query != '')
161 {
162 global $cache;
163
164 // EXPLAIN only in extra debug mode
165 if (defined('DEBUG'))
166 {
167 $this->sql_report('start', $query);
168 }
169 else if (defined('PHPBB_DISPLAY_LOAD_TIME'))
170 {
171 $this->curtime = microtime(true);
172 }
173
174 $this->query_result = ($cache && $cache_ttl) ? $cache->sql_load($query) : false;
175 $this->sql_add_num_queries($this->query_result);
176
177 if ($this->query_result === false)
178 {
179 if (($this->query_result = @mysql_query($query, $this->db_connect_id)) === false)
180 {
181 $this->sql_error($query);
182 }
183
184 if (defined('DEBUG'))
185 {
186 $this->sql_report('stop', $query);
187 }
188 else if (defined('PHPBB_DISPLAY_LOAD_TIME'))
189 {
190 $this->sql_time += microtime(true) - $this->curtime;
191 }
192
193 if ($cache && $cache_ttl)
194 {
195 $this->open_queries[(int) $this->query_result] = $this->query_result;
196 $this->query_result = $cache->sql_save($this, $query, $this->query_result, $cache_ttl);
197 }
198 else if (strpos($query, 'SELECT') === 0 && $this->query_result)
199 {
200 $this->open_queries[(int) $this->query_result] = $this->query_result;
201 }
202 }
203 else if (defined('DEBUG'))
204 {
205 $this->sql_report('fromcache', $query);
206 }
207 }
208 else
209 {
210 return false;
211 }
212
213 return $this->query_result;
214 }
215
216 /**
217 * {@inheritDoc}
218 */
219 function sql_affectedrows()
220 {
221 if ($this->db_connect_id)
222 {
223 // We always want the number of matched rows
224 // instead of changed rows, when running an update.
225 // So when mysql_info() returns the number of matched rows
226 // we return that one instead of mysql_affected_rows()
227 $mysql_info = @mysql_info($this->db_connect_id);
228 if ($mysql_info !== false)
229 {
230 $match = array();
231 preg_match('#^Rows matched: (\d)+ Changed: (\d)+ Warnings: (\d)+$#', $mysql_info, $match);
232 if (isset($match[1]))
233 {
234 return $match[1];
235 }
236 }
237
238 return @mysql_affected_rows($this->db_connect_id);
239 }
240 return false;
241 }
242
243 /**
244 * {@inheritDoc}
245 */
246 function sql_fetchrow($query_id = false)
247 {
248 global $cache;
249
250 if ($query_id === false)
251 {
252 $query_id = $this->query_result;
253 }
254
255 if ($cache && $cache->sql_exists($query_id))
256 {
257 return $cache->sql_fetchrow($query_id);
258 }
259
260 return ($query_id !== false) ? @mysql_fetch_assoc($query_id) : false;
261 }
262
263 /**
264 * {@inheritDoc}
265 */
266 function sql_rowseek($rownum, &$query_id)
267 {
268 global $cache;
269
270 if ($query_id === false)
271 {
272 $query_id = $this->query_result;
273 }
274
275 if ($cache && $cache->sql_exists($query_id))
276 {
277 return $cache->sql_rowseek($rownum, $query_id);
278 }
279
280 return ($query_id !== false) ? @mysql_data_seek($query_id, $rownum) : false;
281 }
282
283 /**
284 * {@inheritDoc}
285 */
286 function sql_nextid()
287 {
288 return ($this->db_connect_id) ? @mysql_insert_id($this->db_connect_id) : false;
289 }
290
291 /**
292 * {@inheritDoc}
293 */
294 function sql_freeresult($query_id = false)
295 {
296 global $cache;
297
298 if ($query_id === false)
299 {
300 $query_id = $this->query_result;
301 }
302
303 if ($cache && !is_object($query_id) && $cache->sql_exists($query_id))
304 {
305 return $cache->sql_freeresult($query_id);
306 }
307
308 if (isset($this->open_queries[(int) $query_id]))
309 {
310 unset($this->open_queries[(int) $query_id]);
311 return @mysql_free_result($query_id);
312 }
313
314 return false;
315 }
316
317 /**
318 * {@inheritDoc}
319 */
320 function sql_escape($msg)
321 {
322 if (!$this->db_connect_id)
323 {
324 return @mysql_real_escape_string($msg);
325 }
326
327 return @mysql_real_escape_string($msg, $this->db_connect_id);
328 }
329
330 /**
331 * return sql error array
332 * @access private
333 */
334 function _sql_error()
335 {
336 if ($this->db_connect_id)
337 {
338 $error = array(
339 'message' => @mysql_error($this->db_connect_id),
340 'code' => @mysql_errno($this->db_connect_id),
341 );
342 }
343 else if (function_exists('mysql_error'))
344 {
345 $error = array(
346 'message' => @mysql_error(),
347 'code' => @mysql_errno(),
348 );
349 }
350 else
351 {
352 $error = array(
353 'message' => $this->connect_error,
354 'code' => '',
355 );
356 }
357
358 return $error;
359 }
360
361 /**
362 * Close sql connection
363 * @access private
364 */
365 function _sql_close()
366 {
367 return @mysql_close($this->db_connect_id);
368 }
369
370 /**
371 * Build db-specific report
372 * @access private
373 */
374 function _sql_report($mode, $query = '')
375 {
376 static $test_prof;
377
378 // current detection method, might just switch to see the existance of INFORMATION_SCHEMA.PROFILING
379 if ($test_prof === null)
380 {
381 $test_prof = false;
382 if (version_compare($this->sql_server_info(true), '5.0.37', '>=') && version_compare($this->sql_server_info(true), '5.1', '<'))
383 {
384 $test_prof = true;
385 }
386 }
387
388 switch ($mode)
389 {
390 case 'start':
391
392 $explain_query = $query;
393 if (preg_match('/UPDATE ([a-z0-9_]+).*?WHERE(.*)/s', $query, $m))
394 {
395 $explain_query = 'SELECT * FROM ' . $m[1] . ' WHERE ' . $m[2];
396 }
397 else if (preg_match('/DELETE FROM ([a-z0-9_]+).*?WHERE(.*)/s', $query, $m))
398 {
399 $explain_query = 'SELECT * FROM ' . $m[1] . ' WHERE ' . $m[2];
400 }
401
402 if (preg_match('/^SELECT/', $explain_query))
403 {
404 $html_table = false;
405
406 // begin profiling
407 if ($test_prof)
408 {
409 @mysql_query('SET profiling = 1;', $this->db_connect_id);
410 }
411
412 if ($result = @mysql_query("EXPLAIN $explain_query", $this->db_connect_id))
413 {
414 while ($row = @mysql_fetch_assoc($result))
415 {
416 $html_table = $this->sql_report('add_select_row', $query, $html_table, $row);
417 }
418 }
419 @mysql_free_result($result);
420
421 if ($html_table)
422 {
423 $this->html_hold .= '</table>';
424 }
425
426 if ($test_prof)
427 {
428 $html_table = false;
429
430 // get the last profile
431 if ($result = @mysql_query('SHOW PROFILE ALL;', $this->db_connect_id))
432 {
433 $this->html_hold .= '<br />';
434 while ($row = @mysql_fetch_assoc($result))
435 {
436 // make <unknown> HTML safe
437 if (!empty($row['Source_function']))
438 {
439 $row['Source_function'] = str_replace(array('<', '>'), array('<', '>'), $row['Source_function']);
440 }
441
442 // remove unsupported features
443 foreach ($row as $key => $val)
444 {
445 if ($val === null)
446 {
447 unset($row[$key]);
448 }
449 }
450 $html_table = $this->sql_report('add_select_row', $query, $html_table, $row);
451 }
452 }
453 @mysql_free_result($result);
454
455 if ($html_table)
456 {
457 $this->html_hold .= '</table>';
458 }
459
460 @mysql_query('SET profiling = 0;', $this->db_connect_id);
461 }
462 }
463
464 break;
465
466 case 'fromcache':
467 $endtime = explode(' ', microtime());
468 $endtime = $endtime[0] + $endtime[1];
469
470 $result = @mysql_query($query, $this->db_connect_id);
471 while ($void = @mysql_fetch_assoc($result))
472 {
473 // Take the time spent on parsing rows into account
474 }
475 @mysql_free_result($result);
476
477 $splittime = explode(' ', microtime());
478 $splittime = $splittime[0] + $splittime[1];
479
480 $this->sql_report('record_fromcache', $query, $endtime, $splittime);
481
482 break;
483 }
484 }
485 }
486