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.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

(Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

mysql.php

Zuletzt modifiziert: 09.10.2024, 12:54 - Dateigröße: 10.63 KiB


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('&lt;', '&gt;'), $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