2012-04-16 36 views
0

我已經在我的連接庫代碼中引入了$PDO->query('SET NAMES utf8;');以獲得一些Unicode合規性。這可以在一些主機上運行,​​我可以使用.execute()通過INSERT執行PDO語句。某些主機不喜歡SET NAMES utf8 - 「當其他未緩衝的查詢處於活動狀態時,無法執行查詢。」

然而,在一些託管計劃,我遇到這個錯誤:

General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.

因此,SET名之前,我介紹$PDO->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, TRUE);,但我仍然得到錯誤。然後我將該值設置爲FALSE,但仍然出現錯誤。

當然,如果我刪除"SET NAMES utf8"聲明,問題就會消失。再次 - 這個問題只發生在一些網絡主機上。

將MySQL切換到適用於大多數Linux主機計劃的Unicode的正確方法是什麼?

+0

它是使用這個mysql連接運行的第一個查詢(作爲PDO對象)嗎?一旦連接打開,我將設置名稱。 – rahmanisback 2012-04-16 11:14:09

+0

是的,我的代碼只有在連接第一次打開時纔會執行,之後再也不會再執行。 – Volomike 2012-04-16 13:42:08

回答

2

設置連接編碼UTF-8的優選方式是在PDO構造使用PDO::MYSQL_ATTR_INIT_COMMAND,如圖the manual

$dsn  = 'mysql:host=localhost;dbname=testdb'; 
$username = 'username'; 
$password = 'password'; 
$options = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'); 

$dbh = new PDO($dsn, $username, $password, $options); 

這應該總是工作。

+0

我會盡力回覆你。謝謝! :) – Volomike 2012-04-16 13:41:26

+0

不幸的是,這隻有在我每次需要執行PDO任務時創建一個新的PDO對象纔有用。我無法實現靜態對象變量,並在完成PDO任務後重新使用它。我會得到用戶緩衝查詢錯誤。所以,這不適合。你有什麼建議? – Volomike 2012-04-18 07:58:12

+0

我正在嘗試使用$ stmt-> closeCursor();在我的代碼中,我執行一些SQL並完成,但想要啓用連接以在另一個函數中重用。很明顯,除非我使用closeCursor(),否則某些版本的PHP會給我帶來悲傷。如果有效,我會在明天回來。 – Volomike 2012-04-19 08:11:03

相關問題