yf_db_driver_pdo_mysql class

Fileplugins/db/classes/db/yf_db_driver_pdo_mysql.class.php
Use_class('db_driver_pdo_mysql', 'classes/db/')
Extendsyf_db_driver_pdo → yf_db_driver

Public properties

A site sets them in its config with $PROJECT_CONF['db_driver_pdo_mysql']['NAME'] = ...;

PropertyDefaultDescription
$DEF_PORT
mixed
null Port left out of the DSN when it equals this (same as the mysqli driver)
$SQL_MODE
string
''
$_connect_error null
$db_connect_id
@conf_skip
null
$params null

Inherited properties

from yf_db_driver_pdo: $_last_query_error, $_last_query_id, $_query_error

from yf_db_driver: $ESCAPE_BUILDER_VALUES

Public methods 13

public function auto_limit_one()
    public function auto_limit_one()
    {
        return true;
    }

connect

public function connect()
    public function connect()
    {
        $dsn = 'mysql:host=' . $this->params['host'];
        if ($this->params['port'] && $this->params['port'] != $this->DEF_PORT) {
            $dsn .= ';port=' . $this->params['port'];
        }
        if ($this->params['socket']) {
            $dsn .= ';unix_socket=' . $this->params['socket'];
        }
        if ($this->params['charset']) {
            $dsn .= ';charset=' . $this->params['charset'];
        }
        $attrs = [];
        $attrs[PDO::ATTR_TIMEOUT] = 2;
        if ($this->params['persist']) {
            $attrs[PDO::ATTR_PERSISTENT] = true;
        }
        $this->db_connect_id = new PDO($dsn, $this->params['user'], $this->params['pswd'], $attrs);
        $pdo = &$this->db_connect_id;
        $pdo->setAttribute(class_exists('Pdo\\Mysql') ? constant('Pdo\\Mysql::ATTR_DIRECT_QUERY') : constant('PDO::MYSQL_ATTR_DIRECT_QUERY'), true);

        if ( ! $this->db_connect_id) {
            $this->_connect_error = 'cannot_connect_to_server';
            return $this->db_connect_id;
        }
        $this->query('SET SQL_MODE="' . $this->real_escape_string($this->SQL_MODE) . '"');

        if ($this->params['name'] != '') {
            $dbselect = $this->select_db($this->params['name']);
            // Try to create database, if not exists and if allowed
            if ( ! $dbselect && $this->params['allow_auto_create_db'] && preg_match('/^[a-z0-9][a-z0-9_]+[a-z0-9]$/i', $this->params['name'])) {
                $res = $this->query('CREATE DATABASE IF NOT EXISTS ' . $this->params['name']);
                if ($res) {
                    $dbselect = $this->select_db($this->params['name']);
                }
            }
            if ( ! $dbselect) {
                $this->_connect_error = 'cannot_select_db';
            }
            return $dbselect;
        }
        return $this->db_connect_id;
    }

escape_key

public function escape_key($data)
    public function escape_key($data)
    {
        return '`' . str_replace('`', '``', trim($data, '`')) . '`';
    }

escape_val

public function escape_val($data)
    public function escape_val($data)
    {
        if ($data === null) {
            return 'NULL';
        }
        if ($this->ESCAPE_BUILDER_VALUES) {
            if ($this->db_connect_id) {
                return $this->db_connect_id->quote((string) $data);
            }
            $data = $this->real_escape_string($data);
        }
        return '\'' . $data . '\'';
    }
public function get_last_warnings()
    public function get_last_warnings()
    {
        if ( ! $this->db_connect_id) {
            return false;
        }
        $q = $this->query('SHOW WARNINGS');
        if ( ! $q) {
            return false;
        }
        $warnings = [];
        // Example: Warning (1264): Data truncated for column 'Name' at row 1
        while ($a = $this->fetch_row($q)) {
            $warnings[] = printf('%s (%d): %s', $a[0], $a[1], $a[2]);
        }
        return $warnings;
    }
public function is_reconnect_error($db_error, array $codes = [])
  • $codes array
    public function is_reconnect_error($db_error, array $codes = [])
    {
        return in_array($db_error['code'], $codes);
    }

limit

public function limit($count, $offset)
    public function limit($count, $offset)
    {
        $sql = null;
        if ($count > 0) {
            $offset = ($offset > 0) ? $offset : 0;
            $sql = 'LIMIT ' . ($offset ? $offset . ', ' : '') . $count;
        }
        return $sql;
    }

no_cache_hint

public function no_cache_hint()
    public function no_cache_hint()
    {
        return 'SQL_NO_CACHE';
    }
public function real_escape_string($string)
    public function real_escape_string($string)
    {
        if ($string === null) {
            return 'NULL';
        } elseif (is_float($string)) {
            return str_replace(',', '.', $string);
        } elseif (is_int($string)) {
            return $string;
        } elseif (is_bool($string)) {
            return (int) $string;
        }
        return _class('db')->_mysql_escape_mimic($string);
    }
public function repairable_error_codes()
    public function repairable_error_codes()
    {
        return [
            1191, // Can't find FULLTEXT index matching the column list
            2013, // Lost connection to MySQL server during query
            1205, // Lock wait timeout expired. Transaction was rolled back (InnoDB)
            1213, // Transaction deadlock. You should rerun the transaction. (InnoDB)
            1146, // Table %s doesn't exist
            1054, // Unknown column %s
        ];
    }

select_db

public function select_db($name)
    public function select_db($name)
    {
        return $this->db_connect_id ? (bool) $this->query('USE ' . $name) : false;
    }
public function supports_upsert()
    public function supports_upsert()
    {
        return true;
    }

Methods starting with _ hooks and helpers; not routable as page actions

__construct

public function __construct(array $params)
  • $params array
    public function __construct(array $params)
    {
        if ( ! extension_loaded('pdo_mysql')) {
            throw new RuntimeException('YF PDO MySQL db driver missing php extension pdo_mysql');
            return false;
        }
        $params['port'] = ($params['port'] ?? null) ?: 3306;
        if ($params['socket'] && ! file_exists($params['socket'])) {
            $params['socket'] = '';
        }
        $params['charset'] = ($params['charset'] ?? null) ?: (defined('DB_CHARSET') ? DB_CHARSET : 'utf8');
        $this->params = $params;
        $this->connect();
        return $this->db_connect_id;
    }

Inherited methods

from yf_db_driver: __call()

from yf_db_driver_pdo: affected_rows(), begin(), close(), commit(), error(), fetch_array(), fetch_assoc(), fetch_object(), fetch_row(), free_result(), get_host_info(), get_server_version(), insert_id(), num_rows(), query(), rollback()