2008-09-17 43 views
0

我們最近調試了一個奇怪的錯誤。找到了解決方案,但解決方案並不完全令人滿意。MDB2斷開連接並忘記重新連接時的字符集設置

我們使用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實例在一切之後被破壞嗎?

打開持續連接的工作原理,但不是所需的答案。

回答

1

從PHP5文檔:

作爲一個特定對象的所有引用被移除或當對象被顯式銷燬,或在關閉序列任何順序析構函數方法將被立即調用。

PHP documentation

(重點煤礦)

什麼是可能發生的事情是,你的腳本不明確銷燬對象,所以當PHP獲取到腳本的末尾就開始清理以任何順序發生的事情 - 在你的情況下,首先關閉數據庫鏈接。

如果您在腳本實際結束之前明確銷燬IntSmarty對象,那應該可以解決您的問題。

相關問題