2013-07-26 26 views
2

PDO :: MYSQL_ATTR_INIT_COMMAND似乎打亂了查詢,請嘗試自己。如果使用MYSQL_ATTR_INIT_COMMAND,PDO會拋出錯誤

以下:

$connection = new \PDO("mysql:host=localhost;dbname=php_orm_test", "dev", "dev",[ 
    PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES UTF8; SET CHARACTER SET UTF8; SET character_set_connection=UTF8; SET character_set_client=UTF8;" 
    ]); 
    $statement = $connection->prepare("describe users"); 
    $statement->execute(); 
    $statement->fetchAll(\PDO::FETCH_ASSOC); 
    var_dump($statement->errorInfo()); 
    $statement->closeCursor(); 

拋出:

array(3) { 
    [0]=> 
    string(5) "00000" 
    [1]=> 
    int(2014) 
    [2]=> 
    string(269) "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." 
} 

如果我刪除MYSQL_ATTR_INIT_COMMAND一切工作正常,而不是...任何想法?

注意到,即使不這樣做的工作......

PDO::MYSQL_ATTR_INIT_COMMAND => self::DRIVER_INIT, 
    PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true 
+0

您的意思是「SET NAMES UTF8; SET CHARACTER SET UTF8; SET character_set_connection = UTF8; SET character_set_client = UTF8;」疑問?爲了能夠在不修改mysql.cnf的情況下使用utf8編碼。不管怎麼說,還是要謝謝你! –

+0

作爲一個便箋,您可能需要utf8mb4而不是utf8。請參閱https://mathiasbynens.be/notes/mysql-utf8mb4 – bodo

回答

6

您正在使用PHP> = 5.3.6,所以加字符集到的DSN,並且不使用PDO::MYSQL_ATTR_INIT_COMMAND。此外,我認爲你只能執行1個查詢PDO::MYSQL_ATTR_INIT_COMMAND。這可能是問題所在。

mysql:host=localhost;dbname=php_orm_test;charset=utf8 
+0

嗯,這並不能解釋爲什麼init命令會導致錯誤,但是可以避免該命令,再次使用utf8並繼續工作! –

+0

只有1個查詢?非常愚蠢我猜...你有鏈接,你發現這個?謝謝紅色! –

+0

[here](http://grokbase.com/t/php/php-bugs/0978f443vg/48859-new-pdo-mysql-does-not-support-multiple-inital-queries)是一個錯誤報告。不知道它是否在新的PHP版本中修復。但它看起來不是。 – bitWorking

4

您至少可以使用多個由逗號分隔的SET語句,例如, SET names utf8, @@session.sql_mode = '';

相關問題