我需要将PDO类包装到新类中。问题是在包装某些方法后,它无法访问其他方法。在下面的代码中。它包装查询以执行try catch并返回错误。但是,在我包装了该查询方法之后。我不能在PDO方法之后调用任何方法。像fetchAll等。
class aegis{
private $init, $dsn, $user, $pass;
private $options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_CASE => PDO::CASE_NATURAL,
PDO::ATTR_ORACLE_NULLS => PDO::NULL_EMPTY_STRING
];
private $error = [];
public function __construct($host, $port, $db_name, $user, $pass){
$this->dsn = 'mysql:host='.$host.';port='.$port.';dbname='.$db_name;
$this->user = $user;
$this->pass = $pass;
$this->connect();
}
private function connect(){
try{
$this->init = new PDO($this->dsn, $this->user, $this->pass, $this->options);
}catch(PDOException $e){
if(isset($e)){
array_push($this->error, $e->getCode());
array_push($this->error, $e->getMessage());
array_push($this->error, time());
}
}
}
public function query($sqlStatement){
if(isset($this->init)){
try{
$this->init->query($sqlStatement);
}catch(PDOException $e){
if(isset($e)){
array_push($this->error, $e->getCode());
array_push($this->error, $e->getMessage());
array_push($this->error, time());
}else{
return $this->init->query($sqlStatement);
}
}
}
}
public function close(){
$this->init = NULL;
}
public function logError(){
return $this->error;
}
}
$aegis = new aegis($host, $port, $db_name, $user, $pass);
$rows = $aegis->query("SELECT `market` FROM `result`")->fetchAll();
foreach($rows as $row){
echo $row.'<br>';
}
答案 0 :(得分:1)
我需要将PDO类包装到新类中。
实际上,您没有。您的课程有很多问题,提供的内容很少,以至于原始PDO并没有,因此没有真正的理由偏向于原始PDO。首先了解如何使用PDO(特别是准备好的语句),然后再尝试创建简单的包装器。这是我根据栈溢出Your first database wrapper's childhood diseases在此处提出的数百个类似问题撰写的文章,它将为您的包装程序提供帮助。但是,目前(再次),仅按原样使用原始PDO。
答案 1 :(得分:0)
如果原始呼叫成功query()
,则您的$this->init->query
将不会返回任何内容。但是,如果有一个异常并且没有设置该异常(没有意义),那么它将重新执行查询并返回结果。
public function query($sqlStatement){
if(isset($this->init)){
try{
return $this->init->query($sqlStatement);
}catch(PDOException $e){
array_push($this->error, $e->getCode());
array_push($this->error, $e->getMessage());
array_push($this->error, time());
return false;
}
}
}
不确定发生异常或要重新引发某些异常时要返回什么。但这返回false,这将导致...的问题。
$rows = $aegis->query("SELECT `market` FROM `result`")->fetchAll();
fetchAll()
将失败(它将尝试在fetchAll()
上调用false
)。
替代用途
if ($result = $aegis->query("SELECT `market` FROM `result`") ) {
$rows = $result->fetchAll();
// Output data
}