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

      (Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

mysqli.php

Zuletzt modifiziert: 09.10.2024, 12:51 - Dateigröße: 9.53 KiB


 001  <?php
 002  /**
 003  *
 004  * @package dbal
 005  * @version $Id$
 006  * @copyright (c) 2005 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  include_once($phpbb_root_path . 'includes/db/dbal.' . $phpEx);
 020   
 021  /**
 022  * MySQLi Database Abstraction Layer
 023  * mysqli-extension has to be compiled with:
 024  * MySQL 4.1+ or MySQL 5.0+
 025  * @package dbal
 026  */
 027  class dbal_mysqli extends dbal
 028  {
 029      var $multi_insert = true;
 030   
 031      /**
 032      * Connect to server
 033      */
 034      function sql_connect($sqlserver, $sqluser, $sqlpassword, $database, $port = false, $persistency = false , $new_link = false)
 035      {
 036          $this->persistency = $persistency;
 037          $this->user = $sqluser;
 038          $this->server = $sqlserver;
 039          $this->dbname = $database;
 040          $port = (!$port) ? NULL : $port;
 041   
 042          // Persistant connections not supported by the mysqli extension?
 043          $this->db_connect_id = @mysqli_connect($this->server, $this->user, $sqlpassword, $this->dbname, $port);
 044   
 045          if ($this->db_connect_id && $this->dbname != '')
 046          {
 047              @mysqli_query($this->db_connect_id, "SET NAMES 'utf8'");
 048              // enforce strict mode on databases that support it
 049              if (mysqli_get_server_version($this->db_connect_id) >= 50002)
 050              {
 051                  $result = @mysqli_query($this->db_connect_id, 'SELECT @@session.sql_mode AS sql_mode');
 052                  $row = @mysqli_fetch_assoc($result);
 053                  @mysqli_free_result($result);
 054                  $modes = array_map('trim', explode(',', $row['sql_mode']));
 055   
 056                  // TRADITIONAL includes STRICT_ALL_TABLES and STRICT_TRANS_TABLES
 057                  if (!in_array('TRADITIONAL', $modes))
 058                  {
 059                      if (!in_array('STRICT_ALL_TABLES', $modes))
 060                      {
 061                          $modes[] = 'STRICT_ALL_TABLES';
 062                      }
 063   
 064                      if (!in_array('STRICT_TRANS_TABLES', $modes))
 065                      {
 066                          $modes[] = 'STRICT_TRANS_TABLES';
 067                      }
 068                  }
 069   
 070                  $mode = implode(',', $modes);
 071                  @mysqli_query($this->db_connect_id, "SET SESSION sql_mode='{$mode}'");
 072              }
 073              return $this->db_connect_id;
 074          }
 075   
 076          return $this->sql_error('');
 077      }
 078   
 079      /**
 080      * Version information about used database
 081      */
 082      function sql_server_info()
 083      {
 084          return 'MySQL(i) ' . @mysqli_get_server_info($this->db_connect_id);
 085      }
 086   
 087      /**
 088      * SQL Transaction
 089      * @access private
 090      */
 091      function _sql_transaction($status = 'begin')
 092      {
 093          switch ($status)
 094          {
 095              case 'begin':
 096                  return @mysqli_autocommit($this->db_connect_id, false);
 097              break;
 098   
 099              case 'commit':
 100                  $result = @mysqli_commit($this->db_connect_id);
 101                  @mysqli_autocommit($this->db_connect_id, true);
 102                  return $result;
 103              break;
 104   
 105              case 'rollback':
 106                  $result = @mysqli_rollback($this->db_connect_id);
 107                  @mysqli_autocommit($this->db_connect_id, true);
 108                  return $result;
 109              break;
 110          }
 111   
 112          return true;
 113      }
 114   
 115      /**
 116      * Base query method
 117      *
 118      * @param    string    $query        Contains the SQL query which shall be executed
 119      * @param    int        $cache_ttl    Either 0 to avoid caching or the time in seconds which the result shall be kept in cache
 120      * @return    mixed                When casted to bool the returned value returns true on success and false on failure
 121      *
 122      * @access    public
 123      */
 124      function sql_query($query = '', $cache_ttl = 0)
 125      {
 126          if ($query != '')
 127          {
 128              global $cache;
 129   
 130              // EXPLAIN only in extra debug mode
 131              if (defined('DEBUG_EXTRA'))
 132              {
 133                  $this->sql_report('start', $query);
 134              }
 135   
 136              $this->query_result = ($cache_ttl && method_exists($cache, 'sql_load')) ? $cache->sql_load($query) : false;
 137              $this->sql_add_num_queries($this->query_result);
 138   
 139              if ($this->query_result === false)
 140              {
 141                  if (($this->query_result = @mysqli_query($this->db_connect_id, $query)) === false)
 142                  {
 143                      $this->sql_error($query);
 144                  }
 145   
 146                  if (defined('DEBUG_EXTRA'))
 147                  {
 148                      $this->sql_report('stop', $query);
 149                  }
 150   
 151                  if ($cache_ttl && method_exists($cache, 'sql_save'))
 152                  {
 153                      $cache->sql_save($query, $this->query_result, $cache_ttl);
 154                  }
 155              }
 156              else if (defined('DEBUG_EXTRA'))
 157              {
 158                  $this->sql_report('fromcache', $query);
 159              }
 160          }
 161          else
 162          {
 163              return false;
 164          }
 165   
 166          return ($this->query_result) ? $this->query_result : false;
 167      }
 168   
 169      /**
 170      * Build LIMIT query
 171      */
 172      function _sql_query_limit($query, $total, $offset = 0, $cache_ttl = 0)
 173      {
 174          $this->query_result = false;
 175   
 176          // if $total is set to 0 we do not want to limit the number of rows
 177          if ($total == 0)
 178          {
 179              // MySQL 4.1+ no longer supports -1 in limit queries
 180              $total = '18446744073709551615';
 181          }
 182   
 183          $query .= "\n LIMIT " . ((!empty($offset)) ? $offset . ', ' . $total : $total);
 184   
 185          return $this->sql_query($query, $cache_ttl);
 186      }
 187   
 188      /**
 189      * Return number of affected rows
 190      */
 191      function sql_affectedrows()
 192      {
 193          return ($this->db_connect_id) ? @mysqli_affected_rows($this->db_connect_id) : false;
 194      }
 195   
 196      /**
 197      * Fetch current row
 198      */
 199      function sql_fetchrow($query_id = false)
 200      {
 201          global $cache;
 202   
 203          if ($query_id === false)
 204          {
 205              $query_id = $this->query_result;
 206          }
 207   
 208          if (!is_object($query_id) && isset($cache->sql_rowset[$query_id]))
 209          {
 210              return $cache->sql_fetchrow($query_id);
 211          }
 212   
 213          return ($query_id !== false) ? @mysqli_fetch_assoc($query_id) : false;
 214      }
 215   
 216      /**
 217      * Seek to given row number
 218      * rownum is zero-based
 219      */
 220      function sql_rowseek($rownum, &$query_id)
 221      {
 222          global $cache;
 223   
 224          if ($query_id === false)
 225          {
 226              $query_id = $this->query_result;
 227          }
 228   
 229          if (!is_object($query_id) && isset($cache->sql_rowset[$query_id]))
 230          {
 231              return $cache->sql_rowseek($rownum, $query_id);
 232          }
 233   
 234          return ($query_id !== false) ? @mysqli_data_seek($query_id, $rownum) : false;
 235      }
 236   
 237      /**
 238      * Get last inserted id after insert statement
 239      */
 240      function sql_nextid()
 241      {
 242          return ($this->db_connect_id) ? @mysqli_insert_id($this->db_connect_id) : false;
 243      }
 244   
 245      /**
 246      * Free sql result
 247      */
 248      function sql_freeresult($query_id = false)
 249      {
 250          global $cache;
 251   
 252          if ($query_id === false)
 253          {
 254              $query_id = $this->query_result;
 255          }
 256   
 257          if (!is_object($query_id) && isset($cache->sql_rowset[$query_id]))
 258          {
 259              return $cache->sql_freeresult($query_id);
 260          }
 261   
 262          return @mysqli_free_result($query_id);
 263      }
 264   
 265      /**
 266      * Escape string used in sql query
 267      */
 268      function sql_escape($msg)
 269      {
 270          return @mysqli_real_escape_string($this->db_connect_id, $msg);
 271      }
 272   
 273      /**
 274      * Build LIKE expression
 275      * @access private
 276      */
 277      function _sql_like_expression($expression)
 278      {
 279          return $expression;
 280      }
 281   
 282      /**
 283      * Build db-specific query data
 284      * @access private
 285      */
 286      function _sql_custom_build($stage, $data)
 287      {
 288          switch ($stage)
 289          {
 290              case 'FROM':
 291                  $data = '(' . $data . ')';
 292              break;
 293          }
 294   
 295          return $data;
 296      }
 297   
 298      /**
 299      * return sql error array
 300      * @access private
 301      */
 302      function _sql_error()
 303      {
 304          if (!$this->db_connect_id)
 305          {
 306              return array(
 307                  'message'    => @mysqli_connect_error(),
 308                  'code'        => @mysqli_connect_errno()
 309              );
 310          }
 311   
 312          return array(
 313              'message'    => @mysqli_error($this->db_connect_id),
 314              'code'        => @mysqli_errno($this->db_connect_id)
 315          );
 316      }
 317   
 318      /**
 319      * Close sql connection
 320      * @access private
 321      */
 322      function _sql_close()
 323      {
 324          return @mysqli_close($this->db_connect_id);
 325      }
 326   
 327      /**
 328      * Build db-specific report
 329      * @access private
 330      */
 331      function _sql_report($mode, $query = '')
 332      {
 333          static $test_prof;
 334   
 335          // current detection method, might just switch to see the existance of INFORMATION_SCHEMA.PROFILING
 336          if ($test_prof === null)
 337          {
 338              $test_prof = false;
 339              if (strpos(mysqli_get_server_info($this->db_connect_id), 'community') !== false)
 340              {
 341                  $ver = mysqli_get_server_version($this->db_connect_id);
 342                  if ($ver >= 50037 && $ver < 50100)
 343                  {
 344                      $test_prof = true;
 345                  }
 346              }
 347          }
 348   
 349          switch ($mode)
 350          {
 351              case 'start':
 352   
 353                  $explain_query = $query;
 354                  if (preg_match('/UPDATE ([a-z0-9_]+).*?WHERE(.*)/s', $query, $m))
 355                  {
 356                      $explain_query = 'SELECT * FROM ' . $m[1] . ' WHERE ' . $m[2];
 357                  }
 358                  else if (preg_match('/DELETE FROM ([a-z0-9_]+).*?WHERE(.*)/s', $query, $m))
 359                  {
 360                      $explain_query = 'SELECT * FROM ' . $m[1] . ' WHERE ' . $m[2];
 361                  }
 362   
 363                  if (preg_match('/^SELECT/', $explain_query))
 364                  {
 365                      $html_table = false;
 366   
 367                      // begin profiling
 368                      if ($test_prof)
 369                      {
 370                          @mysqli_query($this->db_connect_id, 'SET profiling = 1;');
 371                      }
 372   
 373                      if ($result = @mysqli_query($this->db_connect_id, "EXPLAIN $explain_query"))
 374                      {
 375                          while ($row = @mysqli_fetch_assoc($result))
 376                          {
 377                              $html_table = $this->sql_report('add_select_row', $query, $html_table, $row);
 378                          }
 379                      }
 380                      @mysqli_free_result($result);
 381   
 382                      if ($html_table)
 383                      {
 384                          $this->html_hold .= '</table>';
 385                      }
 386   
 387                      if ($test_prof)
 388                      {
 389                          $html_table = false;
 390   
 391                          // get the last profile
 392                          if ($result = @mysqli_query($this->db_connect_id, 'SHOW PROFILE ALL;'))
 393                          {
 394                              $this->html_hold .= '<br />';
 395                              while ($row = @mysqli_fetch_assoc($result))
 396                              {
 397                                  // make <unknown> HTML safe
 398                                  if (!empty($row['Source_function']))
 399                                  {
 400                                      $row['Source_function'] = str_replace(array('<', '>'), array('&lt;', '&gt;'), $row['Source_function']);
 401                                  }
 402   
 403                                  // remove unsupported features
 404                                  foreach ($row as $key => $val)
 405                                  {
 406                                      if ($val === null)
 407                                      {
 408                                          unset($row[$key]);
 409                                      }
 410                                  }
 411                                  $html_table = $this->sql_report('add_select_row', $query, $html_table, $row);
 412                              }
 413                          }
 414                          @mysqli_free_result($result);
 415   
 416                          if ($html_table)
 417                          {
 418                              $this->html_hold .= '</table>';
 419                          }
 420   
 421                          @mysqli_query($this->db_connect_id, 'SET profiling = 0;');
 422                      }
 423                  }
 424   
 425              break;
 426   
 427              case 'fromcache':
 428                  $endtime = explode(' ', microtime());
 429                  $endtime = $endtime[0] + $endtime[1];
 430   
 431                  $result = @mysqli_query($this->db_connect_id, $query);
 432                  while ($void = @mysqli_fetch_assoc($result))
 433                  {
 434                      // Take the time spent on parsing rows into account
 435                  }
 436                  @mysqli_free_result($result);
 437   
 438                  $splittime = explode(' ', microtime());
 439                  $splittime = $splittime[0] + $splittime[1];
 440   
 441                  $this->sql_report('record_fromcache', $query, $endtime, $splittime);
 442   
 443              break;
 444          }
 445      }
 446  }
 447   
 448  ?>