2016-02-15 20 views
2

我使用這個PDO連接:PDO:在PDO多個命令:: MYSQL_ATTR_INIT_COMMAND

try{ 

$db=new PDO(" 
mysql:host=localhost; 
dbname=...", 
"dbu...", 
"pass", 
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET lc_time_names='de_DE'")); 
} 
catch(PDOException $e){die("Error!");} 

現在我想補充的另一個init命令:

array(
PDO::MYSQL_ATTR_INIT_COMMAND => "SET lc_time_names='de_DE'", 
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8" 
) 

但它看起來像了utf8-one會覆蓋第一個init命令。

所以我已經試過這一個,但也沒有成功:

array(
PDO::MYSQL_ATTR_INIT_COMMAND => array("SET lc_time_names='de_DE'","SET NAMES utf8") 
) 

不知道如何發送不僅僅是一個init命令嗎?

謝謝!

回答

12

正確的語法是:

array 
(
    PDO::MYSQL_ATTR_INIT_COMMAND 
    => 
    "SET lc_time_names='de_DE',NAMES utf8" 
) 

因此,NOT多個陣列,但字符串逗號作爲分隔和而不必重複SET


編輯:用official documentation根據:

甲SET語句可以包含多個變量賦值,用逗號分開。

+1

你救了我大量的時間。 –

-3
  1. 你不需要它。你試圖放在PDO::MYSQL_ATTR_INIT_COMMAND的一切都不屬於那裏。這不是什麼「init命令」,而只是常規的SQL查詢,只能在連接後以通常的方式運行。
  2. 關於SET NAMES特定查詢,您不應該以任何方式使用它,因爲您應該通過DSN設置編碼。

因此,你的代碼應該是

$db=new PDO("mysql:host=localhost;dbname=...;charset=utf8","dbu...","pass"); 
$db->query("SET lc_time_names='de_DE'"); 
$db->query("whatever else SQL you have fancy to run"); 

注意,不應該像catch(PDOException $e){die("Error!");}是什麼,以及

+0

這不是一個解決方案。在__construct中'PDO'不會自動連接。但是你的查詢只執行一次。如果PDO失去連接,它將重新連接並且會話再次具有默認值。 – iRaS