Namistai
Новичок
Привет.
PDO lastInsertId() выдает 0, при определенных обстоятельствах. А именно когда PDO завернут в другой объект и из этой обертки вызывается. Обертка нужна для реконнекта при обрыве, только для этой цели я ее использую. Если вызывать lastInsertId() без обертки, то всё работает как надо и ID выдаются, а из обертки - всегда 0.
Вот код класса обертки:
Помогите разобраться.
PDO lastInsertId() выдает 0, при определенных обстоятельствах. А именно когда PDO завернут в другой объект и из этой обертки вызывается. Обертка нужна для реконнекта при обрыве, только для этой цели я ее использую. Если вызывать lastInsertId() без обертки, то всё работает как надо и ID выдаются, а из обертки - всегда 0.
Вот код класса обертки:
Код:
class R_PDO {
protected $pdo_conn;
protected $dsn, $username, $password, $driver_options;
public function __construct($dsn, $username, $password, $driver_options) {
$this -> dsn = $dsn;
$this -> username = $username;
$this -> password = $password;
$this -> driver_options = $driver_options;
$this -> connect();
}
public function __destruct() {
$this -> pdo_conn = null;
}
public function __call($name, array $arguments) {
try {
$this -> connection() -> query("SHOW STATUS;") -> execute();
} catch(PDOException $e) {
if($e->getCode() != 'HY000' || !stristr($e->getMessage(), 'server has gone away')) {
throw $e;
} else {
write_logs('R_PDO: connection fail, reconnecting...');
$this -> reconnect();
}
}
return call_user_func_array(array($this -> connection(), $name), $arguments);
}
protected function connection() {
return $this -> pdo_conn instanceof PDO ? $this -> pdo_conn : $this -> connect();
}
public function connect() {
try {
$this -> pdo_conn = new PDO($this -> dsn, $this -> username, $this -> password, (array)$this -> driver_options);
$this -> pdo_conn -> setAttribute(PDO :: ATTR_ERRMODE, PDO :: ERRMODE_EXCEPTION);
} catch(PDOException $e) {
write_logs($e->getMessage());
die();
}
return $this -> pdo_conn;
}
public function reconnect() {
$this -> pdo_conn = null;
return $this -> connect();
}
}
Помогите разобраться.