New experimental database configurations

This commit is contained in:
Michael 2020-05-17 09:03:56 +00:00
parent 78d6137ee3
commit 4d4678ceb6
2 changed files with 21 additions and 5 deletions

View file

@ -135,8 +135,9 @@ class Database
} }
$this->emulate_prepares = (bool)$this->configCache->get('database', 'emulate_prepares'); $this->emulate_prepares = (bool)$this->configCache->get('database', 'emulate_prepares');
$this->pdo_emulate_prepares = (bool)$this->configCache->get('database', 'pdo_emulate_prepares');
if (class_exists('\PDO') && in_array('mysql', PDO::getAvailableDrivers())) { if (!$this->configCache->get('database', 'disable_pdo') && class_exists('\PDO') && in_array('mysql', PDO::getAvailableDrivers())) {
$this->driver = 'pdo'; $this->driver = 'pdo';
$connect = "mysql:host=" . $server . ";dbname=" . $db; $connect = "mysql:host=" . $server . ";dbname=" . $db;
@ -150,7 +151,7 @@ class Database
try { try {
$this->connection = @new PDO($connect, $user, $pass); $this->connection = @new PDO($connect, $user, $pass);
$this->connection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $this->connection->setAttribute(PDO::ATTR_EMULATE_PREPARES, $this->pdo_emulate_prepares);
$this->connected = true; $this->connected = true;
} catch (PDOException $e) { } catch (PDOException $e) {
$this->connected = false; $this->connected = false;
@ -1029,7 +1030,7 @@ class Database
$success = $this->e("LOCK TABLES " . DBA::buildTableString($table) . " WRITE"); $success = $this->e("LOCK TABLES " . DBA::buildTableString($table) . " WRITE");
if ($this->driver == 'pdo') { if ($this->driver == 'pdo') {
$this->connection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $this->connection->setAttribute(PDO::ATTR_EMULATE_PREPARES, $this->pdo_emulate_prepares);
} }
if (!$success) { if (!$success) {
@ -1062,7 +1063,7 @@ class Database
$success = $this->e("UNLOCK TABLES"); $success = $this->e("UNLOCK TABLES");
if ($this->driver == 'pdo') { if ($this->driver == 'pdo') {
$this->connection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $this->connection->setAttribute(PDO::ATTR_EMULATE_PREPARES, $this->pdo_emulate_prepares);
$this->e("SET autocommit=1"); $this->e("SET autocommit=1");
} else { } else {
$this->connection->autocommit(true); $this->connection->autocommit(true);

View file

@ -45,8 +45,23 @@ return [
'database' => '', 'database' => '',
// charset (String) // charset (String)
// Database connexion charset. Changing this value will likely corrupt special characters. // Database connection charset. Changing this value will likely corrupt special characters.
'charset' => 'utf8mb4', 'charset' => 'utf8mb4',
// emulate_prepares (Boolean) (Experimental)
// If enabled, prepared statements will be emulated.
// In combination with MySQLi this will cast all return values to strings.
'emulate_prepares' => false,
// pdo_emulate_prepares (Boolean) (Experimental)
// If enabled, the builtin emulation for prepared statements is used.
// Due to limitations of that emulation (all return values are casted as strings)
// this will most likely cause issues and should not be used on production systems.
'pdo_emulate_prepares' => false,
// disable_pdo (Boolean)
// PDO is used by default (if available). Otherwise MySQLi will be used.
'disable_pdo' => false,
], ],
'config' => [ 'config' => [
// admin_email (Comma-separated list) // admin_email (Comma-separated list)