在尝试解决切换到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;
答案 0 :(得分:1)
public function __wakeup() {
$this->dsn = 'mysql:host=' . DB_HOST . ';dbname=' . DB_NAME . ';charset=utf8';
$this->connect();
}
会解决这个问题。 但主要问题是你没有定义像
这样的变量protected $dsn;
所以wakup失败了。