41 lines
1.3 KiB
PHP
41 lines
1.3 KiB
PHP
<?php
|
|
namespace core\db;
|
|
|
|
use PDO;
|
|
use PDOException;
|
|
|
|
/**
|
|
* 数据库操作类
|
|
*/
|
|
class Db
|
|
{
|
|
private static $pdo = null;
|
|
|
|
public static function pdo()
|
|
{
|
|
if (self::$pdo !== null) {
|
|
return self::$pdo;
|
|
}
|
|
|
|
try {
|
|
$dsn = sprintf('mysql:host=%s;dbname=%s;charset=utf8mb4', DB_HOST, DB_NAME);
|
|
$option = array(
|
|
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
|
|
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
|
|
// 强制开启查询缓冲:避免「2014 Cannot execute queries while other
|
|
// unbuffered queries are active」。该连接在多处被复用(单例),
|
|
// 若不缓冲,前一条语句的结果集未取完就会阻塞后续查询。
|
|
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
|
|
);
|
|
|
|
$pdo = new PDO($dsn, DB_USER, DB_PASS, $option);
|
|
// 部分环境在构造选项里设置不生效,再显式 setAttribute 兜底
|
|
$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
|
|
return self::$pdo = $pdo;
|
|
} catch (PDOException $e) {
|
|
error_log('DB connection error: ' . $e->getMessage());
|
|
exit('数据库连接失败,请联系管理员');
|
|
}
|
|
}
|
|
}
|