Make WordPress Core

Ticket #21663: 21663.7.patch

File 21663.7.patch, 81.6 KB (added by gohanman, 12 years ago)

Remove mysql extension requirement

  • new file wp-includes/class-wp-db-driver-mysql.php

    diff --git wp-includes/class-wp-db-driver-mysql.php wp-includes/class-wp-db-driver-mysql.php
    new file mode 100644
    index 0000000..237a3b5
    - +  
     1<?php
     2
     3/**
     4 * Database driver, using the mysql extension.
     5 *
     6 * @link http://php.net/manual/en/book.mysqli.php
     7 *
     8 * @package WordPress
     9 * @subpackage Database
     10 * @since 3.6.0
     11 */
     12class wpdb_driver_mysql implements wpdb_driver {
     13
     14        /**
     15         * Database link
     16         * @var resource
     17         */
     18        private $dbh = null;
     19
     20        /**
     21         * Result set
     22         * @var resource
     23         */
     24        private $result = null;
     25
     26        /**
     27         * Cached column info
     28         * @var array|null
     29         */
     30        private $col_info = null;
     31
     32        /**
     33         * Escape with mysql_real_escape_string()
     34         * @param  string $string
     35         * @return string
     36         */
     37        public function escape( $string ) {
     38                return mysql_real_escape_string( $string, $this->dbh );
     39        }
     40
     41        /**
     42         * Get the latest error message from the DB driver
     43         * @return string
     44         */
     45        public function get_error_message() {
     46                return mysql_error( $this->dbh );
     47        }
     48
     49        /**
     50         * Free memory associated with the resultset
     51         * @return void
     52         */
     53        public function flush() {
     54                if ( is_resource( $this->result ) ) {
     55                        mysql_free_result( $this->result );
     56                }
     57                $this->result = null;
     58                $this->col_info = null;
     59        }
     60
     61        /**
     62         * Connect to database
     63         * @return bool
     64         */
     65        public function connect( $host, $user, $pass, $port = 3306 ) {
     66
     67                $new_link = defined( 'MYSQL_NEW_LINK' ) ? MYSQL_NEW_LINK : true;
     68                $client_flags = defined( 'MYSQL_CLIENT_FLAGS' ) ? MYSQL_CLIENT_FLAGS : 0;
     69
     70                if ( WP_DEBUG ) {
     71                        $this->dbh =  mysql_connect( "$host:$port", $user, $pass, $new_link, $client_flags );
     72                } else {
     73                        $this->dbh = @mysql_connect( "$host:$port", $user, $pass, $new_link, $client_flags );
     74                }
     75                return ( false !== $this->dbh );
     76        }
     77
     78        /**
     79         * Select database
     80         * @return void
     81         */
     82        public function select( $db ) {
     83                if ( WP_DEBUG ) {
     84                         mysql_select_db( $db, $this->dbh );
     85                } else {
     86                        @mysql_select_db( $db, $this->dbh );
     87                }
     88        }
     89
     90        /**
     91         * Perform a MySQL database query, using current database connection.
     92         * @param string $query Database query
     93         * @return int|false Number of rows affected/selected or false on error
     94         */
     95        public function query( $query ) {
     96                $this->result = @mysql_query( $query, $this->dbh );
     97                if ( preg_match( '/^\s*(create|alter|truncate|drop)\s/i', $query ) ) {
     98                        $return_val = $this->result;
     99                } elseif ( preg_match( '/^\s*(insert|delete|update|replace)\s/i', $query ) ) {
     100                        $return_val = $this->affected_rows();
     101                } elseif ( preg_match( '/^\s*select\s/i', $query ) ) {
     102                        return is_resource( $this->result ) ? mysql_num_rows( $this->result ) : false ;
     103                }
     104                return true;
     105        }
     106
     107        /**
     108         * Get number of rows affected
     109         * @return int
     110         */
     111        public function affected_rows() {
     112                return mysql_affected_rows( $this->dbh );
     113        }
     114
     115        /**
     116         * Get last insert id
     117         * @return int
     118         */
     119        public function insert_id() {
     120                return mysql_insert_id( $this->dbh );
     121        }
     122
     123        /**
     124         * Get results
     125         * @return array
     126         */
     127        public function get_results() {
     128                $ret = array();
     129                while ( $row = @mysql_fetch_object( $this->result ) ) {
     130                        $ret[] = $row;
     131                }
     132                return $ret;
     133        }
     134
     135        /**
     136         * Load the column metadata from the last query.
     137         * @return array
     138         */
     139        public function load_col_info() {
     140                if ( $this->col_info )
     141                        return $this->col_info;
     142                for ( $i = 0; $i < @mysql_num_fields( $this->result ); $i++ ) {
     143                        $this->col_info[ $i ] = @mysql_fetch_field( $this->result, $i );
     144                }
     145                return $this->col_info;
     146        }
     147
     148        /**
     149         * The database version number.
     150         * @return false|string false on failure, version number on success
     151         */
     152        public function db_version() {
     153                return preg_replace( '/[^0-9.].*/', '', mysql_get_server_info( $this->dbh ) );
     154        }
     155}
  • new file wp-includes/class-wp-db-driver-mysqli.php

    diff --git wp-includes/class-wp-db-driver-mysqli.php wp-includes/class-wp-db-driver-mysqli.php
    new file mode 100644
    index 0000000..fd3f681
    - +  
     1<?php
     2
     3/**
     4 * Database driver, using the mysqli extension.
     5 *
     6 * @link http://php.net/manual/en/book.mysqli.php
     7 *
     8 * @package WordPress
     9 * @subpackage Database
     10 * @since 3.6.0
     11 */
     12class wpdb_driver_mysqli implements wpdb_driver {
     13
     14        /**
     15         * Database link
     16         * @var mysqli
     17         */
     18        private $dbh = null;
     19
     20        /**
     21         * Result set
     22         * @var mysqli_stmt|mysqli_result
     23         */
     24        private $result = null;
     25
     26        /**
     27         * Cached column info
     28         * @var array|null
     29         */
     30        private $col_info = null;
     31
     32        /**
     33         * Escape with mysql_real_escape_string()
     34         * @param  string $string
     35         * @return string
     36         */
     37        public function escape( $string ) {
     38                return $this->dbh->escape_string( $string );
     39        }
     40
     41        /**
     42         * Get the latest error message from the DB driver
     43         * @return string
     44         */
     45        public function get_error_message() {
     46                return $this->dbh->error;
     47        }
     48
     49        /**
     50         * Free memory associated with the resultset
     51         * @return void
     52         */
     53        public function flush() {
     54                if ( $this->result instanceof mysqli_stmt ) {
     55                        $this->result->free_result();
     56                }
     57                $this->result = null;
     58                $this->col_info = null;
     59        }
     60
     61        /**
     62         * Connect to database
     63         * @return bool
     64         */
     65        public function connect( $host, $user, $pass, $port = 3306 ) {
     66                $this->dbh = new mysqli( $host, $user, $pass, '', $port );
     67                return ( !mysqli_connect_error() );
     68        }
     69
     70        /**
     71         * Select database
     72         * @return void
     73         */
     74        public function select( $db ) {
     75                $this->dbh->select_db( $db );
     76        }
     77
     78        /**
     79         * Perform a MySQL database query, using current database connection.
     80         * @param string $query Database query
     81         * @return int|false Number of rows affected/selected or false on error
     82         */
     83        public function query( $query ) {
     84                $this->result = $this->dbh->query( $query );
     85                if ( preg_match( '/^\s*(create|alter|truncate|drop)\s/i', $query ) ) {
     86                        $return_val = $this->result;
     87                } elseif ( preg_match( '/^\s*(insert|delete|update|replace)\s/i', $query ) ) {
     88                        $return_val = $this->affected_rows();
     89                } elseif ( preg_match( '/^\s*select\s/i', $query ) ) {
     90                        return $this->result->num_rows;
     91                }
     92                return true;
     93        }
     94
     95        /**
     96         * Get number of rows affected
     97         * @return int
     98         */
     99        public function affected_rows() {
     100                return $this->dbh->affected_rows;
     101        }
     102
     103        /**
     104         * Get last insert id
     105         * @return int
     106         */
     107        public function insert_id() {
     108                return $this->dbh->insert_id;
     109        }
     110
     111        /**
     112         * Get results
     113         * @return array
     114         */
     115        public function get_results() {
     116                $ret = array();
     117                while ( $row = $this->result->fetch_object() ) {
     118                        $ret[] = $row;
     119                }
     120                return $ret;
     121        }
     122
     123        /**
     124         * Load the column metadata from the last query.
     125         * @return array
     126         */
     127        public function load_col_info() {
     128                if ( $this->col_info )
     129                        return $this->col_info;
     130                for ( $i = 0; $i < $this->result->field_count ; $i++ ) {
     131                        $this->col_info[ $i ] = $this->result->fetch_field_direct( $i );
     132                }
     133                return $this->col_info;
     134        }
     135
     136        /**
     137         * The database version number.
     138         * @return false|string false on failure, version number on success
     139         */
     140        public function db_version() {
     141                return preg_replace( '/[^0-9.].*/', '', $this->dbh->server_version );
     142        }
     143}
  • new file wp-includes/class-wp-db-driver-pdo_mysql.php

    diff --git wp-includes/class-wp-db-driver-pdo_mysql.php wp-includes/class-wp-db-driver-pdo_mysql.php
    new file mode 100644
    index 0000000..6a2c47f
    - +  
     1<?php
     2
     3/**
     4 * Database driver, using the PDO extension.
     5 *
     6 * @link http://php.net/manual/en/book.pdo.php
     7 *
     8 * @package WordPress
     9 * @subpackage Database
     10 * @since 3.6.0
     11 */
     12class wpdb_driver_pdo_mysql implements wpdb_driver {
     13
     14        /**
     15         * Database link
     16         * @var PDO
     17         */
     18        private $dbh = null;
     19
     20        /**
     21         * Result set
     22         * @var PDOStatement
     23         */
     24        private $result = null;
     25
     26        /**
     27         * Cached column info
     28         * @var array|null
     29         */
     30        private $col_info = null;
     31
     32        /**
     33         * Array of fetched rows.
     34         * PDO doesn't have a "count rows" feature, so we have to fetch the rows
     35         * up front, and cache them here
     36         * @var array
     37         */
     38        private $fetched_rows = array();
     39
     40        /**
     41         * Escape with mysql_real_escape_string()
     42         * @param  string $string
     43         * @return string
     44         */
     45        public function escape( $string ) {
     46                return substr( $this->dbh->quote( $string ), 1, -1 );
     47        }
     48
     49        /**
     50         * Get the latest error message from the DB driver
     51         * @return string
     52         */
     53        public function get_error_message() {
     54                $error = $this->dbh->errorInfo();
     55                if ( isset( $error[2] ) ) {
     56                        return $error[2];
     57                }
     58                return '';
     59        }
     60
     61        /**
     62         * Free memory associated with the resultset
     63         * @return void
     64         */
     65        public function flush() {
     66                if ( $this->result instanceof PDOStatement ) {
     67                        $this->result->closeCursor();
     68                }
     69                $this->result = null;
     70                $this->col_info = null;
     71                $this->fetched_rows = array();
     72        }
     73
     74        /**
     75         * Connect to database
     76         * @return bool
     77         */
     78        public function connect( $host, $user, $pass, $port = 3306 ) {
     79                $dsn = sprintf( 'mysql:host=%1$s;port=%2$d', $host, $port );
     80                try {
     81                        $this->dbh = new PDO( $dsn, $user, $pass );
     82                } catch ( Exception $e ) {
     83                        return false;
     84                }
     85                return true;
     86        }
     87
     88        /**
     89         * Select database
     90         * @return void
     91         */
     92        public function select( $db ) {
     93                $this->dbh->exec( sprintf( 'USE %s', $db ) );
     94        }
     95
     96        /**
     97         * Perform a MySQL database query, using current database connection.
     98         * @param string $query Database query
     99         * @return int|false Number of rows affected/selected or false on error
     100         */
     101        public function query( $query ) {
     102                try {
     103                        $this->result = $this->dbh->query( $query );
     104                } catch ( Exception $e ) {
     105                }
     106                if ( preg_match( '/^\s*(create|alter|truncate|drop)\s/i', $query ) ) {
     107                        $return_val = $this->result;
     108                } elseif ( preg_match( '/^\s*(insert|delete|update|replace)\s/i', $query ) ) {
     109                        $return_val = $this->affected_rows();
     110                } elseif ( preg_match( '/^\s*select\s/i', $query ) ) {
     111                        $this->get_results();
     112                        return count( $this->fetched_rows );
     113                }
     114                return true;
     115        }
     116
     117        /**
     118         * Get number of rows affected
     119         * @return int
     120         */
     121        public function affected_rows() {
     122                if ( $this->result instanceof PDOStatement ) {
     123                        return $this->result->rowCount();
     124                }
     125                return 0;
     126        }
     127
     128        /**
     129         * Get last insert id
     130         * @return int
     131         */
     132        public function insert_id() {
     133                return $this->dbh->lastInsertId();
     134        }
     135
     136        /**
     137         * Get results
     138         * @return array
     139         */
     140        public function get_results() {
     141                if ( !empty( $this->fetched_rows ) ) {
     142                        return $this->fetched_rows;
     143                }
     144                $this->fetched_rows = array();
     145                if ( !empty( $this->result ) ) {
     146                        while ( $row = $this->result->fetchObject() ) {
     147                                $this->fetched_rows[] = $row;
     148                        }
     149                }
     150                return $this->fetched_rows;
     151        }
     152
     153        /**
     154         * Load the column metadata from the last query.
     155         * @return array
     156         */
     157        public function load_col_info() {
     158                if ( $this->col_info )
     159                        return $this->col_info;
     160                for ( $i = 0; $i < $this->result->columnCount() ; $i++ ) {
     161                        $this->col_info[ $i ] = $this->result->fetchColumn( $i );
     162                }
     163                return $this->col_info;
     164        }
     165
     166        /**
     167         * The database version number.
     168         * @return false|string false on failure, version number on success
     169         */
     170        public function db_version() {
     171                return preg_replace( '/[^0-9.].*/', '', $this->dbh->getAttribute( PDO::ATTR_SERVER_VERSION ) );
     172        }
     173}
  • new file wp-includes/class.wp-db-driver-mysql.php

    diff --git wp-includes/class.wp-db-driver-mysql.php wp-includes/class.wp-db-driver-mysql.php
    new file mode 100644
    index 0000000..baef192
    - +  
     1<?php
     2
     3/**
     4 * WordPress Database Access Abstraction Object
     5 *
     6 * It is possible to replace this class with your own
     7 * by setting the $wpdb global variable in wp-content/db.php
     8 * file to your class. The wpdb class will still be included,
     9 * so you can extend it or simply use your own.
     10 *
     11 * @link http://codex.wordpress.org/Function_Reference/wpdb_Class
     12 *
     13 * @package WordPress
     14 * @subpackage Database
     15 * @since 0.71
     16 */
     17class wpdb_driver_mysql implements wpdb_driver {
     18       
     19        /**
     20         * Database link
     21         * @var resource
     22         */
     23        private $dbh = null;
     24       
     25        /**
     26         * Result set
     27         * @var resource
     28         */
     29        private $result = null;
     30       
     31        /**
     32         * Cached column info
     33         * @var array|null
     34         */
     35        private $col_info = null;
     36       
     37        /**
     38         * Escape with mysql_real_escape_string()
     39         * @param  string $string
     40         * @return string
     41         */
     42        public function escape( $string ) {
     43                return mysql_real_escape_string( $string, $this->dbh );
     44        }
     45
     46        /**
     47         * Get the latest error message from the DB driver
     48         * @return string
     49         */
     50        public function get_error_message() {
     51                return mysql_error( $this->dbh );
     52        }
     53
     54        /**
     55         * Free memory associated with the resultset
     56         * @return void
     57         */
     58        public function flush() {
     59                if ( is_resource( $this->result ) ) {
     60                        mysql_free_result( $this->result );
     61                }
     62                $this->result = null;
     63                $this->col_info = null;
     64        }
     65
     66        /**
     67         * Connect to database
     68         * @return bool
     69         */
     70        public function connect( $host, $user, $pass, $port = 3306 ) {
     71               
     72                $new_link = defined( 'MYSQL_NEW_LINK' ) ? MYSQL_NEW_LINK : true;
     73                $client_flags = defined( 'MYSQL_CLIENT_FLAGS' ) ? MYSQL_CLIENT_FLAGS : 0;
     74
     75                if ( WP_DEBUG ) {
     76                        $this->dbh =  mysql_connect( "$host:$port", $user, $pass, $new_link, $client_flags );
     77                } else {
     78                        $this->dbh = @mysql_connect( "$host:$port", $user, $pass, $new_link, $client_flags );
     79                }
     80                return ( false !== $this->dbh );
     81        }
     82
     83        /**
     84         * Select database
     85         * @return void
     86         */
     87        public function select( $db ) {
     88                if ( WP_DEBUG ) {
     89                         mysql_select_db( $db, $this->dbh );
     90                } else {
     91                        @mysql_select_db( $db, $this->dbh );
     92                }
     93        }               
     94       
     95        /**
     96         * Perform a MySQL database query, using current database connection.
     97         * @param string $query Database query
     98         * @return int|false Number of rows affected/selected or false on error
     99         */
     100        public function query( $query ) {
     101                $this->result = @mysql_query( $query, $this->dbh );
     102                if ( preg_match( '/^\s*(create|alter|truncate|drop)\s/i', $query ) ) {
     103                        $return_val = $this->result;
     104                } elseif ( preg_match( '/^\s*(insert|delete|update|replace)\s/i', $query ) ) {
     105                        $return_val = $this->affected_rows();
     106                } elseif ( preg_match( '/^\s*select\s/i', $query ) ) {
     107                        return is_resource( $this->result ) ? mysql_num_rows( $this->result ) : false ;
     108                }
     109                return true;
     110        }
     111
     112        /**
     113         * Get number of rows affected
     114         * @return int
     115         */
     116        public function affected_rows() {
     117                return mysql_affected_rows( $this->dbh );
     118        }
     119       
     120        /**
     121         * Get last insert id
     122         * @return int
     123         */
     124        public function insert_id() {
     125                return mysql_insert_id( $this->dbh );
     126        }
     127
     128        /**
     129         * Get results
     130         * @return array
     131         */
     132        public function get_results() {
     133                $ret = array();
     134                while ( $row = @mysql_fetch_object( $this->result ) ) {
     135                        $ret[] = $row;
     136                }
     137                return $ret;
     138        }
     139
     140        /**
     141         * Load the column metadata from the last query.
     142         * @return array
     143         */
     144        public function load_col_info() {
     145                if ( $this->col_info )
     146                        return $this->col_info;
     147                for ( $i = 0; $i < @mysql_num_fields( $this->result ); $i++ ) {
     148                        $this->col_info[ $i ] = @mysql_fetch_field( $this->result, $i );
     149                }
     150                return $this->col_info;
     151        }
     152
     153        /**
     154         * The database version number.
     155         * @return false|string false on failure, version number on success
     156         */
     157        public function db_version() {
     158                return preg_replace( '/[^0-9.].*/', '', mysql_get_server_info( $this->dbh ) );
     159        }
     160}
     161<?php
     162
     163/**
     164 * WordPress Database Access Abstraction Object
     165 *
     166 * It is possible to replace this class with your own
     167 * by setting the $wpdb global variable in wp-content/db.php
     168 * file to your class. The wpdb class will still be included,
     169 * so you can extend it or simply use your own.
     170 *
     171 * @link http://codex.wordpress.org/Function_Reference/wpdb_Class
     172 *
     173 * @package WordPress
     174 * @subpackage Database
     175 * @since 0.71
     176 */
     177class wpdb_driver_mysql implements wpdb_driver {
     178       
     179        /**
     180         * Database link
     181         * @var resource
     182         */
     183        private $dbh = null;
     184       
     185        /**
     186         * Result set
     187         * @var resource
     188         */
     189        private $result = null;
     190       
     191        /**
     192         * Cached column info
     193         * @var array|null
     194         */
     195        private $col_info = null;
     196       
     197        /**
     198         * Escape with mysql_real_escape_string()
     199         * @param  string $string
     200         * @return string
     201         */
     202        public function escape( $string ) {
     203                return mysql_real_escape_string( $string, $this->dbh );
     204        }
     205
     206        /**
     207         * Get the latest error message from the DB driver
     208         * @return string
     209         */
     210        public function get_error_message() {
     211                return mysql_error( $this->dbh );
     212        }
     213
     214        /**
     215         * Free memory associated with the resultset
     216         * @return void
     217         */
     218        public function flush() {
     219                if ( is_resource( $this->result ) ) {
     220                        mysql_free_result( $this->result );
     221                }
     222                $this->result = null;
     223                $this->col_info = null;
     224        }
     225
     226        /**
     227         * Connect to database
     228         * @return bool
     229         */
     230        public function connect( $host, $user, $pass, $port = 3306 ) {
     231               
     232                $new_link = defined( 'MYSQL_NEW_LINK' ) ? MYSQL_NEW_LINK : true;
     233                $client_flags = defined( 'MYSQL_CLIENT_FLAGS' ) ? MYSQL_CLIENT_FLAGS : 0;
     234
     235                if ( WP_DEBUG ) {
     236                        $this->dbh =  mysql_connect( "$host:$port", $user, $pass, $new_link, $client_flags );
     237                } else {
     238                        $this->dbh = @mysql_connect( "$host:$port", $user, $pass, $new_link, $client_flags );
     239                }
     240                return ( false !== $this->dbh );
     241        }
     242
     243        /**
     244         * Select database
     245         * @return void
     246         */
     247        public function select( $db ) {
     248                if ( WP_DEBUG ) {
     249                         mysql_select_db( $db, $this->dbh );
     250                } else {
     251                        @mysql_select_db( $db, $this->dbh );
     252                }
     253        }               
     254       
     255        /**
     256         * Perform a MySQL database query, using current database connection.
     257         * @param string $query Database query
     258         * @return int|false Number of rows affected/selected or false on error
     259         */
     260        public function query( $query ) {
     261                $this->result = @mysql_query( $query, $this->dbh );
     262                if ( preg_match( '/^\s*(create|alter|truncate|drop)\s/i', $query ) ) {
     263                        $return_val = $this->result;
     264                } elseif ( preg_match( '/^\s*(insert|delete|update|replace)\s/i', $query ) ) {
     265                        $return_val = $this->affected_rows();
     266                } elseif ( preg_match( '/^\s*select\s/i', $query ) ) {
     267                        return is_resource( $this->result ) ? mysql_num_rows( $this->result ) : false ;
     268                }
     269                return true;
     270        }
     271
     272        /**
     273         * Get number of rows affected
     274         * @return int
     275         */
     276        public function affected_rows() {
     277                return mysql_affected_rows( $this->dbh );
     278        }
     279       
     280        /**
     281         * Get last insert id
     282         * @return int
     283         */
     284        public function insert_id() {
     285                return mysql_insert_id( $this->dbh );
     286        }
     287
     288        /**
     289         * Get results
     290         * @return array
     291         */
     292        public function get_results() {
     293                $ret = array();
     294                while ( $row = @mysql_fetch_object( $this->result ) ) {
     295                        $ret[] = $row;
     296                }
     297                return $ret;
     298        }
     299
     300        /**
     301         * Load the column metadata from the last query.
     302         * @return array
     303         */
     304        public function load_col_info() {
     305                if ( $this->col_info )
     306                        return $this->col_info;
     307                for ( $i = 0; $i < @mysql_num_fields( $this->result ); $i++ ) {
     308                        $this->col_info[ $i ] = @mysql_fetch_field( $this->result, $i );
     309                }
     310                return $this->col_info;
     311        }
     312
     313        /**
     314         * The database version number.
     315         * @return false|string false on failure, version number on success
     316         */
     317        public function db_version() {
     318                return preg_replace( '/[^0-9.].*/', '', mysql_get_server_info( $this->dbh ) );
     319        }
     320}
     321 No newline at end of file
  • new file wp-includes/class.wp-db-driver-mysqli.php

    diff --git wp-includes/class.wp-db-driver-mysqli.php wp-includes/class.wp-db-driver-mysqli.php
    new file mode 100644
    index 0000000..a7bef7d
    - +  
     1<?php
     2
     3/**
     4 * WordPress Database Access Abstraction Object
     5 *
     6 * It is possible to replace this class with your own
     7 * by setting the $wpdb global variable in wp-content/db.php
     8 * file to your class. The wpdb class will still be included,
     9 * so you can extend it or simply use your own.
     10 *
     11 * @link http://codex.wordpress.org/Function_Reference/wpdb_Class
     12 *
     13 * @package WordPress
     14 * @subpackage Database
     15 * @since 0.71
     16 */
     17class wpdb_driver_mysqli implements wpdb_driver {
     18       
     19        /**
     20         * Database link
     21         * @var mysqli
     22         */
     23        private $dbh = null;
     24       
     25        /**
     26         * Result set
     27         * @var mysqli_stmt|mysqli_result
     28         */
     29        private $result = null;
     30       
     31        /**
     32         * Cached column info
     33         * @var array|null
     34         */
     35        private $col_info = null;
     36       
     37        /**
     38         * Escape with mysql_real_escape_string()
     39         * @param  string $string
     40         * @return string
     41         */
     42        public function escape( $string ) {
     43                return $this->dbh->escape_string( $string );
     44        }
     45
     46        /**
     47         * Get the latest error message from the DB driver
     48         * @return string
     49         */
     50        public function get_error_message() {
     51                return $this->dbh->error;
     52        }
     53
     54        /**
     55         * Free memory associated with the resultset
     56         * @return void
     57         */
     58        public function flush() {
     59                if ( $this->result instanceof mysqli_stmt ) {
     60                        $this->result->free_result();
     61                }
     62                $this->result = null;
     63                $this->col_info = null;
     64        }
     65
     66        /**
     67         * Connect to database
     68         * @return bool
     69         */
     70        public function connect( $host, $user, $pass, $port = 3306 ) {         
     71                $this->dbh = new mysqli( $host, $user, $pass, '', $port );
     72                return ( !mysqli_connect_error() );
     73        }
     74
     75        /**
     76         * Select database
     77         * @return void
     78         */
     79        public function select( $db ) {
     80                $this->dbh->select_db( $db );
     81        }               
     82       
     83        /**
     84         * Perform a MySQL database query, using current database connection.
     85         * @param string $query Database query
     86         * @return int|false Number of rows affected/selected or false on error
     87         */
     88        public function query( $query ) {
     89                $this->result = $this->dbh->query( $query );
     90                if ( preg_match( '/^\s*(create|alter|truncate|drop)\s/i', $query ) ) {
     91                        $return_val = $this->result;
     92                } elseif ( preg_match( '/^\s*(insert|delete|update|replace)\s/i', $query ) ) {
     93                        $return_val = $this->affected_rows();
     94                } elseif ( preg_match( '/^\s*select\s/i', $query ) ) {
     95                        return $this->result->num_rows;
     96                }
     97                return true;
     98        }
     99
     100        /**
     101         * Get number of rows affected
     102         * @return int
     103         */
     104        public function affected_rows() {
     105                return $this->dbh->affected_rows;
     106        }
     107       
     108        /**
     109         * Get last insert id
     110         * @return int
     111         */
     112        public function insert_id() {
     113                return $this->dbh->insert_id;
     114        }
     115
     116        /**
     117         * Get results
     118         * @return array
     119         */
     120        public function get_results() {
     121                $ret = array();
     122                while ( $row = $this->result->fetch_object() ) {
     123                        $ret[] = $row;
     124                }
     125                return $ret;
     126        }
     127
     128        /**
     129         * Load the column metadata from the last query.
     130         * @return array
     131         */
     132        public function load_col_info() {
     133                if ( $this->col_info )
     134                        return $this->col_info;
     135                for ( $i = 0; $i < $this->result->field_count ; $i++ ) {
     136                        $this->col_info[ $i ] = $this->result->fetch_field_direct( $i );
     137                }
     138                return $this->col_info;
     139        }
     140
     141        /**
     142         * The database version number.
     143         * @return false|string false on failure, version number on success
     144         */
     145        public function db_version() {
     146                return preg_replace( '/[^0-9.].*/', '', $this->dbh->server_version );
     147        }
     148}
     149<?php
     150
     151/**
     152 * WordPress Database Access Abstraction Object
     153 *
     154 * It is possible to replace this class with your own
     155 * by setting the $wpdb global variable in wp-content/db.php
     156 * file to your class. The wpdb class will still be included,
     157 * so you can extend it or simply use your own.
     158 *
     159 * @link http://codex.wordpress.org/Function_Reference/wpdb_Class
     160 *
     161 * @package WordPress
     162 * @subpackage Database
     163 * @since 0.71
     164 */
     165class wpdb_driver_mysqli implements wpdb_driver {
     166       
     167        /**
     168         * Database link
     169         * @var mysqli
     170         */
     171        private $dbh = null;
     172       
     173        /**
     174         * Result set
     175         * @var mysqli_stmt|mysqli_result
     176         */
     177        private $result = null;
     178       
     179        /**
     180         * Cached column info
     181         * @var array|null
     182         */
     183        private $col_info = null;
     184       
     185        /**
     186         * Escape with mysql_real_escape_string()
     187         * @param  string $string
     188         * @return string
     189         */
     190        public function escape( $string ) {
     191                return $this->dbh->escape_string( $string );
     192        }
     193
     194        /**
     195         * Get the latest error message from the DB driver
     196         * @return string
     197         */
     198        public function get_error_message() {
     199                return $this->dbh->error;
     200        }
     201
     202        /**
     203         * Free memory associated with the resultset
     204         * @return void
     205         */
     206        public function flush() {
     207                if ( $this->result instanceof mysqli_stmt ) {
     208                        $this->result->free_result();
     209                }
     210                $this->result = null;
     211                $this->col_info = null;
     212        }
     213
     214        /**
     215         * Connect to database
     216         * @return bool
     217         */
     218        public function connect( $host, $user, $pass, $port = 3306 ) {         
     219                $this->dbh = new mysqli( $host, $user, $pass, '', $port );
     220                return ( !mysqli_connect_error() );
     221        }
     222
     223        /**
     224         * Select database
     225         * @return void
     226         */
     227        public function select( $db ) {
     228                $this->dbh->select_db( $db );
     229        }               
     230       
     231        /**
     232         * Perform a MySQL database query, using current database connection.
     233         * @param string $query Database query
     234         * @return int|false Number of rows affected/selected or false on error
     235         */
     236        public function query( $query ) {
     237                $this->result = $this->dbh->query( $query );
     238                if ( preg_match( '/^\s*(create|alter|truncate|drop)\s/i', $query ) ) {
     239                        $return_val = $this->result;
     240                } elseif ( preg_match( '/^\s*(insert|delete|update|replace)\s/i', $query ) ) {
     241                        $return_val = $this->affected_rows();
     242                } elseif ( preg_match( '/^\s*select\s/i', $query ) ) {
     243                        return $this->result->num_rows;
     244                }
     245                return true;
     246        }
     247
     248        /**
     249         * Get number of rows affected
     250         * @return int
     251         */
     252        public function affected_rows() {
     253                return $this->dbh->affected_rows;
     254        }
     255       
     256        /**
     257         * Get last insert id
     258         * @return int
     259         */
     260        public function insert_id() {
     261                return $this->dbh->insert_id;
     262        }
     263
     264        /**
     265         * Get results
     266         * @return array
     267         */
     268        public function get_results() {
     269                $ret = array();
     270                while ( $row = $this->result->fetch_object() ) {
     271                        $ret[] = $row;
     272                }
     273                return $ret;
     274        }
     275
     276        /**
     277         * Load the column metadata from the last query.
     278         * @return array
     279         */
     280        public function load_col_info() {
     281                if ( $this->col_info )
     282                        return $this->col_info;
     283                for ( $i = 0; $i < $this->result->field_count ; $i++ ) {
     284                        $this->col_info[ $i ] = $this->result->fetch_field_direct( $i );
     285                }
     286                return $this->col_info;
     287        }
     288
     289        /**
     290         * The database version number.
     291         * @return false|string false on failure, version number on success
     292         */
     293        public function db_version() {
     294                return preg_replace( '/[^0-9.].*/', '', $this->dbh->server_version );
     295        }
     296}
     297 No newline at end of file
  • new file wp-includes/class.wp-db-driver-pdo_mysql.php

    diff --git wp-includes/class.wp-db-driver-pdo_mysql.php wp-includes/class.wp-db-driver-pdo_mysql.php
    new file mode 100644
    index 0000000..72fc717
    - +  
     1<?php
     2
     3/**
     4 * WordPress Database Access Abstraction Object
     5 *
     6 * It is possible to replace this class with your own
     7 * by setting the $wpdb global variable in wp-content/db.php
     8 * file to your class. The wpdb class will still be included,
     9 * so you can extend it or simply use your own.
     10 *
     11 * @link http://codex.wordpress.org/Function_Reference/wpdb_Class
     12 *
     13 * @package WordPress
     14 * @subpackage Database
     15 * @since 0.71
     16 */
     17class wpdb_driver_pdo_mysql implements wpdb_driver {
     18       
     19        /**
     20         * Database link
     21         * @var PDO
     22         */
     23        private $dbh = null;
     24       
     25        /**
     26         * Result set
     27         * @var PDOStatement
     28         */
     29        private $result = null;
     30       
     31        /**
     32         * Cached column info
     33         * @var array|null
     34         */
     35        private $col_info = null;
     36       
     37        /**
     38         * Array of fetched rows.
     39         * PDO doesn't have a "count rows" feature, so we have to fetch the rows
     40         * up front, and cache them here
     41         * @var array
     42         */
     43        private $fetched_rows = array();
     44
     45        /**
     46         * Escape with mysql_real_escape_string()
     47         * @param  string $string
     48         * @return string
     49         */
     50        public function escape( $string ) {
     51                return substr( $this->dbh->quote( $string ), 1, -1 );
     52        }
     53
     54        /**
     55         * Get the latest error message from the DB driver
     56         * @return string
     57         */
     58        public function get_error_message() {
     59                $error = $this->dbh->errorInfo();
     60                if ( isset( $error[2] ) ) {
     61                        return $error[2];
     62                }
     63                return '';
     64        }
     65
     66        /**
     67         * Free memory associated with the resultset
     68         * @return void
     69         */
     70        public function flush() {
     71                if ( $this->result instanceof PDOStatement ) {
     72                        $this->result->closeCursor();
     73                }
     74                $this->result = null;
     75                $this->col_info = null;
     76                $this->fetched_rows = array();
     77        }
     78
     79        /**
     80         * Connect to database
     81         * @return bool
     82         */
     83        public function connect( $host, $user, $pass, $port = 3306 ) {
     84                $dsn = sprintf( 'mysql:host=%1$s;port=%2$d', $host, $port );
     85                try {
     86                        $this->dbh = new PDO( $dsn, $user, $pass );
     87                } catch ( Exception $e ) {
     88                        return false;
     89                }
     90                return true;
     91        }
     92
     93        /**
     94         * Select database
     95         * @return void
     96         */
     97        public function select( $db ) {
     98                $this->dbh->exec( sprintf( 'USE %s', $db ) );
     99        }               
     100       
     101        /**
     102         * Perform a MySQL database query, using current database connection.
     103         * @param string $query Database query
     104         * @return int|false Number of rows affected/selected or false on error
     105         */
     106        public function query( $query ) {
     107                try {
     108                        $this->result = $this->dbh->query( $query );
     109                } catch ( Exception $e ) {
     110                }
     111                if ( preg_match( '/^\s*(create|alter|truncate|drop)\s/i', $query ) ) {
     112                        $return_val = $this->result;
     113                } elseif ( preg_match( '/^\s*(insert|delete|update|replace)\s/i', $query ) ) {
     114                        $return_val = $this->affected_rows();
     115                } elseif ( preg_match( '/^\s*select\s/i', $query ) ) {
     116                        $this->get_results();
     117                        return count( $this->fetched_rows );
     118                }
     119                return true;
     120        }
     121
     122        /**
     123         * Get number of rows affected
     124         * @return int
     125         */
     126        public function affected_rows() {
     127                if ( $this->result instanceof PDOStatement ) {
     128                        return $this->result->rowCount();
     129                }
     130                return 0;
     131        }
     132       
     133        /**
     134         * Get last insert id
     135         * @return int
     136         */
     137        public function insert_id() {
     138                return $this->dbh->lastInsertId();
     139        }
     140
     141        /**
     142         * Get results
     143         * @return array
     144         */
     145        public function get_results() {
     146                if ( !empty( $this->fetched_rows ) ) {
     147                        return $this->fetched_rows;
     148                }
     149                $this->fetched_rows = array();
     150                if ( !empty( $this->result ) ) {
     151                        while ( $row = $this->result->fetchObject() ) {
     152                                $this->fetched_rows[] = $row;
     153                        }
     154                }
     155                return $this->fetched_rows;
     156        }
     157
     158        /**
     159         * Load the column metadata from the last query.
     160         * @return array
     161         */
     162        public function load_col_info() {
     163                if ( $this->col_info )
     164                        return $this->col_info;
     165                for ( $i = 0; $i < $this->result->columnCount() ; $i++ ) {
     166                        $this->col_info[ $i ] = $this->result->fetchColumn( $i );
     167                }
     168                return $this->col_info;
     169        }
     170
     171        /**
     172         * The database version number.
     173         * @return false|string false on failure, version number on success
     174         */
     175        public function db_version() {
     176                return preg_replace( '/[^0-9.].*/', '', $this->dbh->getAttribute( PDO::ATTR_SERVER_VERSION ) );
     177        }
     178}
     179<?php
     180
     181/**
     182 * WordPress Database Access Abstraction Object
     183 *
     184 * It is possible to replace this class with your own
     185 * by setting the $wpdb global variable in wp-content/db.php
     186 * file to your class. The wpdb class will still be included,
     187 * so you can extend it or simply use your own.
     188 *
     189 * @link http://codex.wordpress.org/Function_Reference/wpdb_Class
     190 *
     191 * @package WordPress
     192 * @subpackage Database
     193 * @since 0.71
     194 */
     195class wpdb_driver_pdo_mysql implements wpdb_driver {
     196       
     197        /**
     198         * Database link
     199         * @var PDO
     200         */
     201        private $dbh = null;
     202       
     203        /**
     204         * Result set
     205         * @var PDOStatement
     206         */
     207        private $result = null;
     208       
     209        /**
     210         * Cached column info
     211         * @var array|null
     212         */
     213        private $col_info = null;
     214       
     215        /**
     216         * Array of fetched rows.
     217         * PDO doesn't have a "count rows" feature, so we have to fetch the rows
     218         * up front, and cache them here
     219         * @var array
     220         */
     221        private $fetched_rows = array();
     222
     223        /**
     224         * Escape with mysql_real_escape_string()
     225         * @param  string $string
     226         * @return string
     227         */
     228        public function escape( $string ) {
     229                return substr( $this->dbh->quote( $string ), 1, -1 );
     230        }
     231
     232        /**
     233         * Get the latest error message from the DB driver
     234         * @return string
     235         */
     236        public function get_error_message() {
     237                $error = $this->dbh->errorInfo();
     238                return $error[2];
     239        }
     240
     241        /**
     242         * Free memory associated with the resultset
     243         * @return void
     244         */
     245        public function flush() {
     246                if ( $this->result instanceof PDOStatement ) {
     247                        $this->result->closeCursor();
     248                }
     249                $this->result = null;
     250                $this->col_info = null;
     251                $this->fetched_rows = array();
     252        }
     253
     254        /**
     255         * Connect to database
     256         * @return bool
     257         */
     258        public function connect( $host, $user, $pass, $port = 3306 ) {
     259                $dsn = sprintf( 'mysql:host=%1$s;port=%2$d', $host, $port );
     260                try {
     261                        $this->dbh = new PDO( $dsn, $user, $pass );
     262                } catch ( Exception $e ) {
     263                        return false;
     264                }
     265                return true;
     266        }
     267
     268        /**
     269         * Select database
     270         * @return void
     271         */
     272        public function select( $db ) {
     273                $this->dbh->exec( sprintf( 'USE %s', $db ) );
     274        }               
     275       
     276        /**
     277         * Perform a MySQL database query, using current database connection.
     278         * @param string $query Database query
     279         * @return int|false Number of rows affected/selected or false on error
     280         */
     281        public function query( $query ) {
     282                try {
     283                        $this->result = $this->dbh->query( $query );
     284                } catch ( Exception $e ) {
     285                }
     286                if ( preg_match( '/^\s*(create|alter|truncate|drop)\s/i', $query ) ) {
     287                        $return_val = $this->result;
     288                } elseif ( preg_match( '/^\s*(insert|delete|update|replace)\s/i', $query ) ) {
     289                        $return_val = $this->affected_rows();
     290                } elseif ( preg_match( '/^\s*select\s/i', $query ) ) {
     291                        $this->get_results();
     292                        return count( $this->fetched_rows );
     293                }
     294                return true;
     295        }
     296
     297        /**
     298         * Get number of rows affected
     299         * @return int
     300         */
     301        public function affected_rows() {
     302                if ( $this->result instanceof PDOStatement ) {
     303                        return $this->result->rowCount();
     304                }
     305                return 0;
     306        }
     307       
     308        /**
     309         * Get last insert id
     310         * @return int
     311         */
     312        public function insert_id() {
     313                return $this->dbh->lastInsertId();
     314        }
     315
     316        /**
     317         * Get results
     318         * @return array
     319         */
     320        public function get_results() {
     321                if ( !empty( $this->fetched_rows ) ) {
     322                        return $this->fetched_rows;
     323                }
     324                $this->fetched_rows = array();
     325                if ( !empty( $this->result ) ) {
     326                        while ( $row = $this->result->fetchObject() ) {
     327                                $this->fetched_rows[] = $row;
     328                        }
     329                }
     330                return $this->fetched_rows;
     331        }
     332
     333        /**
     334         * Load the column metadata from the last query.
     335         * @return array
     336         */
     337        public function load_col_info() {
     338                if ( $this->col_info )
     339                        return $this->col_info;
     340                for ( $i = 0; $i < $this->result->columnCount() ; $i++ ) {
     341                        $this->col_info[ $i ] = $this->result->fetchColumn( $i );
     342                }
     343                return $this->col_info;
     344        }
     345
     346        /**
     347         * The database version number.
     348         * @return false|string false on failure, version number on success
     349         */
     350        public function db_version() {
     351                return preg_replace( '/[^0-9.].*/', '', $this->dbh->getAttribute( PDO::ATTR_SERVER_VERSION ) );
     352        }
     353}
     354 No newline at end of file
  • new file wp-includes/class.wp-db-driver.interface.php

    diff --git wp-includes/class.wp-db-driver.interface.php wp-includes/class.wp-db-driver.interface.php
    new file mode 100644
    index 0000000..f0b9199
    - +  
     1<?php
     2
     3interface wpdb_driver {
     4        public function escape( $string );
     5        public function get_error_message();
     6        public function flush();
     7        public function connect( $host, $user, $pass, $port = 3306 );
     8        public function select( $name );
     9        public function query( $query );
     10        public function load_col_info();
     11        public function db_version();
     12        public function affected_rows();
     13        public function insert_id();
     14        public function get_results();
     15}
     16<?php
     17
     18interface wpdb_driver {
     19        public function escape( $string );
     20        public function get_error_message();
     21        public function flush();
     22        public function connect( $host, $user, $pass, $port = 3306 );
     23        public function select( $name );
     24        public function query( $query );
     25        public function load_col_info();
     26        public function db_version();
     27        public function affected_rows();
     28        public function insert_id();
     29        public function get_results();
     30}
  • new file wp-includes/interface-wp-db-driver.php

    diff --git wp-includes/interface-wp-db-driver.php wp-includes/interface-wp-db-driver.php
    new file mode 100644
    index 0000000..8bb421a
    - +  
     1<?php
     2
     3interface wpdb_driver {
     4        public function escape( $string );
     5        public function get_error_message();
     6        public function flush();
     7        public function connect( $host, $user, $pass, $port = 3306 );
     8        public function select( $name );
     9        public function query( $query );
     10        public function load_col_info();
     11        public function db_version();
     12        public function affected_rows();
     13        public function insert_id();
     14        public function get_results();
     15}
  • wp-includes/load.php

    diff --git wp-includes/load.php wp-includes/load.php
    index 8a94962..552d579 100644
    function wp_check_php_mysql_versions() { 
    108108                die( sprintf( __( 'Your server is running PHP version %1$s but WordPress %2$s requires at least %3$s.' ), $php_version, $wp_version, $required_php_version ) );
    109109        }
    110110
    111         if ( ! extension_loaded( 'mysql' ) && ! file_exists( WP_CONTENT_DIR . '/db.php' ) ) {
     111        if ( ! extension_loaded( 'mysql' ) && ! extension_loaded( 'mysqli' ) && ! extension_loaded ( 'pdo_mysql' ) && ! file_exists( WP_CONTENT_DIR . '/db.php' ) ) {
    112112                wp_load_translations_early();
    113113                die( __( 'Your PHP installation appears to be missing the MySQL extension which is required by WordPress.' ) );
    114114        }
    function wp_set_lang_dir() { 
    326326function require_wp_db() {
    327327        global $wpdb;
    328328
     329        require( ABSPATH . WPINC . '/interface-wp-db-driver.php' );
    329330        require_once( ABSPATH . WPINC . '/wp-db.php' );
    330331        if ( file_exists( WP_CONTENT_DIR . '/db.php' ) )
    331332                require_once( WP_CONTENT_DIR . '/db.php' );
  • new file wp-includes/wp-db-driver-mysql.php

    diff --git wp-includes/wp-db-driver-mysql.php wp-includes/wp-db-driver-mysql.php
    new file mode 100644
    index 0000000..b89fe8f
    - +  
     1<?php
     2
     3/**
     4 * WordPress Database Access Abstraction Object
     5 *
     6 * It is possible to replace this class with your own
     7 * by setting the $wpdb global variable in wp-content/db.php
     8 * file to your class. The wpdb class will still be included,
     9 * so you can extend it or simply use your own.
     10 *
     11 * @link http://codex.wordpress.org/Function_Reference/wpdb_Class
     12 *
     13 * @package WordPress
     14 * @subpackage Database
     15 * @since 0.71
     16 */
     17class wpdb_driver_mysql implements wpdb_driver {
     18       
     19        /**
     20         * Database link
     21         * @var resource
     22         */
     23        private $dbh = null;
     24       
     25        /**
     26         * Result set
     27         * @var resource
     28         */
     29        private $result = null;
     30       
     31        /**
     32         * Cached column info
     33         * @var array|null
     34         */
     35        private $col_info = null;
     36       
     37        /**
     38         * Escape with mysql_real_escape_string()
     39         * @param  string $string
     40         * @return string
     41         */
     42        public function escape( $string ) {
     43                return mysql_real_escape_string( $string, $this->dbh );
     44        }
     45
     46        /**
     47         * Get the latest error message from the DB driver
     48         * @return string
     49         */
     50        public function get_error_message() {
     51                return mysql_error( $this->dbh );
     52        }
     53
     54        /**
     55         * Free memory associated with the resultset
     56         * @return void
     57         */
     58        public function flush() {
     59                if ( is_resource( $this->result ) ) {
     60                        mysql_free_result( $this->result );
     61                }
     62                $this->result = null;
     63                $this->col_info = null;
     64        }
     65
     66        /**
     67         * Connect to database
     68         * @return bool
     69         */
     70        public function connect( $host, $user, $pass, $port = 3306 ) {
     71               
     72                $new_link = defined( 'MYSQL_NEW_LINK' ) ? MYSQL_NEW_LINK : true;
     73                $client_flags = defined( 'MYSQL_CLIENT_FLAGS' ) ? MYSQL_CLIENT_FLAGS : 0;
     74
     75                if ( WP_DEBUG ) {
     76                        $this->dbh =  mysql_connect( "$host:$port", $user, $pass, $new_link, $client_flags );
     77                } else {
     78                        $this->dbh = @mysql_connect( "$host:$port", $user, $pass, $new_link, $client_flags );
     79                }
     80                return ( false !== $this->dbh );
     81        }
     82
     83        /**
     84         * Select database
     85         * @return void
     86         */
     87        public function select( $db ) {
     88                if ( WP_DEBUG ) {
     89                         mysql_select_db( $db, $this->dbh );
     90                } else {
     91                        @mysql_select_db( $db, $this->dbh );
     92                }
     93        }               
     94       
     95        /**
     96         * Perform a MySQL database query, using current database connection.
     97         * @param string $query Database query
     98         * @return int|false Number of rows affected/selected or false on error
     99         */
     100        public function query( $query ) {
     101                $this->result = @mysql_query( $query, $this->dbh );
     102                if ( preg_match( '/^\s*(create|alter|truncate|drop)\s/i', $query ) ) {
     103                        $return_val = $this->result;
     104                } elseif ( preg_match( '/^\s*(insert|delete|update|replace)\s/i', $query ) ) {
     105                        $return_val = $this->affected_rows();
     106                } elseif ( preg_match( '/^\s*select\s/i', $query ) ) {
     107                        return is_resource( $this->result ) ? mysql_num_rows( $this->result ) : false ;
     108                }
     109                return true;
     110        }
     111
     112        /**
     113         * Get number of rows affected
     114         * @return int
     115         */
     116        public function affected_rows() {
     117                return mysql_affected_rows( $this->dbh );
     118        }
     119       
     120        /**
     121         * Get last insert id
     122         * @return int
     123         */
     124        public function insert_id() {
     125                return mysql_insert_id( $this->dbh );
     126        }
     127
     128        /**
     129         * Get results
     130         * @return array
     131         */
     132        public function get_results() {
     133                $ret = array();
     134                while ( $row = @mysql_fetch_object( $this->result ) ) {
     135                        $ret[] = $row;
     136                }
     137                return $ret;
     138        }
     139
     140        /**
     141         * Load the column metadata from the last query.
     142         * @return array
     143         */
     144        public function load_col_info() {
     145                if ( $this->col_info )
     146                        return $this->col_info;
     147                for ( $i = 0; $i < @mysql_num_fields( $this->result ); $i++ ) {
     148                        $this->col_info[ $i ] = @mysql_fetch_field( $this->result, $i );
     149                }
     150                return $this->col_info;
     151        }
     152
     153        /**
     154         * The database version number.
     155         * @return false|string false on failure, version number on success
     156         */
     157        public function db_version() {
     158                return preg_replace( '/[^0-9.].*/', '', mysql_get_server_info( $this->dbh ) );
     159        }
     160}
     161<?php
     162
     163/**
     164 * WordPress Database Access Abstraction Object
     165 *
     166 * It is possible to replace this class with your own
     167 * by setting the $wpdb global variable in wp-content/db.php
     168 * file to your class. The wpdb class will still be included,
     169 * so you can extend it or simply use your own.
     170 *
     171 * @link http://codex.wordpress.org/Function_Reference/wpdb_Class
     172 *
     173 * @package WordPress
     174 * @subpackage Database
     175 * @since 0.71
     176 */
     177class wpdb_driver_mysql implements wpdb_driver {
     178       
     179        /**
     180         * Database link
     181         * @var resource
     182         */
     183        private $dbh = null;
     184       
     185        /**
     186         * Result set
     187         * @var resource
     188         */
     189        private $result = null;
     190       
     191        /**
     192         * Cached column info
     193         * @var array|null
     194         */
     195        private $col_info = null;
     196       
     197        /**
     198         * Escape with mysql_real_escape_string()
     199         * @param  string $string
     200         * @return string
     201         */
     202        public function escape( $string ) {
     203                return mysql_real_escape_string( $string, $this->dbh );
     204        }
     205
     206        /**
     207         * Get the latest error message from the DB driver
     208         * @return string
     209         */
     210        public function get_error_message() {
     211                return mysql_error( $this->dbh );
     212        }
     213
     214        /**
     215         * Free memory associated with the resultset
     216         * @return void
     217         */
     218        public function flush() {
     219                if ( is_resource( $this->result ) ) {
     220                        mysql_free_result( $this->result );
     221                }
     222                $this->result = null;
     223                $this->col_info = null;
     224        }
     225
     226        /**
     227         * Connect to database
     228         * @return bool
     229         */
     230        public function connect( $host, $user, $pass, $port = 3306 ) {
     231               
     232                $new_link = defined( 'MYSQL_NEW_LINK' ) ? MYSQL_NEW_LINK : true;
     233                $client_flags = defined( 'MYSQL_CLIENT_FLAGS' ) ? MYSQL_CLIENT_FLAGS : 0;
     234
     235                if ( WP_DEBUG ) {
     236                        $this->dbh =  mysql_connect( "$host:$port", $user, $pass, $new_link, $client_flags );
     237                } else {
     238                        $this->dbh = @mysql_connect( "$host:$port", $user, $pass, $new_link, $client_flags );
     239                }
     240                return ( false !== $this->dbh );
     241        }
     242
     243        /**
     244         * Select database
     245         * @return void
     246         */
     247        public function select( $db ) {
     248                if ( WP_DEBUG ) {
     249                         mysql_select_db( $db, $this->dbh );
     250                } else {
     251                        @mysql_select_db( $db, $this->dbh );
     252                }
     253        }               
     254       
     255        /**
     256         * Perform a MySQL database query, using current database connection.
     257         * @param string $query Database query
     258         * @return int|false Number of rows affected/selected or false on error
     259         */
     260        public function query( $query ) {
     261                $this->result = @mysql_query( $query, $this->dbh );
     262                if ( preg_match( '/^\s*(create|alter|truncate|drop)\s/i', $query ) ) {
     263                        $return_val = $this->result;
     264                } elseif ( preg_match( '/^\s*(insert|delete|update|replace)\s/i', $query ) ) {
     265                        $return_val = $this->affected_rows();
     266                } elseif ( preg_match( '/^\s*select\s/i', $query ) ) {
     267                        return mysql_num_rows( $this->result );
     268                }
     269                return true;
     270        }
     271
     272        /**
     273         * Get number of rows affected
     274         * @return int
     275         */
     276        public function affected_rows() {
     277                return mysql_affected_rows( $this->dbh );
     278        }
     279       
     280        /**
     281         * Get last insert id
     282         * @return int
     283         */
     284        public function insert_id() {
     285                return mysql_insert_id( $this->dbh );
     286        }
     287
     288        /**
     289         * Get results
     290         * @return array
     291         */
     292        public function get_results() {
     293                $ret = array();
     294                while ( $row = @mysql_fetch_object( $this->result ) ) {
     295                        $ret[] = $row;
     296                }
     297                return $ret;
     298        }
     299
     300        /**
     301         * Load the column metadata from the last query.
     302         * @return array
     303         */
     304        public function load_col_info() {
     305                if ( $this->col_info )
     306                        return $this->col_info;
     307                for ( $i = 0; $i < @mysql_num_fields( $this->result ); $i++ ) {
     308                        $this->col_info[ $i ] = @mysql_fetch_field( $this->result, $i );
     309                }
     310                return $this->col_info;
     311        }
     312
     313        /**
     314         * The database version number.
     315         * @return false|string false on failure, version number on success
     316         */
     317        public function db_version() {
     318                return preg_replace( '/[^0-9.].*/', '', mysql_get_server_info( $this->dbh ) );
     319        }
     320}
     321<?php
     322
     323/**
     324 * WordPress Database Access Abstraction Object
     325 *
     326 * It is possible to replace this class with your own
     327 * by setting the $wpdb global variable in wp-content/db.php
     328 * file to your class. The wpdb class will still be included,
     329 * so you can extend it or simply use your own.
     330 *
     331 * @link http://codex.wordpress.org/Function_Reference/wpdb_Class
     332 *
     333 * @package WordPress
     334 * @subpackage Database
     335 * @since 0.71
     336 */
     337class wpdb_driver_mysql implements wpdb_driver {
     338       
     339        /**
     340         * Database link
     341         * @var resource
     342         */
     343        private $dbh = null;
     344       
     345        /**
     346         * Result set
     347         * @var resource
     348         */
     349        private $result = null;
     350       
     351        /**
     352         * Cached column info
     353         * @var array|null
     354         */
     355        private $col_info = null;
     356       
     357        /**
     358         * Escape with mysql_real_escape_string()
     359         * @param  string $string
     360         * @return string
     361         */
     362        public function escape( $string ) {
     363                return mysql_real_escape_string( $string, $this->dbh );
     364        }
     365
     366        /**
     367         * Get the latest error message from the DB driver
     368         * @return string
     369         */
     370        public function get_error_message() {
     371                return mysql_error( $this->dbh );
     372        }
     373
     374        /**
     375         * Free memory associated with the resultset
     376         * @return void
     377         */
     378        public function flush() {
     379                if ( is_resource( $this->result ) ) {
     380                        mysql_free_result( $this->result );
     381                }
     382                $this->result = null;
     383                $this->col_info = null;
     384        }
     385
     386        /**
     387         * Connect to database
     388         * @return bool
     389         */
     390        public function connect( $host, $user, $pass, $port = 3306 ) {
     391                if ( WP_DEBUG ) {
     392                        $this->dbh =  mysql_connect( $host, $user, $pass, true );
     393                } else {
     394                        $this->dbh = @mysql_connect( $host, $user, $pass, true );
     395                }
     396                return ( false !== $this->dbh );
     397        }
     398
     399        /**
     400         * Select database
     401         * @return void
     402         */
     403        public function select( $db ) {
     404                if ( WP_DEBUG ) {
     405                         mysql_select_db( $db, $this->dbh );
     406                } else {
     407                        @mysql_select_db( $db, $this->dbh );
     408                }
     409        }               
     410       
     411        /**
     412         * Perform a MySQL database query, using current database connection.
     413         * @param string $query Database query
     414         * @return int|false Number of rows affected/selected or false on error
     415         */
     416        public function query( $query ) {
     417                $this->result = @mysql_query( $query, $this->dbh );
     418                if ( preg_match( '/^\s*(create|alter|truncate|drop)\s/i', $query ) ) {
     419                        $return_val = $this->result;
     420                } elseif ( preg_match( '/^\s*(insert|delete|update|replace)\s/i', $query ) ) {
     421                        $return_val = $this->affected_rows();
     422                } elseif ( preg_match( '/^\s*select\s/i', $query ) ) {
     423                        return mysql_num_rows( $this->result );
     424                }
     425                return true;
     426        }
     427
     428        /**
     429         * Get number of rows affected
     430         * @return int
     431         */
     432        public function affected_rows() {
     433                return mysql_affected_rows( $this->dbh );
     434        }
     435       
     436        /**
     437         * Get last insert id
     438         * @return int
     439         */
     440        public function insert_id() {
     441                return mysql_insert_id( $this->dbh );
     442        }
     443
     444        /**
     445         * Get results
     446         * @return array
     447         */
     448        public function get_results() {
     449                $ret = array();
     450                while ( $row = @mysql_fetch_object( $this->result ) ) {
     451                        $ret[] = $row;
     452                }
     453                return $ret;
     454        }
     455
     456        /**
     457         * Load the column metadata from the last query.
     458         * @return array
     459         */
     460        public function load_col_info() {
     461                if ( $this->col_info )
     462                        return $this->col_info;
     463                for ( $i = 0; $i < @mysql_num_fields( $this->result ); $i++ ) {
     464                        $this->col_info[ $i ] = @mysql_fetch_field( $this->result, $i );
     465                }
     466                return $this->col_info;
     467        }
     468
     469        /**
     470         * The database version number.
     471         * @return false|string false on failure, version number on success
     472         */
     473        public function db_version() {
     474                return preg_replace( '/[^0-9.].*/', '', mysql_get_server_info( $this->dbh ) );
     475        }
     476}
     477 No newline at end of file
  • new file wp-includes/wp-db-driver-mysqli.php

    diff --git wp-includes/wp-db-driver-mysqli.php wp-includes/wp-db-driver-mysqli.php
    new file mode 100644
    index 0000000..fc028c5
    - +  
     1<?php
     2
     3/**
     4 * WordPress Database Access Abstraction Object
     5 *
     6 * It is possible to replace this class with your own
     7 * by setting the $wpdb global variable in wp-content/db.php
     8 * file to your class. The wpdb class will still be included,
     9 * so you can extend it or simply use your own.
     10 *
     11 * @link http://codex.wordpress.org/Function_Reference/wpdb_Class
     12 *
     13 * @package WordPress
     14 * @subpackage Database
     15 * @since 0.71
     16 */
     17class wpdb_driver_mysqli implements wpdb_driver {
     18       
     19        /**
     20         * Database link
     21         * @var mysqli
     22         */
     23        private $dbh = null;
     24       
     25        /**
     26         * Result set
     27         * @var mysqli_stmt|mysqli_result
     28         */
     29        private $result = null;
     30       
     31        /**
     32         * Cached column info
     33         * @var array|null
     34         */
     35        private $col_info = null;
     36       
     37        /**
     38         * Escape with mysql_real_escape_string()
     39         * @param  string $string
     40         * @return string
     41         */
     42        public function escape( $string ) {
     43                return $this->dbh->escape_string( $string );
     44        }
     45
     46        /**
     47         * Get the latest error message from the DB driver
     48         * @return string
     49         */
     50        public function get_error_message() {
     51                return $this->dbh->error;
     52        }
     53
     54        /**
     55         * Free memory associated with the resultset
     56         * @return void
     57         */
     58        public function flush() {
     59                if ( $this->result instanceof mysqli_stmt ) {
     60                        $this->result->free_result();
     61                }
     62                $this->result = null;
     63                $this->col_info = null;
     64        }
     65
     66        /**
     67         * Connect to database
     68         * @return bool
     69         */
     70        public function connect( $host, $user, $pass, $port = 3306 ) {         
     71                $this->dbh = new mysqli( $host, $user, $pass, '', $port );
     72                return ( !mysqli_connect_error() );
     73        }
     74
     75        /**
     76         * Select database
     77         * @return void
     78         */
     79        public function select( $db ) {
     80                $this->dbh->select_db( $db );
     81        }               
     82       
     83        /**
     84         * Perform a MySQL database query, using current database connection.
     85         * @param string $query Database query
     86         * @return int|false Number of rows affected/selected or false on error
     87         */
     88        public function query( $query ) {
     89                $this->result = $this->dbh->query( $query );
     90                if ( preg_match( '/^\s*(create|alter|truncate|drop)\s/i', $query ) ) {
     91                        $return_val = $this->result;
     92                } elseif ( preg_match( '/^\s*(insert|delete|update|replace)\s/i', $query ) ) {
     93                        $return_val = $this->affected_rows();
     94                } elseif ( preg_match( '/^\s*select\s/i', $query ) ) {
     95                        return $this->result->num_rows;
     96                }
     97                return true;
     98        }
     99
     100        /**
     101         * Get number of rows affected
     102         * @return int
     103         */
     104        public function affected_rows() {
     105                return $this->dbh->affected_rows;
     106        }
     107       
     108        /**
     109         * Get last insert id
     110         * @return int
     111         */
     112        public function insert_id() {
     113                return $this->dbh->insert_id;
     114        }
     115
     116        /**
     117         * Get results
     118         * @return array
     119         */
     120        public function get_results() {
     121                $ret = array();
     122                while ( $row = $this->result->fetch_object() ) {
     123                        $ret[] = $row;
     124                }
     125                return $ret;
     126        }
     127
     128        /**
     129         * Load the column metadata from the last query.
     130         * @return array
     131         */
     132        public function load_col_info() {
     133                if ( $this->col_info )
     134                        return $this->col_info;
     135                for ( $i = 0; $i < $this->result->field_count ; $i++ ) {
     136                        $this->col_info[ $i ] = $this->result->fetch_field_direct( $i );
     137                }
     138                return $this->col_info;
     139        }
     140
     141        /**
     142         * The database version number.
     143         * @return false|string false on failure, version number on success
     144         */
     145        public function db_version() {
     146                return preg_replace( '/[^0-9.].*/', '', $this->dbh->server_version );
     147        }
     148}
     149<?php
     150
     151/**
     152 * WordPress Database Access Abstraction Object
     153 *
     154 * It is possible to replace this class with your own
     155 * by setting the $wpdb global variable in wp-content/db.php
     156 * file to your class. The wpdb class will still be included,
     157 * so you can extend it or simply use your own.
     158 *
     159 * @link http://codex.wordpress.org/Function_Reference/wpdb_Class
     160 *
     161 * @package WordPress
     162 * @subpackage Database
     163 * @since 0.71
     164 */
     165class wpdb_driver_mysqli implements wpdb_driver {
     166       
     167        /**
     168         * Database link
     169         * @var mysqli
     170         */
     171        private $dbh = null;
     172       
     173        /**
     174         * Result set
     175         * @var mysqli_stmt|mysqli_result
     176         */
     177        private $result = null;
     178       
     179        /**
     180         * Cached column info
     181         * @var array|null
     182         */
     183        private $col_info = null;
     184       
     185        /**
     186         * Escape with mysql_real_escape_string()
     187         * @param  string $string
     188         * @return string
     189         */
     190        public function escape( $string ) {
     191                return $this->dbh->escape_string( $string );
     192        }
     193
     194        /**
     195         * Get the latest error message from the DB driver
     196         * @return string
     197         */
     198        public function get_error_message() {
     199                return $this->dbh->error;
     200        }
     201
     202        /**
     203         * Free memory associated with the resultset
     204         * @return void
     205         */
     206        public function flush() {
     207                if ( $this->result instanceof mysqli_stmt ) {
     208                        $this->result->free_result();
     209                }
     210                $this->result = null;
     211                $this->col_info = null;
     212        }
     213
     214        /**
     215         * Connect to database
     216         * @return bool
     217         */
     218        public function connect( $host, $user, $pass, $port = 3306 ) {         
     219                $this->dbh = new mysqli( $host, $user, $pass, '', $port );
     220                return ( !mysqli_connect_error() );
     221        }
     222
     223        /**
     224         * Select database
     225         * @return void
     226         */
     227        public function select( $db ) {
     228                $this->dbh->select_db( $db );
     229        }               
     230       
     231        /**
     232         * Perform a MySQL database query, using current database connection.
     233         * @param string $query Database query
     234         * @return int|false Number of rows affected/selected or false on error
     235         */
     236        public function query( $query ) {
     237                $this->result = $this->dbh->query( $query );
     238                if ( preg_match( '/^\s*(create|alter|truncate|drop)\s/i', $query ) ) {
     239                        $return_val = $this->result;
     240                } elseif ( preg_match( '/^\s*(insert|delete|update|replace)\s/i', $query ) ) {
     241                        $return_val = $this->affected_rows();
     242                } elseif ( preg_match( '/^\s*select\s/i', $query ) ) {
     243                        return $this->result->num_rows;
     244                }
     245                return true;
     246        }
     247
     248        /**
     249         * Get number of rows affected
     250         * @return int
     251         */
     252        public function affected_rows() {
     253                return $this->dbh->affected_rows;
     254        }
     255       
     256        /**
     257         * Get last insert id
     258         * @return int
     259         */
     260        public function insert_id() {
     261                return $this->dbh->insert_id;
     262        }
     263
     264        /**
     265         * Get results
     266         * @return array
     267         */
     268        public function get_results() {
     269                $ret = array();
     270                while ( $row = $this->result->fetch_object() ) {
     271                        $ret[] = $row;
     272                }
     273                return $ret;
     274        }
     275
     276        /**
     277         * Load the column metadata from the last query.
     278         * @return array
     279         */
     280        public function load_col_info() {
     281                if ( $this->col_info )
     282                        return $this->col_info;
     283                for ( $i = 0; $i < $this->result->field_count ; $i++ ) {
     284                        $this->col_info[ $i ] = $this->result->fetch_field_direct( $i );
     285                }
     286                return $this->col_info;
     287        }
     288
     289        /**
     290         * The database version number.
     291         * @return false|string false on failure, version number on success
     292         */
     293        public function db_version() {
     294                return preg_replace( '/[^0-9.].*/', '', $this->dbh->server_version );
     295        }
     296}
     297<?php
     298
     299/**
     300 * WordPress Database Access Abstraction Object
     301 *
     302 * It is possible to replace this class with your own
     303 * by setting the $wpdb global variable in wp-content/db.php
     304 * file to your class. The wpdb class will still be included,
     305 * so you can extend it or simply use your own.
     306 *
     307 * @link http://codex.wordpress.org/Function_Reference/wpdb_Class
     308 *
     309 * @package WordPress
     310 * @subpackage Database
     311 * @since 0.71
     312 */
     313class wpdb_driver_mysqli implements wpdb_driver {
     314       
     315        /**
     316         * Database link
     317         * @var mysqli
     318         */
     319        private $dbh = null;
     320       
     321        /**
     322         * Result set
     323         * @var mysqli_stmt|mysqli_result
     324         */
     325        private $result = null;
     326       
     327        /**
     328         * Cached column info
     329         * @var array|null
     330         */
     331        private $col_info = null;
     332       
     333        /**
     334         * Escape with mysql_real_escape_string()
     335         * @param  string $string
     336         * @return string
     337         */
     338        public function escape( $string ) {
     339                return $this->dbh->escape_string( $string );
     340        }
     341
     342        /**
     343         * Get the latest error message from the DB driver
     344         * @return string
     345         */
     346        public function get_error_message() {
     347                return $this->dbh->error;
     348        }
     349
     350        /**
     351         * Free memory associated with the resultset
     352         * @return void
     353         */
     354        public function flush() {
     355                if ( $this->result instanceof mysqli_stmt ) {
     356                        $this->result->free_result();
     357                }
     358                $this->result = null;
     359                $this->col_info = null;
     360        }
     361
     362        /**
     363         * Connect to database
     364         * @return bool
     365         */
     366        public function connect( $host, $user, $pass, $port = 3306 ) {
     367                $this->dbh = new mysqli( $host, $user, $pass, '', $port );
     368                return ( !mysqli_connect_error() );
     369        }
     370
     371        /**
     372         * Select database
     373         * @return void
     374         */
     375        public function select( $db ) {
     376                $this->dbh->select_db( $db );
     377        }               
     378       
     379        /**
     380         * Perform a MySQL database query, using current database connection.
     381         * @param string $query Database query
     382         * @return int|false Number of rows affected/selected or false on error
     383         */
     384        public function query( $query ) {
     385                $this->result = $this->dbh->query( $query );
     386                if ( preg_match( '/^\s*(create|alter|truncate|drop)\s/i', $query ) ) {
     387                        $return_val = $this->result;
     388                } elseif ( preg_match( '/^\s*(insert|delete|update|replace)\s/i', $query ) ) {
     389                        $return_val = $this->affected_rows();
     390                } elseif ( preg_match( '/^\s*select\s/i', $query ) ) {
     391                        return $this->result->num_rows;
     392                }
     393                return true;
     394        }
     395
     396        /**
     397         * Get number of rows affected
     398         * @return int
     399         */
     400        public function affected_rows() {
     401                return $this->dbh->affected_rows;
     402        }
     403       
     404        /**
     405         * Get last insert id
     406         * @return int
     407         */
     408        public function insert_id() {
     409                return $this->dbh->insert_id;
     410        }
     411
     412        /**
     413         * Get results
     414         * @return array
     415         */
     416        public function get_results() {
     417                $ret = array();
     418                while ( $row = $this->result->fetch_object() ) {
     419                        $ret[] = $row;
     420                }
     421                return $ret;
     422        }
     423
     424        /**
     425         * Load the column metadata from the last query.
     426         * @return array
     427         */
     428        public function load_col_info() {
     429                if ( $this->col_info )
     430                        return $this->col_info;
     431                for ( $i = 0; $i < $this->result->field_count ; $i++ ) {
     432                        $this->col_info[ $i ] = $this->result->fetch_field_direct( $i );
     433                }
     434                return $this->col_info;
     435        }
     436
     437        /**
     438         * The database version number.
     439         * @return false|string false on failure, version number on success
     440         */
     441        public function db_version() {
     442                return preg_replace( '/[^0-9.].*/', '', $this->dbh->server_version );
     443        }
     444}
     445 No newline at end of file
  • new file wp-includes/wp-db-driver-pdo_mysql.php

    diff --git wp-includes/wp-db-driver-pdo_mysql.php wp-includes/wp-db-driver-pdo_mysql.php
    new file mode 100644
    index 0000000..b8850bd
    - +  
     1<?php
     2
     3/**
     4 * WordPress Database Access Abstraction Object
     5 *
     6 * It is possible to replace this class with your own
     7 * by setting the $wpdb global variable in wp-content/db.php
     8 * file to your class. The wpdb class will still be included,
     9 * so you can extend it or simply use your own.
     10 *
     11 * @link http://codex.wordpress.org/Function_Reference/wpdb_Class
     12 *
     13 * @package WordPress
     14 * @subpackage Database
     15 * @since 0.71
     16 */
     17class wpdb_driver_pdo_mysql implements wpdb_driver {
     18       
     19        /**
     20         * Database link
     21         * @var PDO
     22         */
     23        private $dbh = null;
     24       
     25        /**
     26         * Result set
     27         * @var PDOStatement
     28         */
     29        private $result = null;
     30       
     31        /**
     32         * Cached column info
     33         * @var array|null
     34         */
     35        private $col_info = null;
     36       
     37        /**
     38         * Array of fetched rows.
     39         * PDO doesn't have a "count rows" feature, so we have to fetch the rows
     40         * up front, and cache them here
     41         * @var array
     42         */
     43        private $fetched_rows = array();
     44
     45        /**
     46         * Escape with mysql_real_escape_string()
     47         * @param  string $string
     48         * @return string
     49         */
     50        public function escape( $string ) {
     51                return substr( $this->dbh->quote( $string ), 1, -1 );
     52        }
     53
     54        /**
     55         * Get the latest error message from the DB driver
     56         * @return string
     57         */
     58        public function get_error_message() {
     59                $error = $this->dbh->errorInfo();
     60                return $error[2];
     61        }
     62
     63        /**
     64         * Free memory associated with the resultset
     65         * @return void
     66         */
     67        public function flush() {
     68                if ( $this->result instanceof PDOStatement ) {
     69                        $this->result->closeCursor();
     70                }
     71                $this->result = null;
     72                $this->col_info = null;
     73                $this->fetched_rows = array();
     74        }
     75
     76        /**
     77         * Connect to database
     78         * @return bool
     79         */
     80        public function connect( $host, $user, $pass, $port = 3306 ) {
     81                $dsn = sprintf( 'mysql:host=%1$s;port=%2$d', $host, $port );
     82                try {
     83                        $this->dbh = new PDO( $dsn, $user, $pass );
     84                } catch ( Exception $e ) {
     85                        return false;
     86                }
     87                return true;
     88        }
     89
     90        /**
     91         * Select database
     92         * @return void
     93         */
     94        public function select( $db ) {
     95                $this->dbh->exec( sprintf( 'USE %s', $db ) );
     96        }               
     97       
     98        /**
     99         * Perform a MySQL database query, using current database connection.
     100         * @param string $query Database query
     101         * @return int|false Number of rows affected/selected or false on error
     102         */
     103        public function query( $query ) {
     104                try {
     105                        $this->result = $this->dbh->query( $query );
     106                } catch ( Exception $e ) {
     107                }
     108                if ( preg_match( '/^\s*(create|alter|truncate|drop)\s/i', $query ) ) {
     109                        $return_val = $this->result;
     110                } elseif ( preg_match( '/^\s*(insert|delete|update|replace)\s/i', $query ) ) {
     111                        $return_val = $this->affected_rows();
     112                } elseif ( preg_match( '/^\s*select\s/i', $query ) ) {
     113                        $this->get_results();
     114                        return count( $this->fetched_rows );
     115                }
     116                return true;
     117        }
     118
     119        /**
     120         * Get number of rows affected
     121         * @return int
     122         */
     123        public function affected_rows() {
     124                return $this->result->rowCount();
     125        }
     126       
     127        /**
     128         * Get last insert id
     129         * @return int
     130         */
     131        public function insert_id() {
     132                return $this->dbh->lastInsertId();
     133        }
     134
     135        /**
     136         * Get results
     137         * @return array
     138         */
     139        public function get_results() {
     140                if ( !empty( $this->fetched_rows ) ) {
     141                        return $this->fetched_rows;
     142                }
     143                $this->fetched_rows = array();
     144                while ( $row = $this->result->fetchObject() ) {
     145                        $this->fetched_rows[] = $row;
     146                }
     147                return $this->fetched_rows;
     148        }
     149
     150        /**
     151         * Load the column metadata from the last query.
     152         * @return array
     153         */
     154        public function load_col_info() {
     155                if ( $this->col_info )
     156                        return $this->col_info;
     157                for ( $i = 0; $i < $this->result->columnCount() ; $i++ ) {
     158                        $this->col_info[ $i ] = $this->result->fetchColumn( $i );
     159                }
     160                return $this->col_info;
     161        }
     162
     163        /**
     164         * The database version number.
     165         * @return false|string false on failure, version number on success
     166         */
     167        public function db_version() {
     168                return preg_replace( '/[^0-9.].*/', '', $this->dbh->getAttribute( PDO::ATTR_SERVER_VERSION ) );
     169        }
     170}
     171<?php
     172
     173/**
     174 * WordPress Database Access Abstraction Object
     175 *
     176 * It is possible to replace this class with your own
     177 * by setting the $wpdb global variable in wp-content/db.php
     178 * file to your class. The wpdb class will still be included,
     179 * so you can extend it or simply use your own.
     180 *
     181 * @link http://codex.wordpress.org/Function_Reference/wpdb_Class
     182 *
     183 * @package WordPress
     184 * @subpackage Database
     185 * @since 0.71
     186 */
     187class wpdb_driver_pdo_mysql implements wpdb_driver {
     188       
     189        /**
     190         * Database link
     191         * @var PDO
     192         */
     193        private $dbh = null;
     194       
     195        /**
     196         * Result set
     197         * @var PDOStatement
     198         */
     199        private $result = null;
     200       
     201        /**
     202         * Cached column info
     203         * @var array|null
     204         */
     205        private $col_info = null;
     206       
     207        /**
     208         * Array of fetched rows.
     209         * PDO doesn't have a "count rows" feature, so we have to fetch the rows
     210         * up front, and cache them here
     211         * @var array
     212         */
     213        private $fetched_rows = array();
     214
     215        /**
     216         * Escape with mysql_real_escape_string()
     217         * @param  string $string
     218         * @return string
     219         */
     220        public function escape( $string ) {
     221                return substr( $this->dbh->quote( $string ), 1, -1 );
     222        }
     223
     224        /**
     225         * Get the latest error message from the DB driver
     226         * @return string
     227         */
     228        public function get_error_message() {
     229                $error = $this->dbh->errorInfo();
     230                return $error[2];
     231        }
     232
     233        /**
     234         * Free memory associated with the resultset
     235         * @return void
     236         */
     237        public function flush() {
     238                if ( $this->result instanceof PDOStatement ) {
     239                        $this->result->closeCursor();
     240                }
     241                $this->result = null;
     242                $this->col_info = null;
     243                $this->fetched_rows = array();
     244        }
     245
     246        /**
     247         * Connect to database
     248         * @return bool
     249         */
     250        public function connect( $host, $user, $pass, $port = 3306 ) {
     251                $dsn = sprintf( 'mysql:host=%1$s;port=%2$d', $host, $port );
     252                try {
     253                        $this->dbh = new PDO( $dsn, $user, $pass );
     254                } catch ( Exception $e ) {
     255                        return false;
     256                }
     257                return true;
     258        }
     259
     260        /**
     261         * Select database
     262         * @return void
     263         */
     264        public function select( $db ) {
     265                $this->dbh->exec( sprintf( 'USE %s', $db ) );
     266        }               
     267       
     268        /**
     269         * Perform a MySQL database query, using current database connection.
     270         * @param string $query Database query
     271         * @return int|false Number of rows affected/selected or false on error
     272         */
     273        public function query( $query ) {
     274                try {
     275                        $this->result = $this->dbh->query( $query );
     276                } catch ( Exception $e ) {
     277                }
     278                if ( preg_match( '/^\s*(create|alter|truncate|drop)\s/i', $query ) ) {
     279                        $return_val = $this->result;
     280                } elseif ( preg_match( '/^\s*(insert|delete|update|replace)\s/i', $query ) ) {
     281                        $return_val = $this->affected_rows();
     282                } elseif ( preg_match( '/^\s*select\s/i', $query ) ) {
     283                        $this->get_results();
     284                        return count( $this->fetched_rows );
     285                }
     286                return true;
     287        }
     288
     289        /**
     290         * Get number of rows affected
     291         * @return int
     292         */
     293        public function affected_rows() {
     294                return $this->result->rowCount();
     295        }
     296       
     297        /**
     298         * Get last insert id
     299         * @return int
     300         */
     301        public function insert_id() {
     302                return $this->dbh->lastInsertId();
     303        }
     304
     305        /**
     306         * Get results
     307         * @return array
     308         */
     309        public function get_results() {
     310                if ( !empty( $this->fetched_rows ) ) {
     311                        return $this->fetched_rows;
     312                }
     313                $this->fetched_rows = array();
     314                while ( $row = $this->result->fetchObject() ) {
     315                        $this->fetched_rows[] = $row;
     316                }
     317                return $this->fetched_rows;
     318        }
     319
     320        /**
     321         * Load the column metadata from the last query.
     322         * @return array
     323         */
     324        public function load_col_info() {
     325                if ( $this->col_info )
     326                        return $this->col_info;
     327                for ( $i = 0; $i < $this->result->columnCount() ; $i++ ) {
     328                        $this->col_info[ $i ] = $this->result->fetchColumn( $i );
     329                }
     330                return $this->col_info;
     331        }
     332
     333        /**
     334         * The database version number.
     335         * @return false|string false on failure, version number on success
     336         */
     337        public function db_version() {
     338                return preg_replace( '/[^0-9.].*/', '', $this->dbh->getAttribute( PDO::ATTR_SERVER_VERSION ) );
     339        }
     340}
     341<?php
     342
     343/**
     344 * WordPress Database Access Abstraction Object
     345 *
     346 * It is possible to replace this class with your own
     347 * by setting the $wpdb global variable in wp-content/db.php
     348 * file to your class. The wpdb class will still be included,
     349 * so you can extend it or simply use your own.
     350 *
     351 * @link http://codex.wordpress.org/Function_Reference/wpdb_Class
     352 *
     353 * @package WordPress
     354 * @subpackage Database
     355 * @since 0.71
     356 */
     357class wpdb_driver_pdo_mysql implements wpdb_driver {
     358       
     359        /**
     360         * Database link
     361         * @var PDO
     362         */
     363        private $dbh = null;
     364       
     365        /**
     366         * Result set
     367         * @var PDOStatement
     368         */
     369        private $result = null;
     370       
     371        /**
     372         * Cached column info
     373         * @var array|null
     374         */
     375        private $col_info = null;
     376       
     377        /**
     378         * Array of fetched rows.
     379         * PDO doesn't have a "count rows" feature, so we have to fetch the rows
     380         * up front, and cache them here
     381         * @var array
     382         */
     383        private $fetched_rows = array();
     384
     385        /**
     386         * Escape with mysql_real_escape_string()
     387         * @param  string $string
     388         * @return string
     389         */
     390        public function escape( $string ) {
     391                return substr( $this->dbh->quote( $string ), 1, -1 );
     392        }
     393
     394        /**
     395         * Get the latest error message from the DB driver
     396         * @return string
     397         */
     398        public function get_error_message() {
     399                $error = $this->dbh->errorInfo();
     400                return $error[2];
     401        }
     402
     403        /**
     404         * Free memory associated with the resultset
     405         * @return void
     406         */
     407        public function flush() {
     408                if ( $this->result instanceof PDOStatement ) {
     409                        $this->result->closeCursor();
     410                }
     411                $this->result = null;
     412                $this->col_info = null;
     413                $this->fetched_rows = array();
     414        }
     415
     416        /**
     417         * Connect to database
     418         * @return bool
     419         */
     420        public function connect( $host, $user, $pass, $port = 3306 ) {
     421                $dsn = sprintf( 'mysql:host=%1$s;port=%2$d', $host, $port );
     422                try {
     423                        $this->dbh = new PDO( $dsn, $user, $pass );
     424                } catch ( Exception $e ) {
     425                        return false;
     426                }
     427                return true;
     428        }
     429
     430        /**
     431         * Select database
     432         * @return void
     433         */
     434        public function select( $db ) {
     435                $this->dbh->exec( sprintf( 'USE %s', $db ) );
     436        }               
     437       
     438        /**
     439         * Perform a MySQL database query, using current database connection.
     440         * @param string $query Database query
     441         * @return int|false Number of rows affected/selected or false on error
     442         */
     443        public function query( $query ) {
     444                try {
     445                        $this->result = $this->dbh->query( $query );
     446                } catch ( Exception $e ) {
     447                }
     448                if ( preg_match( '/^\s*(create|alter|truncate|drop)\s/i', $query ) ) {
     449                        $return_val = $this->result;
     450                } elseif ( preg_match( '/^\s*(insert|delete|update|replace)\s/i', $query ) ) {
     451                        $return_val = $this->affected_rows();
     452                } elseif ( preg_match( '/^\s*select\s/i', $query ) ) {
     453                        $this->get_results();
     454                        return count( $this->fetched_rows );
     455                }
     456                return true;
     457        }
     458
     459        /**
     460         * Get number of rows affected
     461         * @return int
     462         */
     463        public function affected_rows() {
     464                return $this->result->rowCount();
     465        }
     466       
     467        /**
     468         * Get last insert id
     469         * @return int
     470         */
     471        public function insert_id() {
     472                return $this->dbh->lastInsertId();
     473        }
     474
     475        /**
     476         * Get results
     477         * @return array
     478         */
     479        public function get_results() {
     480                if ( !empty( $this->fetched_rows ) ) {
     481                        return $this->fetched_rows;
     482                }
     483                $this->fetched_rows = array();
     484                while ( $row = $this->result->fetchObject() ) {
     485                        $this->fetched_rows[] = $row;
     486                }
     487                return $this->fetched_rows;
     488        }
     489
     490        /**
     491         * Load the column metadata from the last query.
     492         * @return array
     493         */
     494        public function load_col_info() {
     495                if ( $this->col_info )
     496                        return $this->col_info;
     497                for ( $i = 0; $i < $this->result->columnCount() ; $i++ ) {
     498                        $this->col_info[ $i ] = $this->result->fetchColumn( $i );
     499                }
     500                return $this->col_info;
     501        }
     502
     503        /**
     504         * The database version number.
     505         * @return false|string false on failure, version number on success
     506         */
     507        public function db_version() {
     508                return preg_replace( '/[^0-9.].*/', '', $this->dbh->getAttribute( PDO::ATTR_SERVER_VERSION ) );
     509        }
     510}
     511 No newline at end of file
  • new file wp-includes/wp-db-driver.interface.php

    diff --git wp-includes/wp-db-driver.interface.php wp-includes/wp-db-driver.interface.php
    new file mode 100644
    index 0000000..efc6046
    - +  
     1<?php
     2
     3interface wpdb_driver {
     4        public function escape( $string );
     5        public function get_error_message();
     6        public function flush();
     7        public function connect( $host, $user, $pass, $port = 3306 );
     8        public function select( $name );
     9        public function query( $query );
     10        public function load_col_info();
     11        public function db_version();
     12        public function affected_rows();
     13        public function insert_id();
     14        public function get_results();
     15}
     16<?php
     17
     18interface wpdb_driver {
     19        public function escape( $string );
     20        public function get_error_message();
     21        public function flush();
     22        public function connect( $host, $user, $pass, $port = 3306 );
     23        public function select( $name );
     24        public function query( $query );
     25        public function load_col_info();
     26        public function db_version();
     27        public function affected_rows();
     28        public function insert_id();
     29        public function get_results();
     30}
     31<?php
     32
     33interface wpdb_driver {
     34        public function escape( $string );
     35        public function get_error_message();
     36        public function flush();
     37        public function connect( $host, $user, $pass, $port = 3306 );
     38        public function select( $name );
     39        public function query( $query );
     40        public function load_col_info();
     41        public function db_version();
     42        public function affected_rows();
     43        public function insert_id();
     44        public function get_results();
     45}
  • wp-includes/wp-db.php

    diff --git wp-includes/wp-db.php wp-includes/wp-db.php
    index 391cfa4..44b70a1 100644
    class wpdb { 
    487487        protected $dbhost;
    488488
    489489        /**
    490          * Database Handle
     490         * Database driver object
    491491         *
    492          * @since 0.71
     492         * Allow for simple, and backwards compatible, pluggable database drivers
     493         * like PDO_mysql and mysqli to power wpdb
     494         *
    493495         * @access protected
    494          * @var string
     496         * @since 3.5.0
     497         * @var wpdb_driver
    495498         */
    496499        protected $dbh;
    497500
    class wpdb { 
    518521         */
    519522        public $is_mysql = null;
    520523
    521         /**
     524        /**
     525         * Pick the adapter to be used for performing the actual queries.
     526         *
     527         * @since 3.6.0
     528         */
     529        private function set_driver() {
     530
     531                // Auto-pick the driver
     532                if ( defined( 'WPDB_DRIVER' ) ) {
     533                        $driver = WPDB_DRIVER;
     534                } elseif ( extension_loaded( 'pdo_mysql' ) ) {
     535                        $driver = 'pdo_mysql';
     536                } elseif ( extension_loaded( 'mysqli' ) ) {
     537                        $driver = 'mysqli';
     538                } elseif ( extension_loaded( 'mysql' ) ) {
     539                        $driver = 'mysql';
     540                }
     541
     542                // Get the new driver
     543                if ( in_array( $driver, array( 'mysql', 'mysqli', 'pdo_mysql' ) ) ) {
     544                        require_once( ABSPATH . WPINC . '/class-wp-db-driver-' . $driver . '.php' );
     545                }
     546                $class = 'wpdb_driver_' . $driver;
     547
     548                if ( !class_exists( $class ) ) {
     549                        wp_load_translations_early();
     550                        $this->bail( sprintf( __( "
     551                                <h1>No database drivers found</h1>.
     552                                <p>WordPress requires the mysql, mysqli, or pdo_mysql extension to talk to your database.</p>
     553                                <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>
     554                        "), 'db_connect_fail' ) );
     555                }
     556
     557                $this->dbh = new $class();
     558        }
     559
     560        /**
    522561         * Connects to the database server and selects a database
    523562         *
    524563         * PHP5 style constructor for compatibility with PHP5. Does
    class wpdb { 
    534573         * @param string $dbhost MySQL database host
    535574         */
    536575        function __construct( $dbuser, $dbpassword, $dbname, $dbhost ) {
     576                $this->set_driver();
     577
    537578                register_shutdown_function( array( $this, '__destruct' ) );
    538579
    539580                if ( WP_DEBUG )
    class wpdb { 
    646687                if ( !isset($collate) )
    647688                        $collate = $this->collate;
    648689                if ( $this->has_cap( 'collation', $dbh ) && !empty( $charset ) ) {
    649                         if ( function_exists( 'mysql_set_charset' ) && $this->has_cap( 'set_charset', $dbh ) ) {
    650                                 mysql_set_charset( $charset, $dbh );
    651                                 $this->real_escape = true;
    652                         } else {
    653                                 $query = $this->prepare( 'SET NAMES %s', $charset );
    654                                 if ( ! empty( $collate ) )
    655                                         $query .= $this->prepare( ' COLLATE %s', $collate );
    656                                 mysql_query( $query, $dbh );
    657                         }
     690                        $query = $this->prepare( 'SET NAMES %s', $charset );
     691                        if ( ! empty( $collate ) )
     692                                $query .= $this->prepare( ' COLLATE %s', $collate );
     693                        $this->dbh->query( $query );
    658694                }
    659695        }
    660696
    class wpdb { 
    837873         * @return null Always null.
    838874         */
    839875        function select( $db, $dbh = null ) {
    840                 if ( is_null($dbh) )
    841                         $dbh = $this->dbh;
    842 
    843                 if ( !@mysql_select_db( $db, $dbh ) ) {
    844                         $this->ready = false;
    845                         wp_load_translations_early();
    846                         $this->bail( sprintf( __( '<h1>Can&#8217;t select database</h1>
    847 <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>
    848 <ul>
    849 <li>Are you sure it exists?</li>
    850 <li>Does the user <code>%2$s</code> have permission to use the <code>%1$s</code> database?</li>
    851 <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>
    852 </ul>
    853 <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' );
    854                         return;
    855                 }
     876                $this->dbh->select( $db );
    856877        }
    857878
    858879        /**
    class wpdb { 
    882903         */
    883904        function _real_escape( $string ) {
    884905                if ( $this->dbh && $this->real_escape )
    885                         return mysql_real_escape_string( $string, $this->dbh );
     906                        return $this->dbh->escape( $string );
    886907                else
    887908                        return addslashes( $string );
    888909        }
    class wpdb { 
    10171038                global $EZSQL_ERROR;
    10181039
    10191040                if ( !$str )
    1020                         $str = mysql_error( $this->dbh );
     1041                        $str = $this->dbh->get_error_message();
    10211042                $EZSQL_ERROR[] = array( 'query' => $this->last_query, 'error_str' => $str );
    10221043
    10231044                if ( $this->suppress_errors )
    class wpdb { 
    11141135         * @return void
    11151136         */
    11161137        function flush() {
    1117                 $this->last_result = array();
    1118                 $this->col_info    = null;
    1119                 $this->last_query  = null;
    1120 
    1121                 if ( is_resource( $this->result ) )
    1122                         mysql_free_result( $this->result );
     1138                $this->dbh->flush();
    11231139        }
    11241140
    11251141        /**
    class wpdb { 
    11341150                $new_link = defined( 'MYSQL_NEW_LINK' ) ? MYSQL_NEW_LINK : true;
    11351151                $client_flags = defined( 'MYSQL_CLIENT_FLAGS' ) ? MYSQL_CLIENT_FLAGS : 0;
    11361152
    1137                 if ( WP_DEBUG ) {
    1138                         $this->dbh = mysql_connect( $this->dbhost, $this->dbuser, $this->dbpassword, $new_link, $client_flags );
    1139                 } else {
    1140                         $this->dbh = @mysql_connect( $this->dbhost, $this->dbuser, $this->dbpassword, $new_link, $client_flags );
    1141                 }
     1153                $host = $this->dbhost;
     1154                $port = 3306;
     1155                if ( false !== strpos( $this->dbhost, ':' ) ) {
     1156                        list( $host, $port ) = explode( ':', $this->dbhost );
     1157                }
    11421158
    1143                 if ( !$this->dbh ) {
     1159                if ( !$this->dbh->connect( $host, $this->dbuser, $this->dbpassword, $port ) ) {
    11441160                        wp_load_translations_early();
    11451161                        $this->bail( sprintf( __( "
    11461162<h1>Error establishing a database connection</h1>
    class wpdb { 
    11921208                if ( defined( 'SAVEQUERIES' ) && SAVEQUERIES )
    11931209                        $this->timer_start();
    11941210
    1195                 $this->result = @mysql_query( $query, $this->dbh );
     1211                $result = $this->dbh->query( $query );
    11961212                $this->num_queries++;
    11971213
    11981214                if ( defined( 'SAVEQUERIES' ) && SAVEQUERIES )
    11991215                        $this->queries[] = array( $query, $this->timer_stop(), $this->get_caller() );
    12001216
    12011217                // If there is an error then take note of it..
    1202                 if ( $this->last_error = mysql_error( $this->dbh ) ) {
     1218                if ( $this->last_error = $this->dbh->get_error_message() ) {
    12031219                        $this->print_error();
    12041220                        return false;
    12051221                }
    class wpdb { 
    12071223                if ( preg_match( '/^\s*(create|alter|truncate|drop)\s/i', $query ) ) {
    12081224                        $return_val = $this->result;
    12091225                } elseif ( preg_match( '/^\s*(insert|delete|update|replace)\s/i', $query ) ) {
    1210                         $this->rows_affected = mysql_affected_rows( $this->dbh );
     1226                        $this->rows_affected = $this->dbh->affected_rows();
    12111227                        // Take note of the insert_id
    12121228                        if ( preg_match( '/^\s*(insert|replace)\s/i', $query ) ) {
    1213                                 $this->insert_id = mysql_insert_id($this->dbh);
     1229                                $this->insert_id = $this->dbh->insert_id();
    12141230                        }
    12151231                        // Return number of rows affected
    12161232                        $return_val = $this->rows_affected;
    12171233                } else {
    1218                         $num_rows = 0;
    1219                         while ( $row = @mysql_fetch_object( $this->result ) ) {
    1220                                 $this->last_result[$num_rows] = $row;
    1221                                 $num_rows++;
    1222                         }
    1223 
    1224                         // Log number of rows the query returned
    1225                         // and return number of rows selected
    1226                         $this->num_rows = $num_rows;
    1227                         $return_val     = $num_rows;
     1234                        $return_val = $this->num_rows = count( $this->last_result );
    12281235                }
    12291236
     1237                $this->last_result = $this->dbh->get_results();
    12301238                return $return_val;
    12311239        }
    12321240
    class wpdb { 
    15561564         * @access protected
    15571565         */
    15581566        protected function load_col_info() {
    1559                 if ( $this->col_info )
    1560                         return;
    1561 
    1562                 for ( $i = 0; $i < @mysql_num_fields( $this->result ); $i++ ) {
    1563                         $this->col_info[ $i ] = @mysql_fetch_field( $this->result, $i );
    1564                 }
     1567                $this->col_info = $this->dbh->load_col_info();
    15651568        }
    15661569
    15671570        /**
    class wpdb { 
    17321735         * @return false|string false on failure, version number on success
    17331736         */
    17341737        function db_version() {
    1735                 return preg_replace( '/[^0-9.].*/', '', mysql_get_server_info( $this->dbh ) );
     1738                return $this->dbh->db_version();
    17361739        }
    17371740}