You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
140 lines
3.5 KiB
PHP
140 lines
3.5 KiB
PHP
<?php
|
|
|
|
namespace Workerman\Lib;
|
|
class Db
|
|
{
|
|
|
|
public $db;
|
|
private static $instance = array();
|
|
|
|
public function __construct($data)
|
|
{
|
|
$dsn = "mysql:dbname=" . $data['dbname'] . ";host=" . $data['dbhost'];
|
|
$this->db = new \PDO($dsn, $data['dbuser'], $data['dbpassword']);
|
|
$this->db->query('set character set utf8mb4;');
|
|
$this->db->setAttribute(\PDO::ATTR_EMULATE_PREPARES, false);
|
|
}
|
|
|
|
public static function get($key = 'Main'): Db
|
|
{
|
|
$database['dbname'] = Tool::ini($key . 'DbName');
|
|
$database['dbuser'] = Tool::ini($key . 'DbUser');
|
|
$database['dbpassword'] = Tool::ini($key . 'DbPassword');
|
|
$database['dbhost'] = Tool::ini($key . 'DbHost');
|
|
if (!isset(self::$instance[$database['dbname']]) || !self::$instance[$database['dbname']] instanceof self) {
|
|
self::$instance[$database['dbname']] = new Db($database);
|
|
} else {
|
|
try {
|
|
//断线重连
|
|
self::$instance[$database['dbname']]->db->getAttribute(\PDO::ATTR_SERVER_INFO);
|
|
} catch (\PDOException $e) {
|
|
if (strpos($e->getMessage(), 'MySQL server has gone away') !== false) {
|
|
self::$instance[$database['dbname']] = new Db($database);
|
|
}
|
|
}
|
|
}
|
|
|
|
return self::$instance[$database['dbname']];
|
|
}
|
|
|
|
|
|
/*********PDO**********/
|
|
public function count($sql, $parameters = null): int
|
|
{
|
|
return $this->exeupdate($sql, $parameters);
|
|
}
|
|
|
|
public function querysql($sql, $parameters = null)
|
|
{
|
|
return $this->exeupdate($sql, $parameters);
|
|
}
|
|
|
|
|
|
public function querysqlinsertid($sql, $parameters = null)
|
|
{
|
|
if ($this->exeupdate($sql, $parameters)) {
|
|
return $this->db->lastInsertId();
|
|
} else {
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
public function getRow($sql, $parameters = null)
|
|
{
|
|
$res = $this->exequery($sql, $parameters);
|
|
if (count($res) > 0) {
|
|
|
|
return $res[0];
|
|
} else {
|
|
return array();
|
|
}
|
|
}
|
|
|
|
public function getAll($sql, $parameters = null)
|
|
{
|
|
$res = $this->exequery($sql, $parameters);
|
|
if (count($res) > 0) {
|
|
return $res;
|
|
} else {
|
|
return array();
|
|
}
|
|
}
|
|
|
|
public function beginTransaction()
|
|
{
|
|
$this->db->beginTransaction();
|
|
}
|
|
|
|
public function rollback()
|
|
{
|
|
$this->db->rollback();
|
|
}
|
|
|
|
public function commit()
|
|
{
|
|
$this->db->commit();
|
|
}
|
|
|
|
public function exequery($sql, $parameters = null)
|
|
{
|
|
$conn = $this->db;
|
|
$stmt = $conn->prepare($sql);
|
|
$stmt->execute($parameters);
|
|
$rs = $stmt->fetchall(\PDO::FETCH_ASSOC);
|
|
$stmt = null;
|
|
$conn = null;
|
|
return $rs;
|
|
}
|
|
|
|
public function exeupdate($sql, $parameters = null)
|
|
{
|
|
$stmt = $this->db->prepare($sql);
|
|
$stmt->execute($parameters);
|
|
$affectedrows = $stmt->rowcount();
|
|
$stmt = null;
|
|
$conn = null;
|
|
return $affectedrows;
|
|
}
|
|
|
|
public function checklink()
|
|
{
|
|
$res = $this->db->getAttribute(\PDO::ATTR_SERVER_INFO);
|
|
if (strpos($res, 'server has gone away') !== false) {
|
|
$this->db = null;
|
|
return false;
|
|
} else {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
public function getinsertid()
|
|
{
|
|
return $this->db->lastInsertId();
|
|
}
|
|
|
|
public function close()
|
|
{
|
|
return $this->db = null;
|
|
}
|
|
} |