Verzeichnisstruktur phpBB-3.2.0
- Veröffentlicht
- 06.01.2017
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 if ($result)
074 {
075 $row = mysql_fetch_assoc($result);
076 mysql_free_result($result);
077 $modes = array_map('trim', explode(',', $row['sql_mode']));
078 }
079 else
080 {
081 $modes = array();
082 }
083
084 // TRADITIONAL includes STRICT_ALL_TABLES and STRICT_TRANS_TABLES
085 if (!in_array('TRADITIONAL', $modes))
086 {
087 if (!in_array('STRICT_ALL_TABLES', $modes))
088 {
089 $modes[] = 'STRICT_ALL_TABLES';
090 }
091
092 if (!in_array('STRICT_TRANS_TABLES', $modes))
093 {
094 $modes[] = 'STRICT_TRANS_TABLES';
095 }
096 }
097
098 $mode = implode(',', $modes);
099 @mysql_query("SET SESSION sql_mode='{$mode}'", $this->db_connect_id);
100 }
101 }
102 else if (version_compare($this->sql_server_info(true), '4.0.0', '<'))
103 {
104 $this->sql_layer = 'mysql';
105 }
106
107 return $this->db_connect_id;
108 }
109 }
110
111 return $this->sql_error('');
112 }
113
114 /**
115 * {@inheritDoc}
116 */
117 function sql_server_info($raw = false, $use_cache = true)
118 {
119 global $cache;
120
121 if (!$use_cache || empty($cache) || ($this->sql_server_version = $cache->get('mysql_version')) === false)
122 {
123 $result = @mysql_query('SELECT VERSION() AS version', $this->db_connect_id);
124 if ($result)
125 {
126 $row = mysql_fetch_assoc($result);
127 mysql_free_result($result);
128
129 $this->sql_server_version = $row['version'];
130
131 if (!empty($cache) && $use_cache)
132 {
133 $cache->put('mysql_version', $this->sql_server_version);
134 }
135 }
136 }
137
138 return ($raw) ? $this->sql_server_version : 'MySQL ' . $this->sql_server_version;
139 }
140
141 /**
142 * SQL Transaction
143 * @access private
144 */
145 function _sql_transaction($status = 'begin')
146 {
147 switch ($status)
148 {
149 case 'begin':
150 return @mysql_query('BEGIN', $this->db_connect_id);
151 break;
152
153 case 'commit':
154 return @mysql_query('COMMIT', $this->db_connect_id);
155 break;
156
157 case 'rollback':
158 return @mysql_query('ROLLBACK', $this->db_connect_id);
159 break;
160 }
161
162 return true;
163 }
164
165 /**
166 * {@inheritDoc}
167 */
168 function sql_query($query = '', $cache_ttl = 0)
169 {
170 if ($query != '')
171 {
172 global $cache;
173
174 // EXPLAIN only in extra debug mode
175 if (defined('DEBUG'))
176 {
177 $this->sql_report('start', $query);
178 }
179 else if (defined('PHPBB_DISPLAY_LOAD_TIME'))
180 {
181 $this->curtime = microtime(true);
182 }
183
184 $this->query_result = ($cache && $cache_ttl) ? $cache->sql_load($query) : false;
185 $this->sql_add_num_queries($this->query_result);
186
187 if ($this->query_result === false)
188 {
189 if (($this->query_result = @mysql_query($query, $this->db_connect_id)) === false)
190 {
191 $this->sql_error($query);
192 }
193
194 if (defined('DEBUG'))
195 {
196 $this->sql_report('stop', $query);
197 }
198 else if (defined('PHPBB_DISPLAY_LOAD_TIME'))
199 {
200 $this->sql_time += microtime(true) - $this->curtime;
201 }
202
203 if (!$this->query_result)
204 {
205 return false;
206 }
207
208 if ($cache && $cache_ttl)
209 {
210 $this->open_queries[(int) $this->query_result] = $this->query_result;
211 $this->query_result = $cache->sql_save($this, $query, $this->query_result, $cache_ttl);
212 }
213 else if (strpos($query, 'SELECT') === 0)
214 {
215 $this->open_queries[(int) $this->query_result] = $this->query_result;
216 }
217 }
218 else if (defined('DEBUG'))
219 {
220 $this->sql_report('fromcache', $query);
221 }
222 }
223 else
224 {
225 return false;
226 }
227
228 return $this->query_result;
229 }
230
231 /**
232 * {@inheritDoc}
233 */
234 function sql_affectedrows()
235 {
236 if ($this->db_connect_id)
237 {
238 // We always want the number of matched rows
239 // instead of changed rows, when running an update.
240 // So when mysql_info() returns the number of matched rows
241 // we return that one instead of mysql_affected_rows()
242 $mysql_info = @mysql_info($this->db_connect_id);
243 if ($mysql_info !== false)
244 {
245 $match = array();
246 preg_match('#^Rows matched: (\d)+ Changed: (\d)+ Warnings: (\d)+$#', $mysql_info, $match);
247 if (isset($match[1]))
248 {
249 return $match[1];
250 }
251 }
252
253 return @mysql_affected_rows($this->db_connect_id);
254 }
255 return false;
256 }
257
258 /**
259 * {@inheritDoc}
260 */
261 function sql_fetchrow($query_id = false)
262 {
263 global $cache;
264
265 if ($query_id === false)
266 {
267 $query_id = $this->query_result;
268 }
269
270 if ($cache && $cache->sql_exists($query_id))
271 {
272 return $cache->sql_fetchrow($query_id);
273 }
274
275 return ($query_id) ? mysql_fetch_assoc($query_id) : false;
276 }
277
278 /**
279 * {@inheritDoc}
280 */
281 function sql_rowseek($rownum, &$query_id)
282 {
283 global $cache;
284
285 if ($query_id === false)
286 {
287 $query_id = $this->query_result;
288 }
289
290 if ($cache && $cache->sql_exists($query_id))
291 {
292 return $cache->sql_rowseek($rownum, $query_id);
293 }
294
295 return ($query_id !== false) ? @mysql_data_seek($query_id, $rownum) : false;
296 }
297
298 /**
299 * {@inheritDoc}
300 */
301 function sql_nextid()
302 {
303 return ($this->db_connect_id) ? @mysql_insert_id($this->db_connect_id) : false;
304 }
305
306 /**
307 * {@inheritDoc}
308 */
309 function sql_freeresult($query_id = false)
310 {
311 global $cache;
312
313 if ($query_id === false)
314 {
315 $query_id = $this->query_result;
316 }
317
318 if ($cache && !is_object($query_id) && $cache->sql_exists($query_id))
319 {
320 return $cache->sql_freeresult($query_id);
321 }
322
323 if (isset($this->open_queries[(int) $query_id]))
324 {
325 unset($this->open_queries[(int) $query_id]);
326 return mysql_free_result($query_id);
327 }
328
329 return false;
330 }
331
332 /**
333 * {@inheritDoc}
334 */
335 function sql_escape($msg)
336 {
337 if (!$this->db_connect_id)
338 {
339 return @mysql_real_escape_string($msg);
340 }
341
342 return @mysql_real_escape_string($msg, $this->db_connect_id);
343 }
344
345 /**
346 * return sql error array
347 * @access private
348 */
349 function _sql_error()
350 {
351 if ($this->db_connect_id)
352 {
353 $error = array(
354 'message' => @mysql_error($this->db_connect_id),
355 'code' => @mysql_errno($this->db_connect_id),
356 );
357 }
358 else if (function_exists('mysql_error'))
359 {
360 $error = array(
361 'message' => @mysql_error(),
362 'code' => @mysql_errno(),
363 );
364 }
365 else
366 {
367 $error = array(
368 'message' => $this->connect_error,
369 'code' => '',
370 );
371 }
372
373 return $error;
374 }
375
376 /**
377 * Close sql connection
378 * @access private
379 */
380 function _sql_close()
381 {
382 return @mysql_close($this->db_connect_id);
383 }
384
385 /**
386 * Build db-specific report
387 * @access private
388 */
389 function _sql_report($mode, $query = '')
390 {
391 static $test_prof;
392
393 // current detection method, might just switch to see the existance of INFORMATION_SCHEMA.PROFILING
394 if ($test_prof === null)
395 {
396 $test_prof = false;
397 if (version_compare($this->sql_server_info(true), '5.0.37', '>=') && version_compare($this->sql_server_info(true), '5.1', '<'))
398 {
399 $test_prof = true;
400 }
401 }
402
403 switch ($mode)
404 {
405 case 'start':
406
407 $explain_query = $query;
408 if (preg_match('/UPDATE ([a-z0-9_]+).*?WHERE(.*)/s', $query, $m))
409 {
410 $explain_query = 'SELECT * FROM ' . $m[1] . ' WHERE ' . $m[2];
411 }
412 else if (preg_match('/DELETE FROM ([a-z0-9_]+).*?WHERE(.*)/s', $query, $m))
413 {
414 $explain_query = 'SELECT * FROM ' . $m[1] . ' WHERE ' . $m[2];
415 }
416
417 if (preg_match('/^SELECT/', $explain_query))
418 {
419 $html_table = false;
420
421 // begin profiling
422 if ($test_prof)
423 {
424 @mysql_query('SET profiling = 1;', $this->db_connect_id);
425 }
426
427 if ($result = @mysql_query("EXPLAIN $explain_query", $this->db_connect_id))
428 {
429 while ($row = mysql_fetch_assoc($result))
430 {
431 $html_table = $this->sql_report('add_select_row', $query, $html_table, $row);
432 }
433 mysql_free_result($result);
434 }
435
436 if ($html_table)
437 {
438 $this->html_hold .= '</table>';
439 }
440
441 if ($test_prof)
442 {
443 $html_table = false;
444
445 // get the last profile
446 if ($result = @mysql_query('SHOW PROFILE ALL;', $this->db_connect_id))
447 {
448 $this->html_hold .= '<br />';
449 while ($row = mysql_fetch_assoc($result))
450 {
451 // make <unknown> HTML safe
452 if (!empty($row['Source_function']))
453 {
454 $row['Source_function'] = str_replace(array('<', '>'), array('<', '>'), $row['Source_function']);
455 }
456
457 // remove unsupported features
458 foreach ($row as $key => $val)
459 {
460 if ($val === null)
461 {
462 unset($row[$key]);
463 }
464 }
465 $html_table = $this->sql_report('add_select_row', $query, $html_table, $row);
466 }
467 mysql_free_result($result);
468 }
469
470 if ($html_table)
471 {
472 $this->html_hold .= '</table>';
473 }
474
475 @mysql_query('SET profiling = 0;', $this->db_connect_id);
476 }
477 }
478
479 break;
480
481 case 'fromcache':
482 $endtime = explode(' ', microtime());
483 $endtime = $endtime[0] + $endtime[1];
484
485 $result = @mysql_query($query, $this->db_connect_id);
486 if ($result)
487 {
488 while ($void = mysql_fetch_assoc($result))
489 {
490 // Take the time spent on parsing rows into account
491 }
492 mysql_free_result($result);
493 }
494
495 $splittime = explode(' ', microtime());
496 $splittime = $splittime[0] + $splittime[1];
497
498 $this->sql_report('record_fromcache', $query, $endtime, $splittime);
499
500 break;
501 }
502 }
503 }
504