}
$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';
$connect = "mysql:host=" . $server . ";dbname=" . $db;
try {
$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;
} catch (PDOException $e) {
$this->connected = false;
$success = $this->e("LOCK TABLES " . DBA::buildTableString($table) . " WRITE");
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) {
$success = $this->e("UNLOCK TABLES");
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");
} else {
$this->connection->autocommit(true);
'database' => '',
// 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',
+
+ // 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' => [
// admin_email (Comma-separated list)