yf_db_driver_pdo_mysql class| File | plugins/db/classes/db/yf_db_driver_pdo_mysql.class.php |
|---|---|
| Use | _class('db_driver_pdo_mysql', 'classes/db/') |
| Extends | yf_db_driver_pdo → yf_db_driver |
A site sets them in its config with $PROJECT_CONF['db_driver_pdo_mysql']['NAME'] = ...;
| Property | Default | Description |
|---|---|---|
$DEF_PORTmixed |
null |
Port left out of the DSN when it equals this (same as the mysqli driver) |
$SQL_MODEstring |
'' |
|
$_connect_error |
null |
|
$db_connect_id@conf_skip |
null |
|
$params |
null |
from yf_db_driver_pdo: $_last_query_error, $_last_query_id, $_query_error
from yf_db_driver: $ESCAPE_BUILDER_VALUES
public function auto_limit_one()
public function auto_limit_one()
{
return true;
}
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;
}
public function escape_key($data)
public function escape_key($data)
{
return '`' . str_replace('`', '``', trim($data, '`')) . '`';
}
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);
}
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;
}
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
];
}
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;
}
_ hooks and helpers; not routable as page actionspublic 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;
}
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()