public static function Connection::open

Same name in this branch
  1. 8.x drupal/core/lib/Drupal/Core/Database/Connection.php \Drupal\Core\Database\Connection::open()
  2. 8.x drupal/core/lib/Drupal/Core/Database/Driver/mysql/Connection.php \Drupal\Core\Database\Driver\mysql\Connection::open()
  3. 8.x drupal/core/lib/Drupal/Core/Database/Driver/sqlite/Connection.php \Drupal\Core\Database\Driver\sqlite\Connection::open()
  4. 8.x drupal/core/lib/Drupal/Core/Database/Driver/pgsql/Connection.php \Drupal\Core\Database\Driver\pgsql\Connection::open()

Opens a PDO connection.

Parameters

array $connection_options: The database connection settings array.

Return value

\PDO A \PDO object.

Overrides Connection::open

File

drupal/core/lib/Drupal/Core/Database/Driver/mysql/Connection.php, line 57
Definition of Drupal\Core\Database\Driver\mysql\Connection

Class

Connection

Namespace

Drupal\Core\Database\Driver\mysql

Code

public static function open(array &$connection_options = array()) {

  // The DSN should use either a socket or a host/port.
  if (isset($connection_options['unix_socket'])) {
    $dsn = 'mysql:unix_socket=' . $connection_options['unix_socket'];
  }
  else {

    // Default to TCP connection on port 3306.
    $dsn = 'mysql:host=' . $connection_options['host'] . ';port=' . (empty($connection_options['port']) ? 3306 : $connection_options['port']);
  }
  if (!empty($connection_options['database'])) {
    $dsn .= ';dbname=' . $connection_options['database'];
  }

  // Allow PDO options to be overridden.
  $connection_options += array(
    'pdo' => array(),
  );
  $connection_options['pdo'] += array(
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    // So we don't have to mess around with cursors and unbuffered queries by default.
    PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => TRUE,
    // Make sure MySQL returns all matched rows on update queries including
    // rows that actually didn't have to be updated because the values didn't
    // change. This matches common behaviour among other database systems.
    PDO::MYSQL_ATTR_FOUND_ROWS => TRUE,
    // Because MySQL's prepared statements skip the query cache, because it's dumb.
    PDO::ATTR_EMULATE_PREPARES => TRUE,
  );
  $pdo = new PDO($dsn, $connection_options['username'], $connection_options['password'], $connection_options['pdo']);

  // Force MySQL to use the UTF-8 character set. Also set the collation, if a
  // certain one has been set; otherwise, MySQL defaults to 'utf8_general_ci'
  // for UTF-8.
  if (!empty($connection_options['collation'])) {
    $pdo
      ->exec('SET NAMES utf8 COLLATE ' . $connection_options['collation']);
  }
  else {
    $pdo
      ->exec('SET NAMES utf8');
  }

  // Set MySQL init_commands if not already defined.  Default Drupal's MySQL
  // behavior to conform more closely to SQL standards.  This allows Drupal
  // to run almost seamlessly on many different kinds of database systems.
  // These settings force MySQL to behave the same as postgresql, or sqlite
  // in regards to syntax interpretation and invalid data handling.  See
  // http://drupal.org/node/344575 for further discussion. Also, as MySQL 5.5
  // changed the meaning of TRADITIONAL we need to spell out the modes one by
  // one.
  $connection_options += array(
    'init_commands' => array(),
  );
  $connection_options['init_commands'] += array(
    'sql_mode' => "SET sql_mode = 'ANSI,STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER'",
  );

  // Set connection options.
  $pdo
    ->exec(implode('; ', $connection_options['init_commands']));
  return $pdo;
}