gpt4 book ai didi

php - MDB2 断开连接并在重新连接时忘记字符集设置

转载 作者:行者123 更新时间:2023-11-29 15:11:14 25 4
gpt4 key购买 nike

我们最近调试了一个奇怪的错误。找到了解决方案,但该解决方案并不完全令人满意。

我们使用 IntSmarty 本地化我们的网站,并使用我们自己的包装器将本地化字符串存储在数据库中。在其析构函数中,IntSmarty 保存它可能具有的任何新字符串,从而导致数据库调用。

我们使用 MDB2 的 Singleton 实例对 MySQL 进行查询,连接后我们使用 SetCharset() 函数将字符集更改为 UTF-8。我们发现,在进行最终插入时,IntSmarty 保存的字符串被解释为 ISO-8859-1。我们仔细查看查询日志,发现在调用IntSmarty的析构函数之前MySQL连接就断开了。然后重新建立,但在新连接上没有发出“SET NAMES utf8”查询。这导致保存的字符串被 MySQL 解释为 ISO-8859-1。

MDB2 上似乎没有设置默认字符集的选项。我们解决这个问题的方法是更改​​ MySQL 服务器配置,添加

init-connect='SET NAMES utf8'

到 my.cnf。这只解决了我们的字符集始终相同的问题。

那么,有什么方法可以防止连接在所有查询运行之前被断开吗?我可以在执行其他操作后强制销毁 MDB2 实例吗?

打开持久连接是可行的,但不是理想的答案。

最佳答案

来自 PHP5 文档:

The destructor method will be called as soon as all references to a particular object are removed or when the object is explicitly destroyed or in any order in shutdown sequence.

PHP documentation

(强调我的)

可能发生的情况是,您的脚本没有显式销毁该对象,因此当 PHP 到达脚本末尾时,它开始按照它感觉的任何顺序清理事物 - 在您的情况下,正在关闭首先是数据库链接。

如果您在脚本实际结束之前显式销毁 IntSmarty 对象,那么应该可以解决您的问题。

关于php - MDB2 断开连接并在重新连接时忘记字符集设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/81061/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com