| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 | <?php// +----------------------------------------------------------------------// | ThinkPHP [ WE CAN DO IT JUST THINK ]// +----------------------------------------------------------------------// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.// +----------------------------------------------------------------------// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )// +----------------------------------------------------------------------// | Author: liu21st <liu21st@gmail.com>// +----------------------------------------------------------------------namespace think\db\connector;use PDO;use think\db\Connection;use think\Log;/** * mysql数据库驱动 */class Mysql extends Connection{    protected $builder = '\\think\\db\\builder\\Mysql';    /**     * 解析pdo连接的dsn信息     * @access protected     * @param array $config 连接信息     * @return string     */    protected function parseDsn($config)    {        if (!empty($config['socket'])) {            $dsn = 'mysql:unix_socket=' . $config['socket'];        } elseif (!empty($config['hostport'])) {            $dsn = 'mysql:host=' . $config['hostname'] . ';port=' . $config['hostport'];        } else {            $dsn = 'mysql:host=' . $config['hostname'];        }        $dsn .= ';dbname=' . $config['database'];        if (!empty($config['charset'])) {            $dsn .= ';charset=' . $config['charset'];        }        return $dsn;    }    /**     * 取得数据表的字段信息     * @access public     * @param string $tableName     * @return array     */    public function getFields($tableName)    {        list($tableName) = explode(' ', $tableName);        if (false === strpos($tableName, '`')) {            if (strpos($tableName, '.')) {                $tableName = str_replace('.', '`.`', $tableName);            }            $tableName = '`' . $tableName . '`';        }        $sql    = 'SHOW COLUMNS FROM ' . $tableName;        $pdo    = $this->query($sql, [], false, true);        $result = $pdo->fetchAll(PDO::FETCH_ASSOC);        $info   = [];        if ($result) {            foreach ($result as $key => $val) {                $val                 = array_change_key_case($val);                $info[$val['field']] = [                    'name'    => $val['field'],                    'type'    => $val['type'],                    'notnull' => (bool) ('' === $val['null']), // not null is empty, null is yes                    'default' => $val['default'],                    'primary' => (strtolower($val['key']) == 'pri'),                    'autoinc' => (strtolower($val['extra']) == 'auto_increment'),                ];            }        }        return $this->fieldCase($info);    }    /**     * 取得数据库的表信息     * @access public     * @param string $dbName     * @return array     */    public function getTables($dbName = '')    {        $sql    = !empty($dbName) ? 'SHOW TABLES FROM ' . $dbName : 'SHOW TABLES ';        $pdo    = $this->query($sql, [], false, true);        $result = $pdo->fetchAll(PDO::FETCH_ASSOC);        $info   = [];        foreach ($result as $key => $val) {            $info[$key] = current($val);        }        return $info;    }    /**     * SQL性能分析     * @access protected     * @param string $sql     * @return array     */    protected function getExplain($sql)    {        $pdo    = $this->linkID->query("EXPLAIN " . $sql);        $result = $pdo->fetch(PDO::FETCH_ASSOC);        $result = array_change_key_case($result);        if (isset($result['extra'])) {            if (strpos($result['extra'], 'filesort') || strpos($result['extra'], 'temporary')) {                Log::record('SQL:' . $this->queryStr . '[' . $result['extra'] . ']', 'warn');            }        }        return $result;    }    protected function supportSavepoint()    {        return true;    }}
 |