PHP define()和PDO连接字符串问题

时间:2015-12-10 23:10:46

标签: php mysql pdo

在尝试解决切换到PDO后会话丢失的问题时,我制作了一个小测试脚本。

在测试脚本时,我发现页面的每个其他负载都

Access denied for user 'DB_USER'@'[ip snipped]' (using password: YES)

因此DB_USER在每次第二次加载时都是未插入的。页面的第一次加载成功连接。

为什么? PHP版本是5.4.42。

<?
session_start();
define("DB_HOST", "myserver");
define("DB_USER", "myuser");
define("DB_PASS", "mypass");
define("DB_NAME", "mydb");


class DB {  
    protected $link;

    public function __construct() {
        $this->dsn = 'mysql:host=' . DB_HOST . ';dbname=' . DB_NAME . ';charset=utf8';
        $this->connect();
    }

    private function connect() {
        $options = array(
            PDO::ATTR_ERRMODE       => PDO::ERRMODE_EXCEPTION
        );
        $this->pdo = new PDO($this->dsn, DB_USER, DB_PASS, $options);
    }

    public function __sleep() {
        return array('dsn', 'username', 'password');
    }

    public function __wakeup() {
        $this->connect();
    }
}

$db = new DB;

1 个答案:

答案 0 :(得分:1)

public function __wakeup() {
    $this->dsn = 'mysql:host=' . DB_HOST . ';dbname=' . DB_NAME . ';charset=utf8';
    $this->connect();
}

会解决这个问题。 但主要问题是你没有定义像

这样的变量
protected $dsn;

所以wakup失败了。