MYSQL PDO数据库连接



我使用PHP建立一个连接到MYSQL数据库使用PDO。我一直得到这个错误:

Uncaught Error: Call to a member function query() on null

我对这种方法很陌生,但为什么我从查询中得到null ?

这是调用类的代码:
<?php
$data = new Data;
echo $data->connect();

$view = new View;
echo $view->getData();

?>

这是我怀疑存在问题的查询类:

<?php 

class View extends Data {

public function getData() {
$sql = 'SELECT * FROM equipment';
$stm = $this->connect()->query($sql);
while ($row = $stm->fetch()) {
echo $row['manuName'] . '<br>';
}
}
}

?>

这是连接类:

<?php 
class Data {
private $dbHost = DB_HOST;
private $dbUser = DB_USER;
private $dbPass = DB_PASS;
private $dbName = DB_NAME;
private $dbHandler;
private $error;
public function connect() {
$con = 'mysql:host=' . $this->dbHost . ';dbname=' . $this->dbName;
$options = array(
PDO::ATTR_PERSISTENT => true,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
);
try {
$this->dbHandler = new PDO($con, $this->dbUser, $this->dbPass, $options);
} catch (PDOException $e) {
$this->error = $e->getMessage();
echo $this->error;
}
}
}

我没有看到我的错误。如果有人知道为什么我不能提取数据。

谢谢

正如u_mulder在评论中所说,

你的connect方法不会返回任何东西。

我更新它如下,并对你的getData()方法做了一些改变:

public function connect() {
$con = 'mysql:host=' . $this->dbHost . ';dbname=' . $this->dbName;
$options = array(
PDO::ATTR_PERSISTENT => true,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
);
try {
//$this->dbHandler = new PDO($con, $this->dbUser, $this->dbPass, $options);
return  new PDO("mysql:host=".$this->dbHost.";dbname=".$this->dbName,$this->dbUser,$this->dbPass);
} catch (PDOException $e) {
$this->error = $e->getMessage();
echo $this->error;
}
}
}

class View extends Data {

public function getData($table){
try {
$sql="SELECT * FROM $table";
$q = $this->connect()->query($sql) or die("failed!");
while($r = $q->fetch(PDO::FETCH_ASSOC)){  $data[]=$r;  }
return $data;
}
catch(PDOException $e)
{
echo 'Query failed'.$e->getMessage();
}
}

}

$view = new View;
$result = $view->getData('equipment');
print_r($result);

虽然我更喜欢删除连接方法并在Data类中添加一个构造函数,如下所示:

public $this->conn;
public function __construct(){
$this->conn = new PDO("mysql:host=".$this->dbHost.";dbname=".$this->dbName,$this->dbUser,$this->dbPass);
}

,然后改变我的getData如下:

$q = $this->conn->query($sql) or die("failed!");
因为正如ADyson在评论中所说:

你不应该每次运行查询都重新连接。

再次感谢Ali, ADyson &;u_mulder,

如果我理解了所有注释的意思,这段代码应该考虑到你的建议。如果您有时间,您能告诉我这是不是一个更好的方法吗?

数据类:

<?php 
class Data {
private $dbHost = DB_HOST;
private $dbUser = DB_USER;
private $dbPass = DB_PASS;
private $dbName = DB_NAME;
private $error;
public $this->conn;
public function __construct(){
$this->conn = new PDO("mysql:host=".$this->dbHost.";dbname=".$this->dbName,$this->dbUser,$this->dbPass);
}
try {
return new PDO("mysql:host=".$this->dbHost.";dbname=".$this->dbName,$this->dbUser,$this->dbPass);
} catch (PDOException $e) {
$this->error = $e->getMessage();
echo $this->error;
}
}
}

视图类:

<?php 
class View extends Data {

public function getData($table){
try {
$sql="SELECT * FROM $table";
$q = $this->conn->query($sql) or die("failed!");

while($r = $q->fetch(PDO::FETCH_ASSOC)){  $data[]=$r;  }
return $data;
}
catch(PDOException $e)
{
echo 'Query failed'.$e->getMessage();
}
}

}

输出:

<?php
$view = new View;
$result = $view->getData('equipment');
print_r($result);    
?>

这个代码仍然给出错误:

意想不到的"→"(T_OBJECT_OPERATOR),预期","或";">

最新更新