[ Index ]

WordPress Cross Reference

title

Body

[close]

/wp-includes/ -> wp-db.php (source)

   1  <?php
   2  /**
   3   * WordPress DB Class
   4   *
   5   * Original code from {@link http://php.justinvincent.com Justin Vincent (justin@visunet.ie)}
   6   *
   7   * @package WordPress
   8   * @subpackage Database
   9   * @since 0.71
  10   */
  11  
  12  /**
  13   * @since 0.71
  14   */
  15  define( 'EZSQL_VERSION', 'WP1.25' );
  16  
  17  /**
  18   * @since 0.71
  19   */
  20  define( 'OBJECT', 'OBJECT', true );
  21  
  22  /**
  23   * @since 2.5.0
  24   */
  25  define( 'OBJECT_K', 'OBJECT_K' );
  26  
  27  /**
  28   * @since 0.71
  29   */
  30  define( 'ARRAY_A', 'ARRAY_A' );
  31  
  32  /**
  33   * @since 0.71
  34   */
  35  define( 'ARRAY_N', 'ARRAY_N' );
  36  
  37  /**
  38   * WordPress Database Access Abstraction Object
  39   *
  40   * It is possible to replace this class with your own
  41   * by setting the $wpdb global variable in wp-content/db.php
  42   * file to your class. The wpdb class will still be included,
  43   * so you can extend it or simply use your own.
  44   *
  45   * @link http://codex.wordpress.org/Function_Reference/wpdb_Class
  46   *
  47   * @package WordPress
  48   * @subpackage Database
  49   * @since 0.71
  50   */
  51  class wpdb {
  52  
  53      /**
  54       * Whether to show SQL/DB errors
  55       *
  56       * @since 0.71
  57       * @access private
  58       * @var bool
  59       */
  60      var $show_errors = false;
  61  
  62      /**
  63       * Whether to suppress errors during the DB bootstrapping.
  64       *
  65       * @access private
  66       * @since 2.5.0
  67       * @var bool
  68       */
  69      var $suppress_errors = false;
  70  
  71      /**
  72       * The last error during query.
  73       *
  74       * @since 2.5.0
  75       * @var string
  76       */
  77      var $last_error = '';
  78  
  79      /**
  80       * Amount of queries made
  81       *
  82       * @since 1.2.0
  83       * @access private
  84       * @var int
  85       */
  86      var $num_queries = 0;
  87  
  88      /**
  89       * Count of rows returned by previous query
  90       *
  91       * @since 0.71
  92       * @access private
  93       * @var int
  94       */
  95      var $num_rows = 0;
  96  
  97      /**
  98       * Count of affected rows by previous query
  99       *
 100       * @since 0.71
 101       * @access private
 102       * @var int
 103       */
 104      var $rows_affected = 0;
 105  
 106      /**
 107       * The ID generated for an AUTO_INCREMENT column by the previous query (usually INSERT).
 108       *
 109       * @since 0.71
 110       * @access public
 111       * @var int
 112       */
 113      var $insert_id = 0;
 114  
 115      /**
 116       * Last query made
 117       *
 118       * @since 0.71
 119       * @access private
 120       * @var array
 121       */
 122      var $last_query;
 123  
 124      /**
 125       * Results of the last query made
 126       *
 127       * @since 0.71
 128       * @access private
 129       * @var array|null
 130       */
 131      var $last_result;
 132  
 133      /**
 134       * MySQL result, which is either a resource or boolean.
 135       *
 136       * @since 0.71
 137       * @access protected
 138       * @var mixed
 139       */
 140      protected $result;
 141  
 142      /**
 143       * Saved info on the table column
 144       *
 145       * @since 0.71
 146       * @access protected
 147       * @var array
 148       */
 149      protected $col_info;
 150  
 151      /**
 152       * Saved queries that were executed
 153       *
 154       * @since 1.5.0
 155       * @access private
 156       * @var array
 157       */
 158      var $queries;
 159  
 160      /**
 161       * WordPress table prefix
 162       *
 163       * You can set this to have multiple WordPress installations
 164       * in a single database. The second reason is for possible
 165       * security precautions.
 166       *
 167       * @since 2.5.0
 168       * @access private
 169       * @var string
 170       */
 171      var $prefix = '';
 172  
 173      /**
 174       * Whether the database queries are ready to start executing.
 175       *
 176       * @since 2.3.2
 177       * @access private
 178       * @var bool
 179       */
 180      var $ready = false;
 181  
 182      /**
 183       * {@internal Missing Description}}
 184       *
 185       * @since 3.0.0
 186       * @access public
 187       * @var int
 188       */
 189      var $blogid = 0;
 190  
 191      /**
 192       * {@internal Missing Description}}
 193       *
 194       * @since 3.0.0
 195       * @access public
 196       * @var int
 197       */
 198      var $siteid = 0;
 199  
 200      /**
 201       * List of WordPress per-blog tables
 202       *
 203       * @since 2.5.0
 204       * @access private
 205       * @see wpdb::tables()
 206       * @var array
 207       */
 208      var $tables = array( 'posts', 'comments', 'links', 'options', 'postmeta',
 209          'terms', 'term_taxonomy', 'term_relationships', 'commentmeta' );
 210  
 211      /**
 212       * List of deprecated WordPress tables
 213       *
 214       * categories, post2cat, and link2cat were deprecated in 2.3.0, db version 5539
 215       *
 216       * @since 2.9.0
 217       * @access private
 218       * @see wpdb::tables()
 219       * @var array
 220       */
 221      var $old_tables = array( 'categories', 'post2cat', 'link2cat' );
 222  
 223      /**
 224       * List of WordPress global tables
 225       *
 226       * @since 3.0.0
 227       * @access private
 228       * @see wpdb::tables()
 229       * @var array
 230       */
 231      var $global_tables = array( 'users', 'usermeta' );
 232  
 233      /**
 234       * List of Multisite global tables
 235       *
 236       * @since 3.0.0
 237       * @access private
 238       * @see wpdb::tables()
 239       * @var array
 240       */
 241      var $ms_global_tables = array( 'blogs', 'signups', 'site', 'sitemeta',
 242          'sitecategories', 'registration_log', 'blog_versions' );
 243  
 244      /**
 245       * WordPress Comments table
 246       *
 247       * @since 1.5.0
 248       * @access public
 249       * @var string
 250       */
 251      var $comments;
 252  
 253      /**
 254       * WordPress Comment Metadata table
 255       *
 256       * @since 2.9.0
 257       * @access public
 258       * @var string
 259       */
 260      var $commentmeta;
 261  
 262      /**
 263       * WordPress Links table
 264       *
 265       * @since 1.5.0
 266       * @access public
 267       * @var string
 268       */
 269      var $links;
 270  
 271      /**
 272       * WordPress Options table
 273       *
 274       * @since 1.5.0
 275       * @access public
 276       * @var string
 277       */
 278      var $options;
 279  
 280      /**
 281       * WordPress Post Metadata table
 282       *
 283       * @since 1.5.0
 284       * @access public
 285       * @var string
 286       */
 287      var $postmeta;
 288  
 289      /**
 290       * WordPress Posts table
 291       *
 292       * @since 1.5.0
 293       * @access public
 294       * @var string
 295       */
 296      var $posts;
 297  
 298      /**
 299       * WordPress Terms table
 300       *
 301       * @since 2.3.0
 302       * @access public
 303       * @var string
 304       */
 305      var $terms;
 306  
 307      /**
 308       * WordPress Term Relationships table
 309       *
 310       * @since 2.3.0
 311       * @access public
 312       * @var string
 313       */
 314      var $term_relationships;
 315  
 316      /**
 317       * WordPress Term Taxonomy table
 318       *
 319       * @since 2.3.0
 320       * @access public
 321       * @var string
 322       */
 323      var $term_taxonomy;
 324  
 325      /*
 326       * Global and Multisite tables
 327       */
 328  
 329      /**
 330       * WordPress User Metadata table
 331       *
 332       * @since 2.3.0
 333       * @access public
 334       * @var string
 335       */
 336      var $usermeta;
 337  
 338      /**
 339       * WordPress Users table
 340       *
 341       * @since 1.5.0
 342       * @access public
 343       * @var string
 344       */
 345      var $users;
 346  
 347      /**
 348       * Multisite Blogs table
 349       *
 350       * @since 3.0.0
 351       * @access public
 352       * @var string
 353       */
 354      var $blogs;
 355  
 356      /**
 357       * Multisite Blog Versions table
 358       *
 359       * @since 3.0.0
 360       * @access public
 361       * @var string
 362       */
 363      var $blog_versions;
 364  
 365      /**
 366       * Multisite Registration Log table
 367       *
 368       * @since 3.0.0
 369       * @access public
 370       * @var string
 371       */
 372      var $registration_log;
 373  
 374      /**
 375       * Multisite Signups table
 376       *
 377       * @since 3.0.0
 378       * @access public
 379       * @var string
 380       */
 381      var $signups;
 382  
 383      /**
 384       * Multisite Sites table
 385       *
 386       * @since 3.0.0
 387       * @access public
 388       * @var string
 389       */
 390      var $site;
 391  
 392      /**
 393       * Multisite Sitewide Terms table
 394       *
 395       * @since 3.0.0
 396       * @access public
 397       * @var string
 398       */
 399      var $sitecategories;
 400  
 401      /**
 402       * Multisite Site Metadata table
 403       *
 404       * @since 3.0.0
 405       * @access public
 406       * @var string
 407       */
 408      var $sitemeta;
 409  
 410      /**
 411       * Format specifiers for DB columns. Columns not listed here default to %s. Initialized during WP load.
 412       *
 413       * Keys are column names, values are format types: 'ID' => '%d'
 414       *
 415       * @since 2.8.0
 416       * @see wpdb::prepare()
 417       * @see wpdb::insert()
 418       * @see wpdb::update()
 419       * @see wpdb::delete()
 420       * @see wp_set_wpdb_vars()
 421       * @access public
 422       * @var array
 423       */
 424      var $field_types = array();
 425  
 426      /**
 427       * Database table columns charset
 428       *
 429       * @since 2.2.0
 430       * @access public
 431       * @var string
 432       */
 433      var $charset;
 434  
 435      /**
 436       * Database table columns collate
 437       *
 438       * @since 2.2.0
 439       * @access public
 440       * @var string
 441       */
 442      var $collate;
 443  
 444      /**
 445       * Database Username
 446       *
 447       * @since 2.9.0
 448       * @access protected
 449       * @var string
 450       */
 451      protected $dbuser;
 452  
 453      /**
 454       * Database Password
 455       *
 456       * @since 3.1.0
 457       * @access protected
 458       * @var string
 459       */
 460      protected $dbpassword;
 461  
 462      /**
 463       * Database Name
 464       *
 465       * @since 3.1.0
 466       * @access protected
 467       * @var string
 468       */
 469      protected $dbname;
 470  
 471      /**
 472       * Database Host
 473       *
 474       * @since 3.1.0
 475       * @access protected
 476       * @var string
 477       */
 478      protected $dbhost;
 479  
 480      /**
 481       * Database Handle
 482       *
 483       * @since 0.71
 484       * @access protected
 485       * @var string
 486       */
 487      protected $dbh;
 488  
 489      /**
 490       * A textual description of the last query/get_row/get_var call
 491       *
 492       * @since 3.0.0
 493       * @access public
 494       * @var string
 495       */
 496      var $func_call;
 497  
 498      /**
 499       * Whether MySQL is used as the database engine.
 500       *
 501       * Set in WPDB::db_connect() to true, by default. This is used when checking
 502       * against the required MySQL version for WordPress. Normally, a replacement
 503       * database drop-in (db.php) will skip these checks, but setting this to true
 504       * will force the checks to occur.
 505       *
 506       * @since 3.3.0
 507       * @access public
 508       * @var bool
 509       */
 510      public $is_mysql = null;
 511  
 512      /**
 513       * Connects to the database server and selects a database
 514       *
 515       * PHP5 style constructor for compatibility with PHP5. Does
 516       * the actual setting up of the class properties and connection
 517       * to the database.
 518       *
 519       * @link http://core.trac.wordpress.org/ticket/3354
 520       * @since 2.0.8
 521       *
 522       * @param string $dbuser MySQL database user
 523       * @param string $dbpassword MySQL database password
 524       * @param string $dbname MySQL database name
 525       * @param string $dbhost MySQL database host
 526       */
 527  	function __construct( $dbuser, $dbpassword, $dbname, $dbhost ) {
 528          register_shutdown_function( array( $this, '__destruct' ) );
 529  
 530          if ( WP_DEBUG && WP_DEBUG_DISPLAY )
 531              $this->show_errors();
 532  
 533          $this->init_charset();
 534  
 535          $this->dbuser = $dbuser;
 536          $this->dbpassword = $dbpassword;
 537          $this->dbname = $dbname;
 538          $this->dbhost = $dbhost;
 539  
 540          $this->db_connect();
 541      }
 542  
 543      /**
 544       * PHP5 style destructor and will run when database object is destroyed.
 545       *
 546       * @see wpdb::__construct()
 547       * @since 2.0.8
 548       * @return bool true
 549       */
 550  	function __destruct() {
 551          return true;
 552      }
 553  
 554      /**
 555       * PHP5 style magic getter, used to lazy-load expensive data.
 556       *
 557       * @since 3.5.0
 558       *
 559       * @param string $name The private member to get, and optionally process
 560       * @return mixed The private member
 561       */
 562  	function __get( $name ) {
 563          if ( 'col_info' == $name )
 564              $this->load_col_info();
 565  
 566          return $this->$name;
 567      }
 568  
 569      /**
 570       * Magic function, for backwards compatibility
 571       *
 572       * @since 3.5.0
 573       *
 574       * @param string $name  The private member to set
 575       * @param mixed  $value The value to set
 576       */
 577  	function __set( $name, $value ) {
 578          $this->$name = $value;
 579      }
 580  
 581      /**
 582       * Magic function, for backwards compatibility
 583       *
 584       * @since 3.5.0
 585       *
 586       * @param string $name  The private member to check
 587       *
 588       * @return bool If the member is set or not
 589       */
 590  	function __isset( $name ) {
 591          return isset( $this->$name );
 592      }
 593  
 594      /**
 595       * Magic function, for backwards compatibility
 596       *
 597       * @since 3.5.0
 598       *
 599       * @param string $name  The private member to unset
 600       */
 601  	function __unset( $name ) {
 602          unset( $this->$name );
 603      }
 604  
 605      /**
 606       * Set $this->charset and $this->collate
 607       *
 608       * @since 3.1.0
 609       */
 610  	function init_charset() {
 611          if ( function_exists('is_multisite') && is_multisite() ) {
 612              $this->charset = 'utf8';
 613              if ( defined( 'DB_COLLATE' ) && DB_COLLATE )
 614                  $this->collate = DB_COLLATE;
 615              else
 616                  $this->collate = 'utf8_general_ci';
 617          } elseif ( defined( 'DB_COLLATE' ) ) {
 618              $this->collate = DB_COLLATE;
 619          }
 620  
 621          if ( defined( 'DB_CHARSET' ) )
 622              $this->charset = DB_CHARSET;
 623      }
 624  
 625      /**
 626       * Sets the connection's character set.
 627       *
 628       * @since 3.1.0
 629       *
 630       * @param resource $dbh     The resource given by mysql_connect
 631       * @param string   $charset The character set (optional)
 632       * @param string   $collate The collation (optional)
 633       */
 634  	function set_charset( $dbh, $charset = null, $collate = null ) {
 635          if ( ! isset( $charset ) )
 636              $charset = $this->charset;
 637          if ( ! isset( $collate ) )
 638              $collate = $this->collate;
 639          if ( $this->has_cap( 'collation' ) && ! empty( $charset ) ) {
 640              if ( function_exists( 'mysql_set_charset' ) && $this->has_cap( 'set_charset' ) ) {
 641                  mysql_set_charset( $charset, $dbh );
 642              } else {
 643                  $query = $this->prepare( 'SET NAMES %s', $charset );
 644                  if ( ! empty( $collate ) )
 645                      $query .= $this->prepare( ' COLLATE %s', $collate );
 646                  mysql_query( $query, $dbh );
 647              }
 648          }
 649      }
 650  
 651      /**
 652       * Sets the table prefix for the WordPress tables.
 653       *
 654       * @since 2.5.0
 655       *
 656       * @param string $prefix Alphanumeric name for the new prefix.
 657       * @param bool $set_table_names Optional. Whether the table names, e.g. wpdb::$posts, should be updated or not.
 658       * @return string|WP_Error Old prefix or WP_Error on error
 659       */
 660  	function set_prefix( $prefix, $set_table_names = true ) {
 661  
 662          if ( preg_match( '|[^a-z0-9_]|i', $prefix ) )
 663              return new WP_Error('invalid_db_prefix', 'Invalid database prefix' );
 664  
 665          $old_prefix = is_multisite() ? '' : $prefix;
 666  
 667          if ( isset( $this->base_prefix ) )
 668              $old_prefix = $this->base_prefix;
 669  
 670          $this->base_prefix = $prefix;
 671  
 672          if ( $set_table_names ) {
 673              foreach ( $this->tables( 'global' ) as $table => $prefixed_table )
 674                  $this->$table = $prefixed_table;
 675  
 676              if ( is_multisite() && empty( $this->blogid ) )
 677                  return $old_prefix;
 678  
 679              $this->prefix = $this->get_blog_prefix();
 680  
 681              foreach ( $this->tables( 'blog' ) as $table => $prefixed_table )
 682                  $this->$table = $prefixed_table;
 683  
 684              foreach ( $this->tables( 'old' ) as $table => $prefixed_table )
 685                  $this->$table = $prefixed_table;
 686          }
 687          return $old_prefix;
 688      }
 689  
 690      /**
 691       * Sets blog id.
 692       *
 693       * @since 3.0.0
 694       * @access public
 695       * @param int $blog_id
 696       * @param int $site_id Optional.
 697       * @return string previous blog id
 698       */
 699  	function set_blog_id( $blog_id, $site_id = 0 ) {
 700          if ( ! empty( $site_id ) )
 701              $this->siteid = $site_id;
 702  
 703          $old_blog_id  = $this->blogid;
 704          $this->blogid = $blog_id;
 705  
 706          $this->prefix = $this->get_blog_prefix();
 707  
 708          foreach ( $this->tables( 'blog' ) as $table => $prefixed_table )
 709              $this->$table = $prefixed_table;
 710  
 711          foreach ( $this->tables( 'old' ) as $table => $prefixed_table )
 712              $this->$table = $prefixed_table;
 713  
 714          return $old_blog_id;
 715      }
 716  
 717      /**
 718       * Gets blog prefix.
 719       *
 720       * @uses is_multisite()
 721       * @since 3.0.0
 722       * @param int $blog_id Optional.
 723       * @return string Blog prefix.
 724       */
 725  	function get_blog_prefix( $blog_id = null ) {
 726          if ( is_multisite() ) {
 727              if ( null === $blog_id )
 728                  $blog_id = $this->blogid;
 729              $blog_id = (int) $blog_id;
 730              if ( defined( 'MULTISITE' ) && ( 0 == $blog_id || 1 == $blog_id ) )
 731                  return $this->base_prefix;
 732              else
 733                  return $this->base_prefix . $blog_id . '_';
 734          } else {
 735              return $this->base_prefix;
 736          }
 737      }
 738  
 739      /**
 740       * Returns an array of WordPress tables.
 741       *
 742       * Also allows for the CUSTOM_USER_TABLE and CUSTOM_USER_META_TABLE to
 743       * override the WordPress users and usermeta tables that would otherwise
 744       * be determined by the prefix.
 745       *
 746       * The scope argument can take one of the following:
 747       *
 748       * 'all' - returns 'all' and 'global' tables. No old tables are returned.
 749       * 'blog' - returns the blog-level tables for the queried blog.
 750       * 'global' - returns the global tables for the installation, returning multisite tables only if running multisite.
 751       * 'ms_global' - returns the multisite global tables, regardless if current installation is multisite.
 752       * 'old' - returns tables which are deprecated.
 753       *
 754       * @since 3.0.0
 755       * @uses wpdb::$tables
 756       * @uses wpdb::$old_tables
 757       * @uses wpdb::$global_tables
 758       * @uses wpdb::$ms_global_tables
 759       * @uses is_multisite()
 760       *
 761       * @param string $scope Optional. Can be all, global, ms_global, blog, or old tables. Defaults to all.
 762       * @param bool $prefix Optional. Whether to include table prefixes. Default true. If blog
 763       *     prefix is requested, then the custom users and usermeta tables will be mapped.
 764       * @param int $blog_id Optional. The blog_id to prefix. Defaults to wpdb::$blogid. Used only when prefix is requested.
 765       * @return array Table names. When a prefix is requested, the key is the unprefixed table name.
 766       */
 767  	function tables( $scope = 'all', $prefix = true, $blog_id = 0 ) {
 768          switch ( $scope ) {
 769              case 'all' :
 770                  $tables = array_merge( $this->global_tables, $this->tables );
 771                  if ( is_multisite() )
 772                      $tables = array_merge( $tables, $this->ms_global_tables );
 773                  break;
 774              case 'blog' :
 775                  $tables = $this->tables;
 776                  break;
 777              case 'global' :
 778                  $tables = $this->global_tables;
 779                  if ( is_multisite() )
 780                      $tables = array_merge( $tables, $this->ms_global_tables );
 781                  break;
 782              case 'ms_global' :
 783                  $tables = $this->ms_global_tables;
 784                  break;
 785              case 'old' :
 786                  $tables = $this->old_tables;
 787                  break;
 788              default :
 789                  return array();
 790                  break;
 791          }
 792  
 793          if ( $prefix ) {
 794              if ( ! $blog_id )
 795                  $blog_id = $this->blogid;
 796              $blog_prefix = $this->get_blog_prefix( $blog_id );
 797              $base_prefix = $this->base_prefix;
 798              $global_tables = array_merge( $this->global_tables, $this->ms_global_tables );
 799              foreach ( $tables as $k => $table ) {
 800                  if ( in_array( $table, $global_tables ) )
 801                      $tables[ $table ] = $base_prefix . $table;
 802                  else
 803                      $tables[ $table ] = $blog_prefix . $table;
 804                  unset( $tables[ $k ] );
 805              }
 806  
 807              if ( isset( $tables['users'] ) && defined( 'CUSTOM_USER_TABLE' ) )
 808                  $tables['users'] = CUSTOM_USER_TABLE;
 809  
 810              if ( isset( $tables['usermeta'] ) && defined( 'CUSTOM_USER_META_TABLE' ) )
 811                  $tables['usermeta'] = CUSTOM_USER_META_TABLE;
 812          }
 813  
 814          return $tables;
 815      }
 816  
 817      /**
 818       * Selects a database using the current database connection.
 819       *
 820       * The database name will be changed based on the current database
 821       * connection. On failure, the execution will bail and display an DB error.
 822       *
 823       * @since 0.71
 824       *
 825       * @param string $db MySQL database name
 826       * @param resource $dbh Optional link identifier.
 827       * @return null Always null.
 828       */
 829  	function select( $db, $dbh = null ) {
 830          if ( is_null($dbh) )
 831              $dbh = $this->dbh;
 832  
 833          if ( !@mysql_select_db( $db, $dbh ) ) {
 834              $this->ready = false;
 835              wp_load_translations_early();
 836              $this->bail( sprintf( __( '<h1>Can&#8217;t select database</h1>
 837  <p>We were able to connect to the database server (which means your username and password is okay) but not able to select the <code>%1$s</code> database.</p>
 838  <ul>
 839  <li>Are you sure it exists?</li>
 840  <li>Does the user <code>%2$s</code> have permission to use the <code>%1$s</code> database?</li>
 841  <li>On some systems the name of your database is prefixed with your username, so it would be like <code>username_%1$s</code>. Could that be the problem?</li>
 842  </ul>
 843  <p>If you don\'t know how to set up a database you should <strong>contact your host</strong>. If all else fails you may find help at the <a href="http://wordpress.org/support/">WordPress Support Forums</a>.</p>' ), htmlspecialchars( $db, ENT_QUOTES ), htmlspecialchars( $this->dbuser, ENT_QUOTES ) ), 'db_select_fail' );
 844              return;
 845          }
 846      }
 847  
 848      /**
 849       * Do not use, deprecated.
 850       *
 851       * Use esc_sql() or wpdb::prepare() instead.
 852       *
 853       * @since 2.8.0
 854       * @deprecated 3.6.0
 855       * @see wpdb::prepare
 856       * @see esc_sql()
 857       * @access private
 858       *
 859       * @param string $string
 860       * @return string
 861       */
 862  	function _weak_escape( $string ) {
 863          if ( func_num_args() === 1 && function_exists( '_deprecated_function' ) )
 864              _deprecated_function( __METHOD__, '3.6', 'wpdb::prepare() or esc_sql()' );
 865          return addslashes( $string );
 866      }
 867  
 868      /**
 869       * Real escape, using mysql_real_escape_string()
 870       *
 871       * @see mysql_real_escape_string()
 872       * @since 2.8.0
 873       * @access private
 874       *
 875       * @param  string $string to escape
 876       * @return string escaped
 877       */
 878  	function _real_escape( $string ) {
 879          if ( $this->dbh )
 880              return mysql_real_escape_string( $string, $this->dbh );
 881  
 882          $class = get_class( $this );
 883          _doing_it_wrong( $class, "$class must set a database connection for use with escaping.", E_USER_NOTICE );
 884          return addslashes( $string );
 885      }
 886  
 887      /**
 888       * Escape data. Works on arrays.
 889       *
 890       * @uses wpdb::_real_escape()
 891       * @since  2.8.0
 892       * @access private
 893       *
 894       * @param  string|array $data
 895       * @return string|array escaped
 896       */
 897  	function _escape( $data ) {
 898          if ( is_array( $data ) ) {
 899              foreach ( $data as $k => $v ) {
 900                  if ( is_array($v) )
 901                      $data[$k] = $this->_escape( $v );
 902                  else
 903                      $data[$k] = $this->_real_escape( $v );
 904              }
 905          } else {
 906              $data = $this->_real_escape( $data );
 907          }
 908  
 909          return $data;
 910      }
 911  
 912      /**
 913       * Do not use, deprecated.
 914       *
 915       * Use esc_sql() or wpdb::prepare() instead.
 916       *
 917       * @since 0.71
 918       * @deprecated 3.6.0
 919       * @see wpdb::prepare()
 920       * @see esc_sql()
 921       *
 922       * @param mixed $data
 923       * @return mixed
 924       */
 925  	function escape( $data ) {
 926          if ( func_num_args() === 1 && function_exists( '_deprecated_function' ) )
 927              _deprecated_function( __METHOD__, '3.6', 'wpdb::prepare() or esc_sql()' );
 928          if ( is_array( $data ) ) {
 929              foreach ( $data as $k => $v ) {
 930                  if ( is_array( $v ) )
 931                      $data[$k] = $this->escape( $v, 'recursive' );
 932                  else
 933                      $data[$k] = $this->_weak_escape( $v, 'internal' );
 934              }
 935          } else {
 936              $data = $this->_weak_escape( $data, 'internal' );
 937          }
 938  
 939          return $data;
 940      }
 941  
 942      /**
 943       * Escapes content by reference for insertion into the database, for security
 944       *
 945       * @uses wpdb::_real_escape()
 946       * @since 2.3.0
 947       * @param string $string to escape
 948       * @return void
 949       */
 950  	function escape_by_ref( &$string ) {
 951          if ( ! is_float( $string ) )
 952              $string = $this->_real_escape( $string );
 953      }
 954  
 955      /**
 956       * Prepares a SQL query for safe execution. Uses sprintf()-like syntax.
 957       *
 958       * The following directives can be used in the query format string:
 959       *   %d (integer)
 960       *   %f (float)
 961       *   %s (string)
 962       *   %% (literal percentage sign - no argument needed)
 963       *
 964       * All of %d, %f, and %s are to be left unquoted in the query string and they need an argument passed for them.
 965       * Literals (%) as parts of the query must be properly written as %%.
 966       *
 967       * This function only supports a small subset of the sprintf syntax; it only supports %d (integer), %f (float), and %s (string).
 968       * Does not support sign, padding, alignment, width or precision specifiers.
 969       * Does not support argument numbering/swapping.
 970       *
 971       * May be called like {@link http://php.net/sprintf sprintf()} or like {@link http://php.net/vsprintf vsprintf()}.
 972       *
 973       * Both %d and %s should be left unquoted in the query string.
 974       *
 975       * <code>
 976       * wpdb::prepare( "SELECT * FROM `table` WHERE `column` = %s AND `field` = %d", 'foo', 1337 )
 977       * wpdb::prepare( "SELECT DATE_FORMAT(`field`, '%%c') FROM `table` WHERE `column` = %s", 'foo' );
 978       * </code>
 979       *
 980       * @link http://php.net/sprintf Description of syntax.
 981       * @since 2.3.0
 982       *
 983       * @param string $query Query statement with sprintf()-like placeholders
 984       * @param array|mixed $args The array of variables to substitute into the query's placeholders if being called like
 985       *     {@link http://php.net/vsprintf vsprintf()}, or the first variable to substitute into the query's placeholders if
 986       *     being called like {@link http://php.net/sprintf sprintf()}.
 987       * @param mixed $args,... further variables to substitute into the query's placeholders if being called like
 988       *     {@link http://php.net/sprintf sprintf()}.
 989       * @return null|false|string Sanitized query string, null if there is no query, false if there is an error and string
 990       *     if there was something to prepare
 991       */
 992  	function prepare( $query, $args ) {
 993          if ( is_null( $query ) )
 994              return;
 995  
 996          $args = func_get_args();
 997          array_shift( $args );
 998          // If args were passed as an array (as in vsprintf), move them up
 999          if ( isset( $args[0] ) && is_array($args[0]) )
1000              $args = $args[0];
1001          $query = str_replace( "'%s'", '%s', $query ); // in case someone mistakenly already singlequoted it
1002          $query = str_replace( '"%s"', '%s', $query ); // doublequote unquoting
1003          $query = preg_replace( '|(?<!%)%f|' , '%F', $query ); // Force floats to be locale unaware
1004          $query = preg_replace( '|(?<!%)%s|', "'%s'", $query ); // quote the strings, avoiding escaped strings like %%s
1005          array_walk( $args, array( $this, 'escape_by_ref' ) );
1006          return @vsprintf( $query, $args );
1007      }
1008  
1009      /**
1010       * Print SQL/DB error.
1011       *
1012       * @since 0.71
1013       * @global array $EZSQL_ERROR Stores error information of query and error string
1014       *
1015       * @param string $str The error to display
1016       * @return bool False if the showing of errors is disabled.
1017       */
1018  	function print_error( $str = '' ) {
1019          global $EZSQL_ERROR;
1020  
1021          if ( !$str )
1022              $str = mysql_error( $this->dbh );
1023          $EZSQL_ERROR[] = array( 'query' => $this->last_query, 'error_str' => $str );
1024  
1025          if ( $this->suppress_errors )
1026              return false;
1027  
1028          wp_load_translations_early();
1029  
1030          if ( $caller = $this->get_caller() )
1031              $error_str = sprintf( __( 'WordPress database error %1$s for query %2$s made by %3$s' ), $str, $this->last_query, $caller );
1032          else
1033              $error_str = sprintf( __( 'WordPress database error %1$s for query %2$s' ), $str, $this->last_query );
1034  
1035          error_log( $error_str );
1036  
1037          // Are we showing errors?
1038          if ( ! $this->show_errors )
1039              return false;
1040  
1041          // If there is an error then take note of it
1042          if ( is_multisite() ) {
1043              $msg = "WordPress database error: [$str]\n{$this->last_query}\n";
1044              if ( defined( 'ERRORLOGFILE' ) )
1045                  error_log( $msg, 3, ERRORLOGFILE );
1046              if ( defined( 'DIEONDBERROR' ) )
1047                  wp_die( $msg );
1048          } else {
1049              $str   = htmlspecialchars( $str, ENT_QUOTES );
1050              $query = htmlspecialchars( $this->last_query, ENT_QUOTES );
1051  
1052              print "<div id='error'>
1053              <p class='wpdberror'><strong>WordPress database error:</strong> [$str]<br />
1054              <code>$query</code></p>
1055              </div>";
1056          }
1057      }
1058  
1059      /**
1060       * Enables showing of database errors.
1061       *
1062       * This function should be used only to enable showing of errors.
1063       * wpdb::hide_errors() should be used instead for hiding of errors. However,
1064       * this function can be used to enable and disable showing of database
1065       * errors.
1066       *
1067       * @since 0.71
1068       * @see wpdb::hide_errors()
1069       *
1070       * @param bool $show Whether to show or hide errors
1071       * @return bool Old value for showing errors.
1072       */
1073  	function show_errors( $show = true ) {
1074          $errors = $this->show_errors;
1075          $this->show_errors = $show;
1076          return $errors;
1077      }
1078  
1079      /**
1080       * Disables showing of database errors.
1081       *
1082       * By default database errors are not shown.
1083       *
1084       * @since 0.71
1085       * @see wpdb::show_errors()
1086       *
1087       * @return bool Whether showing of errors was active
1088       */
1089  	function hide_errors() {
1090          $show = $this->show_errors;
1091          $this->show_errors = false;
1092          return $show;
1093      }
1094  
1095      /**
1096       * Whether to suppress database errors.
1097       *
1098       * By default database errors are suppressed, with a simple
1099       * call to this function they can be enabled.
1100       *
1101       * @since 2.5.0
1102       * @see wpdb::hide_errors()
1103       * @param bool $suppress Optional. New value. Defaults to true.
1104       * @return bool Old value
1105       */
1106  	function suppress_errors( $suppress = true ) {
1107          $errors = $this->suppress_errors;
1108          $this->suppress_errors = (bool) $suppress;
1109          return $errors;
1110      }
1111  
1112      /**
1113       * Kill cached query results.
1114       *
1115       * @since 0.71
1116       * @return void
1117       */
1118  	function flush() {
1119          $this->last_result = array();
1120          $this->col_info    = null;
1121          $this->last_query  = null;
1122          $this->rows_affected = $this->num_rows = 0;
1123          $this->last_error  = '';
1124  
1125          if ( is_resource( $this->result ) )
1126              mysql_free_result( $this->result );
1127      }
1128  
1129      /**
1130       * Connect to and select database
1131       *
1132       * @since 3.0.0
1133       */
1134  	function db_connect() {
1135  
1136          $this->is_mysql = true;
1137  
1138          $new_link = defined( 'MYSQL_NEW_LINK' ) ? MYSQL_NEW_LINK : true;
1139          $client_flags = defined( 'MYSQL_CLIENT_FLAGS' ) ? MYSQL_CLIENT_FLAGS : 0;
1140  
1141          if ( WP_DEBUG ) {
1142              $error_reporting = false;
1143              if ( defined( 'E_DEPRECATED' ) ) {
1144                  $error_reporting = error_reporting();
1145                  error_reporting( $error_reporting ^ E_DEPRECATED );
1146              }
1147              $this->dbh = mysql_connect( $this->dbhost, $this->dbuser, $this->dbpassword, $new_link, $client_flags );
1148              if ( false !== $error_reporting ) {
1149                  error_reporting( $error_reporting );
1150              }
1151          } else {
1152              $this->dbh = @mysql_connect( $this->dbhost, $this->dbuser, $this->dbpassword, $new_link, $client_flags );
1153          }
1154  
1155          if ( !$this->dbh ) {
1156              wp_load_translations_early();
1157              $this->bail( sprintf( __( "
1158  <h1>Error establishing a database connection</h1>
1159  <p>This either means that the username and password information in your <code>wp-config.php</code> file is incorrect or we can't contact the database server at <code>%s</code>. This could mean your host's database server is down.</p>
1160  <ul>
1161      <li>Are you sure you have the correct username and password?</li>
1162      <li>Are you sure that you have typed the correct hostname?</li>
1163      <li>Are you sure that the database server is running?</li>
1164  </ul>
1165  <p>If you're unsure what these terms mean you should probably contact your host. If you still need help you can always visit the <a href='http://wordpress.org/support/'>WordPress Support Forums</a>.</p>
1166  " ), htmlspecialchars( $this->dbhost, ENT_QUOTES ) ), 'db_connect_fail' );
1167  
1168              return;
1169          }
1170  
1171          $this->set_charset( $this->dbh );
1172  
1173          $this->ready = true;
1174  
1175          $this->select( $this->dbname, $this->dbh );
1176      }
1177  
1178      /**
1179       * Perform a MySQL database query, using current database connection.
1180       *
1181       * More information can be found on the codex page.
1182       *
1183       * @since 0.71
1184       *
1185       * @param string $query Database query
1186       * @return int|false Number of rows affected/selected or false on error
1187       */
1188  	function query( $query ) {
1189          if ( ! $this->ready )
1190              return false;
1191          /**
1192           * Filter the database query.
1193           *
1194           * Some queries are made before the plugins have been loaded, and thus cannot be filtered with this method.
1195           *
1196           * @since 2.1.0
1197           * @param string $query Database query.
1198           */
1199          $query = apply_filters( 'query', $query );
1200  
1201          $return_val = 0;
1202          $this->flush();
1203  
1204          // Log how the function was called
1205          $this->func_call = "\$db->query(\"$query\")";
1206  
1207          // Keep track of the last query for debug..
1208          $this->last_query = $query;
1209  
1210          if ( defined( 'SAVEQUERIES' ) && SAVEQUERIES )
1211              $this->timer_start();
1212  
1213          $this->result = @mysql_query( $query, $this->dbh );
1214          $this->num_queries++;
1215  
1216          if ( defined( 'SAVEQUERIES' ) && SAVEQUERIES )
1217              $this->queries[] = array( $query, $this->timer_stop(), $this->get_caller() );
1218  
1219          // If there is an error then take note of it..
1220          if ( $this->last_error = mysql_error( $this->dbh ) ) {
1221              // Clear insert_id on a subsequent failed insert.
1222              if ( $this->insert_id && preg_match( '/^\s*(insert|replace)\s/i', $query ) )
1223                  $this->insert_id = 0;
1224  
1225              $this->print_error();
1226              return false;
1227          }
1228  
1229          if ( preg_match( '/^\s*(create|alter|truncate|drop)\s/i', $query ) ) {
1230              $return_val = $this->result;
1231          } elseif ( preg_match( '/^\s*(insert|delete|update|replace)\s/i', $query ) ) {
1232              $this->rows_affected = mysql_affected_rows( $this->dbh );
1233              // Take note of the insert_id
1234              if ( preg_match( '/^\s*(insert|replace)\s/i', $query ) ) {
1235                  $this->insert_id = mysql_insert_id($this->dbh);
1236              }
1237              // Return number of rows affected
1238              $return_val = $this->rows_affected;
1239          } else {
1240              $num_rows = 0;
1241              while ( $row = @mysql_fetch_object( $this->result ) ) {
1242                  $this->last_result[$num_rows] = $row;
1243                  $num_rows++;
1244              }
1245  
1246              // Log number of rows the query returned
1247              // and return number of rows selected
1248              $this->num_rows = $num_rows;
1249              $return_val     = $num_rows;
1250          }
1251  
1252          return $return_val;
1253      }
1254  
1255      /**
1256       * Insert a row into a table.
1257       *
1258       * <code>
1259       * wpdb::insert( 'table', array( 'column' => 'foo', 'field' => 'bar' ) )
1260       * wpdb::insert( 'table', array( 'column' => 'foo', 'field' => 1337 ), array( '%s', '%d' ) )
1261       * </code>
1262       *
1263       * @since 2.5.0
1264       * @see wpdb::prepare()
1265       * @see wpdb::$field_types
1266       * @see wp_set_wpdb_vars()
1267       *
1268       * @param string $table table name
1269       * @param array $data Data to insert (in column => value pairs). Both $data columns and $data values should be "raw" (neither should be SQL escaped).
1270       * @param array|string $format Optional. An array of formats to be mapped to each of the value in $data. If string, that format will be used for all of the values in $data.
1271       *     A format is one of '%d', '%f', '%s' (integer, float, string). If omitted, all values in $data will be treated as strings unless otherwise specified in wpdb::$field_types.
1272       * @return int|false The number of rows inserted, or false on error.
1273       */
1274  	function insert( $table, $data, $format = null ) {
1275          return $this->_insert_replace_helper( $table, $data, $format, 'INSERT' );
1276      }
1277  
1278      /**
1279       * Replace a row into a table.
1280       *
1281       * <code>
1282       * wpdb::replace( 'table', array( 'column' => 'foo', 'field' => 'bar' ) )
1283       * wpdb::replace( 'table', array( 'column' => 'foo', 'field' => 1337 ), array( '%s', '%d' ) )
1284       * </code>
1285       *
1286       * @since 3.0.0
1287       * @see wpdb::prepare()
1288       * @see wpdb::$field_types
1289       * @see wp_set_wpdb_vars()
1290       *
1291       * @param string $table table name
1292       * @param array $data Data to insert (in column => value pairs). Both $data columns and $data values should be "raw" (neither should be SQL escaped).
1293       * @param array|string $format Optional. An array of formats to be mapped to each of the value in $data. If string, that format will be used for all of the values in $data.
1294       *     A format is one of '%d', '%f', '%s' (integer, float, string). If omitted, all values in $data will be treated as strings unless otherwise specified in wpdb::$field_types.
1295       * @return int|false The number of rows affected, or false on error.
1296       */
1297  	function replace( $table, $data, $format = null ) {
1298          return $this->_insert_replace_helper( $table, $data, $format, 'REPLACE' );
1299      }
1300  
1301      /**
1302       * Helper function for insert and replace.
1303       *
1304       * Runs an insert or replace query based on $type argument.
1305       *
1306       * @access private
1307       * @since 3.0.0
1308       * @see wpdb::prepare()
1309       * @see wpdb::$field_types
1310       * @see wp_set_wpdb_vars()
1311       *
1312       * @param string $table table name
1313       * @param array $data Data to insert (in column => value pairs). Both $data columns and $data values should be "raw" (neither should be SQL escaped).
1314       * @param array|string $format Optional. An array of formats to be mapped to each of the value in $data. If string, that format will be used for all of the values in $data.
1315       *     A format is one of '%d', '%f', '%s' (integer, float, string). If omitted, all values in $data will be treated as strings unless otherwise specified in wpdb::$field_types.
1316       * @param string $type Optional. What type of operation is this? INSERT or REPLACE. Defaults to INSERT.
1317       * @return int|false The number of rows affected, or false on error.
1318       */
1319  	function _insert_replace_helper( $table, $data, $format = null, $type = 'INSERT' ) {
1320          if ( ! in_array( strtoupper( $type ), array( 'REPLACE', 'INSERT' ) ) )
1321              return false;
1322          $this->insert_id = 0;
1323          $formats = $format = (array) $format;
1324          $fields = array_keys( $data );
1325          $formatted_fields = array();
1326          foreach ( $fields as $field ) {
1327              if ( !empty( $format ) )
1328                  $form = ( $form = array_shift( $formats ) ) ? $form : $format[0];
1329              elseif ( isset( $this->field_types[$field] ) )
1330                  $form = $this->field_types[$field];
1331              else
1332                  $form = '%s';
1333              $formatted_fields[] = $form;
1334          }
1335          $sql = "{$type} INTO `$table` (`" . implode( '`,`', $fields ) . "`) VALUES (" . implode( ",", $formatted_fields ) . ")";
1336          return $this->query( $this->prepare( $sql, $data ) );
1337      }
1338  
1339      /**
1340       * Update a row in the table
1341       *
1342       * <code>
1343       * wpdb::update( 'table', array( 'column' => 'foo', 'field' => 'bar' ), array( 'ID' => 1 ) )
1344       * wpdb::update( 'table', array( 'column' => 'foo', 'field' => 1337 ), array( 'ID' => 1 ), array( '%s', '%d' ), array( '%d' ) )
1345       * </code>
1346       *
1347       * @since 2.5.0
1348       * @see wpdb::prepare()
1349       * @see wpdb::$field_types
1350       * @see wp_set_wpdb_vars()
1351       *
1352       * @param string $table table name
1353       * @param array $data Data to update (in column => value pairs). Both $data columns and $data values should be "raw" (neither should be SQL escaped).
1354       * @param array $where A named array of WHERE clauses (in column => value pairs). Multiple clauses will be joined with ANDs. Both $where columns and $where values should be "raw".
1355       * @param array|string $format Optional. An array of formats to be mapped to each of the values in $data. If string, that format will be used for all of the values in $data.
1356       *     A format is one of '%d', '%f', '%s' (integer, float, string). If omitted, all values in $data will be treated as strings unless otherwise specified in wpdb::$field_types.
1357       * @param array|string $where_format Optional. An array of formats to be mapped to each of the values in $where. If string, that format will be used for all of the items in $where. A format is one of '%d', '%f', '%s' (integer, float, string). If omitted, all values in $where will be treated as strings.
1358       * @return int|false The number of rows updated, or false on error.
1359       */
1360  	function update( $table, $data, $where, $format = null, $where_format = null ) {
1361          if ( ! is_array( $data ) || ! is_array( $where ) )
1362              return false;
1363  
1364          $formats = $format = (array) $format;
1365          $bits = $wheres = array();
1366          foreach ( (array) array_keys( $data ) as $field ) {
1367              if ( !empty( $format ) )
1368                  $form = ( $form = array_shift( $formats ) ) ? $form : $format[0];
1369              elseif ( isset($this->field_types[$field]) )
1370                  $form = $this->field_types[$field];
1371              else
1372                  $form = '%s';
1373              $bits[] = "`$field` = {$form}";
1374          }
1375  
1376          $where_formats = $where_format = (array) $where_format;
1377          foreach ( (array) array_keys( $where ) as $field ) {
1378              if ( !empty( $where_format ) )
1379                  $form = ( $form = array_shift( $where_formats ) ) ? $form : $where_format[0];
1380              elseif ( isset( $this->field_types[$field] ) )
1381                  $form = $this->field_types[$field];
1382              else
1383                  $form = '%s';
1384              $wheres[] = "`$field` = {$form}";
1385          }
1386  
1387          $sql = "UPDATE `$table` SET " . implode( ', ', $bits ) . ' WHERE ' . implode( ' AND ', $wheres );
1388          return $this->query( $this->prepare( $sql, array_merge( array_values( $data ), array_values( $where ) ) ) );
1389      }
1390  
1391      /**
1392       * Delete a row in the table
1393       *
1394       * <code>
1395       * wpdb::delete( 'table', array( 'ID' => 1 ) )
1396       * wpdb::delete( 'table', array( 'ID' => 1 ), array( '%d' ) )
1397       * </code>
1398       *
1399       * @since 3.4.0
1400       * @see wpdb::prepare()
1401       * @see wpdb::$field_types
1402       * @see wp_set_wpdb_vars()
1403       *
1404       * @param string $table table name
1405       * @param array $where A named array of WHERE clauses (in column => value pairs). Multiple clauses will be joined with ANDs. Both $where columns and $where values should be "raw".
1406       * @param array|string $where_format Optional. An array of formats to be mapped to each of the values in $where. If string, that format will be used for all of the items in $where. A format is one of '%d', '%f', '%s' (integer, float, string). If omitted, all values in $where will be treated as strings unless otherwise specified in wpdb::$field_types.
1407       * @return int|false The number of rows updated, or false on error.
1408       */
1409  	function delete( $table, $where, $where_format = null ) {
1410          if ( ! is_array( $where ) )
1411              return false;
1412  
1413          $bits = $wheres = array();
1414  
1415          $where_formats = $where_format = (array) $where_format;
1416  
1417          foreach ( array_keys( $where ) as $field ) {
1418              if ( !empty( $where_format ) ) {
1419                  $form = ( $form = array_shift( $where_formats ) ) ? $form : $where_format[0];
1420              } elseif ( isset( $this->field_types[ $field ] ) ) {
1421                  $form = $this->field_types[ $field ];
1422              } else {
1423                  $form = '%s';
1424              }
1425  
1426              $wheres[] = "$field = $form";
1427          }
1428  
1429          $sql = "DELETE FROM $table WHERE " . implode( ' AND ', $wheres );
1430          return $this->query( $this->prepare( $sql, $where ) );
1431      }
1432  
1433  
1434      /**
1435       * Retrieve one variable from the database.
1436       *
1437       * Executes a SQL query and returns the value from the SQL result.
1438       * If the SQL result contains more than one column and/or more than one row, this function returns the value in the column and row specified.
1439       * If $query is null, this function returns the value in the specified column and row from the previous SQL result.
1440       *
1441       * @since 0.71
1442       *
1443       * @param string|null $query Optional. SQL query. Defaults to null, use the result from the previous query.
1444       * @param int $x Optional. Column of value to return. Indexed from 0.
1445       * @param int $y Optional. Row of value to return. Indexed from 0.
1446       * @return string|null Database query result (as string), or null on failure
1447       */
1448  	function get_var( $query = null, $x = 0, $y = 0 ) {
1449          $this->func_call = "\$db->get_var(\"$query\", $x, $y)";
1450          if ( $query )
1451              $this->query( $query );
1452  
1453          // Extract var out of cached results based x,y vals
1454          if ( !empty( $this->last_result[$y] ) ) {
1455              $values = array_values( get_object_vars( $this->last_result[$y] ) );
1456          }
1457  
1458          // If there is a value return it else return null
1459          return ( isset( $values[$x] ) && $values[$x] !== '' ) ? $values[$x] : null;
1460      }
1461  
1462      /**
1463       * Retrieve one row from the database.
1464       *
1465       * Executes a SQL query and returns the row from the SQL result.
1466       *
1467       * @since 0.71
1468       *
1469       * @param string|null $query SQL query.
1470       * @param string $output Optional. one of ARRAY_A | ARRAY_N | OBJECT constants. Return an associative array (column => value, ...),
1471       *     a numerically indexed array (0 => value, ...) or an object ( ->column = value ), respectively.
1472       * @param int $y Optional. Row to return. Indexed from 0.
1473       * @return mixed Database query result in format specified by $output or null on failure
1474       */
1475  	function get_row( $query = null, $output = OBJECT, $y = 0 ) {
1476          $this->func_call = "\$db->get_row(\"$query\",$output,$y)";
1477          if ( $query )
1478              $this->query( $query );
1479          else
1480              return null;
1481  
1482          if ( !isset( $this->last_result[$y] ) )
1483              return null;
1484  
1485          if ( $output == OBJECT ) {
1486              return $this->last_result[$y] ? $this->last_result[$y] : null;
1487          } elseif ( $output == ARRAY_A ) {
1488              return $this->last_result[$y] ? get_object_vars( $this->last_result[$y] ) : null;
1489          } elseif ( $output == ARRAY_N ) {
1490              return $this->last_result[$y] ? array_values( get_object_vars( $this->last_result[$y] ) ) : null;
1491          } else {
1492              $this->print_error( " \$db->get_row(string query, output type, int offset) -- Output type must be one of: OBJECT, ARRAY_A, ARRAY_N" );
1493          }
1494      }
1495  
1496      /**
1497       * Retrieve one column from the database.
1498       *
1499       * Executes a SQL query and returns the column from the SQL result.
1500       * If the SQL result contains more than one column, this function returns the column specified.
1501       * If $query is null, this function returns the specified column from the previous SQL result.
1502       *
1503       * @since 0.71
1504       *
1505       * @param string|null $query Optional. SQL query. Defaults to previous query.
1506       * @param int $x Optional. Column to return. Indexed from 0.
1507       * @return array Database query result. Array indexed from 0 by SQL result row number.
1508       */
1509  	function get_col( $query = null , $x = 0 ) {
1510          if ( $query )
1511              $this->query( $query );
1512  
1513          $new_array = array();
1514          // Extract the column values
1515          for ( $i = 0, $j = count( $this->last_result ); $i < $j; $i++ ) {
1516              $new_array[$i] = $this->get_var( null, $x, $i );
1517          }
1518          return $new_array;
1519      }
1520  
1521      /**
1522       * Retrieve an entire SQL result set from the database (i.e., many rows)
1523       *
1524       * Executes a SQL query and returns the entire SQL result.
1525       *
1526       * @since 0.71
1527       *
1528       * @param string $query SQL query.
1529       * @param string $output Optional. Any of ARRAY_A | ARRAY_N | OBJECT | OBJECT_K constants. With one of the first three, return an array of rows indexed from 0 by SQL result row number.
1530       *     Each row is an associative array (column => value, ...), a numerically indexed array (0 => value, ...), or an object. ( ->column = value ), respectively.
1531       *     With OBJECT_K, return an associative array of row objects keyed by the value of each row's first column's value. Duplicate keys are discarded.
1532       * @return mixed Database query results
1533       */
1534  	function get_results( $query = null, $output = OBJECT ) {
1535          $this->func_call = "\$db->get_results(\"$query\", $output)";
1536  
1537          if ( $query )
1538              $this->query( $query );
1539          else
1540              return null;
1541  
1542          $new_array = array();
1543          if ( $output == OBJECT ) {
1544              // Return an integer-keyed array of row objects
1545              return $this->last_result;
1546          } elseif ( $output == OBJECT_K ) {
1547              // Return an array of row objects with keys from column 1
1548              // (Duplicates are discarded)
1549              foreach ( $this->last_result as $row ) {
1550                  $var_by_ref = get_object_vars( $row );
1551                  $key = array_shift( $var_by_ref );
1552                  if ( ! isset( $new_array[ $key ] ) )
1553                      $new_array[ $key ] = $row;
1554              }
1555              return $new_array;
1556          } elseif ( $output == ARRAY_A || $output == ARRAY_N ) {
1557              // Return an integer-keyed array of...
1558              if ( $this->last_result ) {
1559                  foreach( (array) $this->last_result as $row ) {
1560                      if ( $output == ARRAY_N ) {
1561                          // ...integer-keyed row arrays
1562                          $new_array[] = array_values( get_object_vars( $row ) );
1563                      } else {
1564                          // ...column name-keyed row arrays
1565                          $new_array[] = get_object_vars( $row );
1566                      }
1567                  }
1568              }
1569              return $new_array;
1570          }
1571          return null;
1572      }
1573  
1574      /**
1575       * Load the column metadata from the last query.
1576       *
1577       * @since 3.5.0
1578       *
1579       * @access protected
1580       */
1581  	protected function load_col_info() {
1582          if ( $this->col_info )
1583              return;
1584  
1585          for ( $i = 0; $i < @mysql_num_fields( $this->result ); $i++ ) {
1586              $this->col_info[ $i ] = @mysql_fetch_field( $this->result, $i );
1587          }
1588      }
1589  
1590      /**
1591       * Retrieve column metadata from the last query.
1592       *
1593       * @since 0.71
1594       *
1595       * @param string $info_type Optional. Type one of name, table, def, max_length, not_null, primary_key, multiple_key, unique_key, numeric, blob, type, unsigned, zerofill
1596       * @param int $col_offset Optional. 0: col name. 1: which table the col's in. 2: col's max length. 3: if the col is numeric. 4: col's type
1597       * @return mixed Column Results
1598       */
1599  	function get_col_info( $info_type = 'name', $col_offset = -1 ) {
1600          $this->load_col_info();
1601  
1602          if ( $this->col_info ) {
1603              if ( $col_offset == -1 ) {
1604                  $i = 0;
1605                  $new_array = array();
1606                  foreach( (array) $this->col_info as $col ) {
1607                      $new_array[$i] = $col->{$info_type};
1608                      $i++;
1609                  }
1610                  return $new_array;
1611              } else {
1612                  return $this->col_info[$col_offset]->{$info_type};
1613              }
1614          }
1615      }
1616  
1617      /**
1618       * Starts the timer, for debugging purposes.
1619       *
1620       * @since 1.5.0
1621       *
1622       * @return true
1623       */
1624  	function timer_start() {
1625          $this->time_start = microtime( true );
1626          return true;
1627      }
1628  
1629      /**
1630       * Stops the debugging timer.
1631       *
1632       * @since 1.5.0
1633       *
1634       * @return float Total time spent on the query, in seconds
1635       */
1636  	function timer_stop() {
1637          return ( microtime( true ) - $this->time_start );
1638      }
1639  
1640      /**
1641       * Wraps errors in a nice header and footer and dies.
1642       *
1643       * Will not die if wpdb::$show_errors is false.
1644       *
1645       * @since 1.5.0
1646       *
1647       * @param string $message The Error message
1648       * @param string $error_code Optional. A Computer readable string to identify the error.
1649       * @return false|void
1650       */
1651  	function bail( $message, $error_code = '500' ) {
1652          if ( !$this->show_errors ) {
1653              if ( class_exists( 'WP_Error' ) )
1654                  $this->error = new WP_Error($error_code, $message);
1655              else
1656                  $this->error = $message;
1657              return false;
1658          }
1659          wp_die($message);
1660      }
1661  
1662      /**
1663       * Whether MySQL database is at least the required minimum version.
1664       *
1665       * @since 2.5.0
1666       * @uses $wp_version
1667       * @uses $required_mysql_version
1668       *
1669       * @return WP_Error
1670       */
1671  	function check_database_version() {
1672          global $wp_version, $required_mysql_version;
1673          // Make sure the server has the required MySQL version
1674          if ( version_compare($this->db_version(), $required_mysql_version, '<') )
1675              return new WP_Error('database_version', sprintf( __( '<strong>ERROR</strong>: WordPress %1$s requires MySQL %2$s or higher' ), $wp_version, $required_mysql_version ));
1676      }
1677  
1678      /**
1679       * Whether the database supports collation.
1680       *
1681       * Called when WordPress is generating the table scheme.
1682       *
1683       * @since 2.5.0
1684       * @deprecated 3.5.0
1685       * @deprecated Use wpdb::has_cap( 'collation' )
1686       *
1687       * @return bool True if collation is supported, false if version does not
1688       */
1689  	function supports_collation() {
1690          _deprecated_function( __FUNCTION__, '3.5', 'wpdb::has_cap( \'collation\' )' );
1691          return $this->has_cap( 'collation' );
1692      }
1693  
1694      /**
1695       * The database character collate.
1696       *
1697       * @since 3.5.0
1698       *
1699       * @return string The database character collate.
1700       */
1701  	public function get_charset_collate() {
1702          $charset_collate = '';
1703  
1704          if ( ! empty( $this->charset ) )
1705              $charset_collate = "DEFAULT CHARACTER SET $this->charset";
1706          if ( ! empty( $this->collate ) )
1707              $charset_collate .= " COLLATE $this->collate";
1708  
1709          return $charset_collate;
1710      }
1711  
1712      /**
1713       * Determine if a database supports a particular feature.
1714       *
1715       * @since 2.7.0
1716       * @see wpdb::db_version()
1717       *
1718       * @param string $db_cap The feature to check for.
1719       * @return bool
1720       */
1721  	function has_cap( $db_cap ) {
1722          $version = $this->db_version();
1723  
1724          switch ( strtolower( $db_cap ) ) {
1725              case 'collation' :    // @since 2.5.0
1726              case 'group_concat' : // @since 2.7.0
1727              case 'subqueries' :   // @since 2.7.0
1728                  return version_compare( $version, '4.1', '>=' );
1729              case 'set_charset' :
1730                  return version_compare( $version, '5.0.7', '>=' );
1731          };
1732  
1733          return false;
1734      }
1735  
1736      /**
1737       * Retrieve the name of the function that called wpdb.
1738       *
1739       * Searches up the list of functions until it reaches
1740       * the one that would most logically had called this method.
1741       *
1742       * @since 2.5.0
1743       *
1744       * @return string The name of the calling function
1745       */
1746  	function get_caller() {
1747          return wp_debug_backtrace_summary( __CLASS__ );
1748      }
1749  
1750      /**
1751       * The database version number.
1752       *
1753       * @since 2.7.0
1754       *
1755       * @return false|string false on failure, version number on success
1756       */
1757  	function db_version() {
1758          return preg_replace( '/[^0-9.].*/', '', mysql_get_server_info( $this->dbh ) );
1759      }
1760  }


Generated: Tue Mar 25 01:41:18 2014 WordPress honlapkészítés: online1.hu