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

时间:2008-09-17 08:18:00

标签: php mysql pear mdb2

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

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

我们使用单个MDB2实例对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实例在其他所有内容后被破坏吗?

启用持久连接有效,但不是理想的答案。

1 个答案:

答案 0 :(得分:1)

从PHP5文档:

  

只要删除了对特定对象的所有引用,或者在关闭序列中或以任何顺序显式销毁对象,就会调用析构函数方法。

     

PHP documentation

(强调我的)

可能发生的事情是你的脚本没有明确地销毁对象,所以当PHP到达脚本的末尾时,它开始以任何顺序清理事物 - 在你的情况下,它正在关闭首先是数据库链接。

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