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