PHP PDO setAttribute和错误处理

时间:2014-01-30 12:32:25

标签: php mysql pdo character-encoding

我对PDO感到有些困惑。它是正确的形式为set属性charset utf8编写这样的函数以及处理数据库错误吗?

<?php
$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';

try {
    $dbh = new PDO($dsn, $user, $password array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}
?>

感谢。

3 个答案:

答案 0 :(得分:2)

除了简单的语法错误之外,你所做的恰到好处。您错过了逗号

 $dbh = new PDO($dsn, $user, $password ,array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));
                                     //^----- You missed adding this

答案 1 :(得分:1)

试试这个

$link = new PDO("mysql:host=localhost;dbname=DB;charset=UTF8");

或者这也很好

link = new PDO('mysql:host=myhost;dbname=mydb', 'login', 'password', array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'')); 

其他一切都还可以。

答案 2 :(得分:1)

您的设置编码方式仅建议在旧的PHP安装(早于PHP / 5.3.6)中使用,但非常旧 - 我不记得确切的版本,但您必须运行<{1}}手动查询尚未实现SET NAMES的旧版本。

推荐的方法是DSN itself中的相应参数:

  

<强>字符集

     

字符集。请参阅字符集概念文档   更多信息。

     

在PHP 5.3.6之前,这个元素被默默地忽略了。相同   行为可以部分复制   PDO::MYSQL_ATTR_INIT_COMMAND驱动程序选项

最后,您可以在构造函数中一次设置所有设置。无需单独执行PDO::MYSQL_ATTR_INIT_COMMAND次呼叫。