【发布时间】:2018-11-30 06:00:08
【问题描述】:
很久没用PHP了。需要将一个非常非常旧的站点从 mysql_* 升级到 PDO。迁移运行良好,但数据库是混合Latin1 和utf8 表的可怕混乱。无法改变这一点。
已经看到了一个简洁的解决方案here,您只需为每种类型的字符集创建一个连接,但我的问题是该站点是作为一个类的层次结构构建的,所有这些类都派生自一个 Db 类,它定义了字符集初始化时。
在旧代码中,问题已通过使用mysql_set_charset() “解决”,但不幸的是我找不到 PDO 等价物。
如何在 PDO 连接上动态更改字符集?甚至可能吗? 或者任何人都可以提出一种模式?
这是从 PHP 5.x 升级到 7.2 引起的“发烧救援”,它不是重构整个代码库或数据库的选项。
它或多或少是这样的:
class Db {
private $pdo;
public function __construct() {
$dsn = "mysql:host=".$this->hostname.";dbname=".$this->database.";charset=".$this->charset;
$opt = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false
];
try {
$this->pdo = new PDO($dsn, $this->username, $this->password, $opt);
} catch(PDOException $e) {
echo "Error connecting to database: ". $e->getMessage();
}
}
}
class AnotherClass extends Db {
public function __construct() {
parent::__construct();
...
}
}
class YetAnotherClass extends AnotherClass [
...
}
想在Db 类上实现一个方法,以便我在继承的类中可以执行例如$this->changeCharset('Latin1');
【问题讨论】:
-
是否会通过 __construct() 提供字符集作为参数帮助或在您的情况下有意义?
-
这其实是一个更好的主意!!这是一堆源自相同基类的类,并且它是用作“前端”-PHP 和许多 AJAX 后端的核心的相同基类。但是没有 PHP 类针对字符集不同的多个表。猜猜这是我一直在寻找的“模式”(已经是一个漫长的夜晚,PHP 很远很远)看不到树木的树林:(