【问题标题】:PHP Call a databaseclass inside a classPHP 在类中调用数据库类
【发布时间】:2014-09-23 17:34:14
【问题描述】:

我对课程和 PDO 非常陌生。 我已经在谷歌上搜索了几个小时,以找到一个可能很简单的问题的解决方案。

事情是这样的。我做了一个类来连接到我的数据库。 然后,我创建了一个类来使用查询从数据库中加载信息。 然后,我使用脚本来组合这两个类。 虽然,即使我连接到数据库,在我的其他课程中仍然无法理解它。 我不断收到错误:

未定义变量:db

试图获取非对象的属性

在非对象中调用成员函数prepare()

关于我在 Invoice 类中的 $query = $db->conn->prepare 语句。

我该如何解决这个问题??

我有以下数据库类:

class database
{
    private $host;
    private $dbname;
    private $username;
    private $password;
    public $conn;

    public function __construct($host,$db,$name,$pass)
    {
        $this->host=$host;
        $this->dbname=$db;
        $this->username=$name;
        $this->password=$pass;
        $dsn = 'mysql:'.$this->dbname.';'.$this->host;
        try {
            $this->conn = new PDO($dsn, $this->username, $this->password);
            $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            echo"connection made";
        } catch (PDOException $e) {
            echo"Could not connect to the database";
            die;
        }       
    }   
}   

?>

然后,有一个从数据库构建信息的类(发票类)

class Invoice{
    var $customerID;
    var $customerSalutation;
    var $customerFirstName;
    var $customerMiddleName;
    var $customerLastName;
    var $customerCompanyName;
    var $customerStreetName;
    var $customerHouseNumber;
    var $customerHouseNumberSuffix;
    var $customerPostalCode;
    var $customerCountry;


    function set_customer($id){
        if ((!isset($id)) or ($id=="")){
            echo "No customerID specified";
            die;
        } else {
            if (ctype_digit($id)){
                $query = $db->conn->prepare('
                SELECT CustomerID, CustomerSalutation, CustomerFirstName, CustomerMiddleName, CustomerLastName, CustomerCompanyName, CustomerStreetName,
                CustomerHouseNumber, CustomerHouseNumberSuffix, CustomerPostalCode, CustomerCountry WHERE CustomerID = :customerID');

                $array = array (
                    'customerid' => $this->customerID
                );

                $query->execute($array);                

            } else {
                echo "Invalid customer ID";             
                die;
            }
        }
    }
}
?>

我都打开它,在以下基本脚本中:

<?php
include('database.php'); //open database class
$host="localhost";
$db="dbname";
$name="root";
$pass="";

$db = new database($host,$db,$name,$pass);

include('InvoiceBuilderClass.php'); //include invoice class

$invoice = new Invoice();

$cusID="1";
$invoice->set_customer($cusID);
?>

【问题讨论】:

  • 您永远不会将您的 $db 实例提供给您的 Invoice。它如何与 $db 一起工作?
  • 是的,我认为这是一个问题,不知道如何解决它。我最终用“global $db;”修复了它就在查询之前。这似乎奏效了。

标签: php mysql class pdo


【解决方案1】:

在您的“发票”类中,将 $db 添加到您的成员变量列表中:

// (...)
var $customerPostalCode;
var $customerCountry;
var $db;

然后你需要向你的类“发票”添加一个构造函数,你将你的数据库实例传递给:

public function __construct($db)
{
    $this->db = $db;
}

在你的类的其他“方法”(函数)中,你需要像这样访问这个成员变量

$this->db->conn->prepare('...');

在您的“基本脚本”中,您只需将“数据库”类的实例传递给“发票”类:

$invoice = new Invoice($db);

【讨论】:

  • 优秀的解决方案!谢谢您的答复。我设法通过在我的函数中添加一个全局 $db 来修复它,但我想这个解决方案更好!
【解决方案2】:

$db 在您的班级正文中不可见。您应该将其作为参数传递(即传递给 Invoice 构造函数,或使用 global

熟悉 PHP 中的变量作用域 (docs)。

【讨论】:

  • 感谢您提供的文档。我知道一两个 abotu 变量,但这个文档令人大开眼界。谢谢 :)
猜你喜欢
  • 1970-01-01
  • 2014-01-08
  • 2012-07-20
  • 2011-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多