【问题标题】:PHP MYSQL PDO Database ConnectionPHP MYSQL PDO 数据库连接
【发布时间】:2021-12-06 17:38:17
【问题描述】:

我正在使用 PHP 建立与使用 PDO 的 MYSQL 数据库的连接。我不断收到此错误:

Uncaught Error: Call to a member function query() on 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;
        }
    }
}

我没有看到我的错误。如果有人能明白为什么我无法提取数据。

谢谢

【问题讨论】:

  • 显然 $this-&gt;connect() 返回 nothing
  • 但是您不应该每次运行查询时都再次连接...
  • 亲爱的 u_mulder 和 ADyson 请阅读我的回答,如果您有任何意见,请告诉我

标签: php mysql pdo


【解决方案1】:

正如 u_mulder 在 cmets 中所说,

您的连接方法不会返回任何内容。

我将其更新如下并对您的 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 在 cmets 中所说:

您不应该在每次运行查询时都再次连接..

【讨论】:

  • 请阅读我的评论。
  • 这里很重要,我感谢您的修复。我希望更好地学习以这种方式使用 php,所以我想了解我原始代码中的问题。我还将研究构造方法。谢谢,
  • 问题是您没有在 Connect 方法中返回任何内容。无论如何,我很高兴我的回答对你有所帮助
【解决方案2】:

再次感谢 Ali、ADyson 和 u_mulder,

如果我理解所有 cmets 的意思,那么这段代码应该会考虑到您的建议。如果你有时间,请告诉我这是否是一个更好的方法。

数据类:

<?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),需要 ',' 或 ';'

【讨论】:

  • 对于您没有在方法中编写代码的新代码!事实上,在添加构造函数之后你就不需要了
  • 所以你的意思是我应该删除整个 getData 函数并简单地说: $sql="SELECT * FROM $table"; $q = $this->connect()->query($sql) 或 die("失败!");而($r = $q->fetch(PDO::FETCH_ASSOC)){ $data[]=$r; } 返回$数据;对不起,我是新手,之前没有使用过构造函数,所以我有点困惑
  • 是的。如果你创建了一个 __construct() 函数,当你从一个类中创建一个对象时,PHP 会自动调用这个函数。
猜你喜欢
  • 2013-05-14
  • 2021-02-25
  • 2016-08-10
  • 2016-03-27
  • 1970-01-01
  • 1970-01-01
  • 2013-08-03
  • 1970-01-01
相关资源
最近更新 更多