db_link = new \PDO("mysql:host={$params['host']};port={$params['port']};dbname={$params['name']}", $params['user'], $params['pwd'], []); } catch (\Exception $e) { trigger_error($e->getMessage()); } $this->db_link->query("SET NAMES {$params['charset']}"); $this->db_link->query("SET sql_mode='NO_ENGINE_SUBSTITUTION'"); if (!$this->db_link) { trigger_error($params['driver'] . ' Server connect fail!
Error Message:' . $this->db_link->error() . '
Error Code:' . $this->db_link->errno(), E_USER_ERROR); } $this->debug = Config::get('database.debug', Config::get('app.debug', false)); } /** * 执行SQL语句 * SQL语句执行函数 * * @access public * @param string $sql SQL语句内容 * @return bool */ public function execute(string $sql, array $bindparams = []) { //参数分析 if (!$sql) { return false; } //释放前次的查询结果 if (!empty($this->PDOStatement) && $this->PDOStatement->queryString != $sql) { $this->free(); } $this->PDOStatement = $this->db_link->prepare($sql); foreach ($bindparams as $k => $v) { $this->PDOStatement->bindValue($k, $bindparams[$k]); } $realSql = $this->getRealSql($sql, $bindparams); if ($this->debug) { $t = microtime(true); $result = $this->PDOStatement->execute(); $t = number_format(microtime(true) - $t, 5); Registry::merge('_sql', $t . ' - ' . $realSql); } else { $result = $this->PDOStatement->execute(); } $this->sql = $realSql; Registry::setInc('_sqlnum'); return $result; } /** * 获取数据库错误描述信息 * * @access public * @return string */ public function errorInfo() { if ($this->PDOStatement) { $error = $this->PDOStatement->errorInfo(); } else { $error = $this->db_link->errorInfo(); } if ($error['0'] == '0000') { return ''; } else { return $error['2']; } } /** * 获取数据库错误信息代码 * * @access public * @return int */ public function errorCode() { return $this->PDOStatement->errorCode(); } /** * 通过一个SQL语句获取一行信息(字段型) * * @access public * @param string $sql SQL语句内容 * @return mixed */ public function fetch(string $sql, array $bindParams = []) { $result = $this->execute($sql, $bindParams); if (!$result) { return false; } $myrow = $this->PDOStatement->fetch(\PDO::FETCH_ASSOC); $this->free(); if (!$myrow) return null; return $myrow; } /** * 通过一个SQL语句获取全部信息(字段型) * * @access public * @param string $sql SQL语句 * @return array|mixed */ public function fetchAll(string $sql, array $bindParams = []) { $result = $this->execute($sql, $bindParams); if (!$result) { return false; } $myrow = $this->PDOStatement->fetchAll(\PDO::FETCH_ASSOC); $this->free(); if (!$myrow) { return []; } return $myrow; } /** * 获取insert_id * * @access public * @return int */ public function insertId() { return $this->db_link->lastInsertId(); } /** * 开启事务处理 * * @access public * @return boolean */ public function startTrans() { if ($this->Transactions == false) { $this->db_link->beginTransaction(); $this->Transactions = true; } return true; } /** * 提交事务处理 * * @access public * @return boolean */ public function commit() { if ($this->Transactions == true) { if ($this->db_link->commit()) { $this->Transactions = false; } } return true; } /** * 事务回滚 */ public function rollback() { if ($this->Transactions == true) { $this->db_link->rollBack(); $this->Transactions = false; } } /** * 关闭数据库连接 */ public function __destruct() { $this->free(); if ($this->db_link == true) { $this->db_link = null; } } /** * SQL指令安全过滤 * * @access public * @param string $str SQL字符串 * @return string */ public function quote($str) { return $this->db_link->quote($str); } /** * 根据参数绑定组装最终的SQL语句 便于调试 * * @access public * @param string $sql 带参数绑定的sql语句 * @param array $bind 参数绑定列表 * @return string */ public function getRealSql($sql, array $bind = []) { foreach ($bind as $key => $val) { $val = $this->quote($val); // 判断占位符 $sql = str_replace($key, $val, $sql); } return $sql; } /** * 释放查询结果 * * @access public */ public function free() { $this->PDOStatement = null; } /** * 返回最后插入行的ID或序列值 * * @return string */ public function lastInsertId() { return $this->db_link->lastInsertId(); } /** * 返回受上一个 SQL 语句影响的行数 * * @return bool|int */ public function rowCount() { if ($this->PDOStatement) { return $this->PDOStatement->rowCount(); } else { return false; } } public function lastSql() { $sql = $this->sql; if ($sql) { return $sql; } else { return '没有语句,请执行sql或者开启debug'; } } }