MediaWiki  1.29.1
DatabaseMysqli.php
Go to the documentation of this file.
1 <?php
23 namespace Wikimedia\Rdbms;
24 
25 use mysqli;
26 use IP;
27 
42  protected function doQuery( $sql ) {
43  $conn = $this->getBindingHandle();
44 
45  if ( $this->bufferResults() ) {
46  $ret = $conn->query( $sql );
47  } else {
48  $ret = $conn->query( $sql, MYSQLI_USE_RESULT );
49  }
50 
51  return $ret;
52  }
53 
59  protected function mysqlConnect( $realServer ) {
60  # Avoid suppressed fatal error, which is very hard to track down
61  if ( !function_exists( 'mysqli_init' ) ) {
62  throw new DBConnectionError( $this, "MySQLi functions missing,"
63  . " have you compiled PHP with the --with-mysqli option?\n" );
64  }
65 
66  // Other than mysql_connect, mysqli_real_connect expects an explicit port
67  // and socket parameters. So we need to parse the port and socket out of
68  // $realServer
69  $port = null;
70  $socket = null;
71  $hostAndPort = IP::splitHostAndPort( $realServer );
72  if ( $hostAndPort ) {
73  $realServer = $hostAndPort[0];
74  if ( $hostAndPort[1] ) {
75  $port = $hostAndPort[1];
76  }
77  } elseif ( substr_count( $realServer, ':' ) == 1 ) {
78  // If we have a colon and something that's not a port number
79  // inside the hostname, assume it's the socket location
80  $hostAndSocket = explode( ':', $realServer );
81  $realServer = $hostAndSocket[0];
82  $socket = $hostAndSocket[1];
83  }
84 
85  $mysqli = mysqli_init();
86 
87  $connFlags = 0;
88  if ( $this->mFlags & self::DBO_SSL ) {
89  $connFlags |= MYSQLI_CLIENT_SSL;
90  $mysqli->ssl_set(
91  $this->sslKeyPath,
92  $this->sslCertPath,
93  null,
94  $this->sslCAPath,
95  $this->sslCiphers
96  );
97  }
98  if ( $this->mFlags & self::DBO_COMPRESS ) {
99  $connFlags |= MYSQLI_CLIENT_COMPRESS;
100  }
101  if ( $this->mFlags & self::DBO_PERSISTENT ) {
102  $realServer = 'p:' . $realServer;
103  }
104 
105  if ( $this->utf8Mode ) {
106  // Tell the server we're communicating with it in UTF-8.
107  // This may engage various charset conversions.
108  $mysqli->options( MYSQLI_SET_CHARSET_NAME, 'utf8' );
109  } else {
110  $mysqli->options( MYSQLI_SET_CHARSET_NAME, 'binary' );
111  }
112  $mysqli->options( MYSQLI_OPT_CONNECT_TIMEOUT, 3 );
113 
114  if ( $mysqli->real_connect( $realServer, $this->mUser,
115  $this->mPassword, $this->mDBname, $port, $socket, $connFlags )
116  ) {
117  return $mysqli;
118  }
119 
120  return false;
121  }
122 
123  protected function connectInitCharset() {
124  // already done in mysqlConnect()
125  return true;
126  }
127 
132  protected function mysqlSetCharset( $charset ) {
133  $conn = $this->getBindingHandle();
134 
135  if ( method_exists( $conn, 'set_charset' ) ) {
136  return $conn->set_charset( $charset );
137  } else {
138  return $this->query( 'SET NAMES ' . $charset, __METHOD__ );
139  }
140  }
141 
145  protected function closeConnection() {
146  $conn = $this->getBindingHandle();
147 
148  return $conn->close();
149  }
150 
154  function insertId() {
155  $conn = $this->getBindingHandle();
156 
157  return (int)$conn->insert_id;
158  }
159 
163  function lastErrno() {
164  if ( $this->mConn ) {
165  return $this->mConn->errno;
166  } else {
167  return mysqli_connect_errno();
168  }
169  }
170 
174  function affectedRows() {
175  $conn = $this->getBindingHandle();
176 
177  return $conn->affected_rows;
178  }
179 
184  function selectDB( $db ) {
185  $conn = $this->getBindingHandle();
186 
187  $this->mDBname = $db;
188 
189  return $conn->select_db( $db );
190  }
191 
196  protected function mysqlFreeResult( $res ) {
197  $res->free_result();
198 
199  return true;
200  }
201 
206  protected function mysqlFetchObject( $res ) {
207  $object = $res->fetch_object();
208  if ( $object === null ) {
209  return false;
210  }
211 
212  return $object;
213  }
214 
219  protected function mysqlFetchArray( $res ) {
220  $array = $res->fetch_array();
221  if ( $array === null ) {
222  return false;
223  }
224 
225  return $array;
226  }
227 
232  protected function mysqlNumRows( $res ) {
233  return $res->num_rows;
234  }
235 
240  protected function mysqlNumFields( $res ) {
241  return $res->field_count;
242  }
243 
249  protected function mysqlFetchField( $res, $n ) {
250  $field = $res->fetch_field_direct( $n );
251 
252  // Add missing properties to result (using flags property)
253  // which will be part of function mysql-fetch-field for backward compatibility
254  $field->not_null = $field->flags & MYSQLI_NOT_NULL_FLAG;
255  $field->primary_key = $field->flags & MYSQLI_PRI_KEY_FLAG;
256  $field->unique_key = $field->flags & MYSQLI_UNIQUE_KEY_FLAG;
257  $field->multiple_key = $field->flags & MYSQLI_MULTIPLE_KEY_FLAG;
258  $field->binary = $field->flags & MYSQLI_BINARY_FLAG;
259  $field->numeric = $field->flags & MYSQLI_NUM_FLAG;
260  $field->blob = $field->flags & MYSQLI_BLOB_FLAG;
261  $field->unsigned = $field->flags & MYSQLI_UNSIGNED_FLAG;
262  $field->zerofill = $field->flags & MYSQLI_ZEROFILL_FLAG;
263 
264  return $field;
265  }
266 
272  protected function mysqlFieldName( $res, $n ) {
273  $field = $res->fetch_field_direct( $n );
274 
275  return $field->name;
276  }
277 
283  protected function mysqlFieldType( $res, $n ) {
284  $field = $res->fetch_field_direct( $n );
285 
286  return $field->type;
287  }
288 
294  protected function mysqlDataSeek( $res, $row ) {
295  return $res->data_seek( $row );
296  }
297 
302  protected function mysqlError( $conn = null ) {
303  if ( $conn === null ) {
304  return mysqli_connect_error();
305  } else {
306  return $conn->error;
307  }
308  }
309 
315  protected function mysqlRealEscapeString( $s ) {
316  $conn = $this->getBindingHandle();
317 
318  return $conn->real_escape_string( $s );
319  }
320 
327  public function __toString() {
328  if ( $this->mConn instanceof mysqli ) {
329  return (string)$this->mConn->thread_id;
330  } else {
331  // mConn might be false or something.
332  return (string)$this->mConn;
333  }
334  }
335 }
336 
337 class_alias( DatabaseMysqli::class, 'DatabaseMysqli' );
DBO_PERSISTENT
const DBO_PERSISTENT
Definition: defines.php:14
Wikimedia\Rdbms\Database\getBindingHandle
getBindingHandle()
Get the underlying binding handle, mConn.
Definition: Database.php:3426
Wikimedia\Rdbms\Database\$mConn
resource null $mConn
Database connection.
Definition: Database.php:92
Wikimedia\Rdbms\DatabaseMysqli\mysqlDataSeek
mysqlDataSeek( $res, $row)
Definition: DatabaseMysqli.php:294
Wikimedia\Rdbms\DatabaseMysqli\mysqlFieldType
mysqlFieldType( $res, $n)
Definition: DatabaseMysqli.php:283
use
as see the revision history and available at free of to any person obtaining a copy of this software and associated documentation to deal in the Software without including without limitation the rights to use
Definition: MIT-LICENSE.txt:10
Wikimedia\Rdbms\DatabaseMysqli\lastErrno
lastErrno()
Definition: DatabaseMysqli.php:163
Wikimedia\Rdbms
Definition: ChronologyProtector.php:24
IP
A collection of public static functions to play with IP address and IP blocks.
Definition: IP.php:67
$s
$s
Definition: mergeMessageFileList.php:188
DBO_SSL
const DBO_SSL
Definition: defines.php:17
$res
$res
Definition: database.txt:21
Wikimedia\Rdbms\DatabaseMysqli
Database abstraction object for PHP extension mysqli.
Definition: DatabaseMysqli.php:35
Wikimedia\Rdbms\DatabaseMysqli\mysqlFetchObject
mysqlFetchObject( $res)
Definition: DatabaseMysqli.php:206
php
injection txt This is an overview of how MediaWiki makes use of dependency injection The design described here grew from the discussion of RFC T384 The term dependency this means that anything an object needs to operate should be injected from the the object itself should only know narrow no concrete implementation of the logic it relies on The requirement to inject everything typically results in an architecture that based on two main types of and essentially stateless service objects that use other service objects to operate on the value objects As of the beginning MediaWiki is only starting to use the DI approach Much of the code still relies on global state or direct resulting in a highly cyclical dependency which acts as the top level factory for services in MediaWiki which can be used to gain access to default instances of various services MediaWikiServices however also allows new services to be defined and default services to be redefined Services are defined or redefined by providing a callback the instantiator that will return a new instance of the service When it will create an instance of MediaWikiServices and populate it with the services defined in the files listed by thereby bootstrapping the DI framework Per $wgServiceWiringFiles lists includes ServiceWiring php
Definition: injection.txt:35
Wikimedia\Rdbms\DatabaseMysqli\closeConnection
closeConnection()
Definition: DatabaseMysqli.php:145
Wikimedia\Rdbms\Database\doQuery
doQuery( $sql)
The DBMS-dependent part of query()
Wikimedia\Rdbms\DatabaseMysqli\connectInitCharset
connectInitCharset()
Set the character set information right after connection.
Definition: DatabaseMysqli.php:123
Wikimedia\Rdbms\DatabaseMysqli\mysqlFreeResult
mysqlFreeResult( $res)
Definition: DatabaseMysqli.php:196
Wikimedia\Rdbms\DatabaseMysqli\mysqlNumRows
mysqlNumRows( $res)
Definition: DatabaseMysqli.php:232
Wikimedia\Rdbms\DatabaseMysqli\mysqlSetCharset
mysqlSetCharset( $charset)
Definition: DatabaseMysqli.php:132
DBO_COMPRESS
const DBO_COMPRESS
Definition: defines.php:18
IP\splitHostAndPort
static splitHostAndPort( $both)
Given a host/port string, like one might find in the host part of a URL per RFC 2732,...
Definition: IP.php:254
Wikimedia\Rdbms\DatabaseMysqli\insertId
insertId()
Definition: DatabaseMysqli.php:154
Wikimedia\Rdbms\DatabaseMysqli\mysqlNumFields
mysqlNumFields( $res)
Definition: DatabaseMysqli.php:240
Wikimedia\Rdbms\DatabaseMysqli\mysqlError
mysqlError( $conn=null)
Definition: DatabaseMysqli.php:302
Wikimedia\Rdbms\DatabaseMysqli\selectDB
selectDB( $db)
Definition: DatabaseMysqli.php:184
Wikimedia\Rdbms\DatabaseMysqli\mysqlFetchArray
mysqlFetchArray( $res)
Definition: DatabaseMysqli.php:219
Wikimedia\Rdbms\DatabaseMysqli\mysqlFieldName
mysqlFieldName( $res, $n)
Definition: DatabaseMysqli.php:272
Wikimedia\Rdbms\Database\query
query( $sql, $fname=__METHOD__, $tempIgnore=false)
Run an SQL query and return the result.
Definition: Database.php:850
Wikimedia\Rdbms\Database\bufferResults
bufferResults( $buffer=null)
Turns buffering of SQL result sets on (true) or off (false).
Definition: Database.php:427
Wikimedia\Rdbms\DatabaseMysqli\$sql
function doQuery $mConn $sql
mysqli
Definition: DatabaseMysqli.php:42
Wikimedia\Rdbms\DatabaseMysqli\mysqlFetchField
mysqlFetchField( $res, $n)
Definition: DatabaseMysqli.php:249
Wikimedia\Rdbms\DBConnectionError
Definition: DBConnectionError.php:26
Wikimedia\Rdbms\DatabaseMysqli\affectedRows
affectedRows()
Definition: DatabaseMysqli.php:174
class
you have access to all of the normal MediaWiki so you can get a DB use the etc For full docs on the Maintenance class
Definition: maintenance.txt:52
Wikimedia\Rdbms\DatabaseMysqli\__toString
__toString()
Give an id for the connection.
Definition: DatabaseMysqli.php:327
Wikimedia\Rdbms\DatabaseMysqli\$ret
return $ret
Definition: DatabaseMysqli.php:51
Wikimedia\Rdbms\DatabaseMysqli\mysqlConnect
mysqlConnect( $realServer)
Definition: DatabaseMysqli.php:59
Wikimedia\Rdbms\DatabaseMysqlBase
Database abstraction object for MySQL.
Definition: DatabaseMysqlBase.php:40
Wikimedia\Rdbms\DatabaseMysqli\mysqlRealEscapeString
mysqlRealEscapeString( $s)
Escapes special characters in a string for use in an SQL statement.
Definition: DatabaseMysqli.php:315