【问题标题】:What is the right way to pass a database object from one method to another in a class在类中将数据库对象从一种方法传递到另一种方法的正确方法是什么
【发布时间】:2012-09-08 22:01:05
【问题描述】:

我需要帮助以了解将在一种方法中创建的对象(MySQL 连接)传递给同一类中的另一种方法的正确方法。

我正在尝试创建一个使用构造函数和所有其他方法加载连接的数据库类,使用此连接来执行它们各自的功能。

在尝试这样做时,我不断收到此错误:

致命错误:在第 44 行的 /database.php 中的非对象上调用成员函数 query()

我的代码:

class database
{ 
    public $mysqli;

    public function __construct($database_server, $database_name, $database_user, $database_pass)
    {
        $mysqli = new mysqli($database_server,$database_user, $database_pass, $database_name);

        if ($mysqli->connect_error)
        {
                  die('Connect Error (' . $mysqli->connect_errno . ') '. $mysqli->connect_error);
        }
        echo "Database connection established successfully.<br>";
        return $this->mysqli;

    }

    public function fetch_data()
    {

        $query = "select * from payment";
        if ($result = $this->mysqli->query($query))
        {

            // fetch associative array
            while ($row = $result->fetch_assoc())
            {
                printf ("%s (%s)\n", $row["id"], $row["status"]);
            }

        }

    }
}

任何帮助将不胜感激。谢谢大家。

【问题讨论】:

    标签: php mysql parameter-passing


    【解决方案1】:

    正如其他人已经提到的,你应该像这样设置 mysqli:

    $this->mysqli = new mysqli($database_server,$database_user, $database_pass, $database_name);
    

    我建议不要死在构造函数中,这不是由数据库类决定而是由数据库类的用户决定。改成这样:

    class database
    { 
        private $mysqli;
        public $error = false;
    
        public function __construct($database_server, $database_name, $database_user, $database_pass)
        {
            $this->mysqli = new mysqli($database_server,$database_user, $database_pass, $database_name);
    
            if ($mysqli->connect_error)
              $this->error = 'Connect Error (' . $mysqli->connect_errno . ') '. $mysqli->connect_error);
    
        }
    

    在像$db = new Database( ... ); 这样构建数据库时,您可以检查错误属性,然后决定做什么。

    【讨论】:

      【解决方案2】:

      您实际上并没有创建 $mysqli 作为您的类的属性。

      你需要:

      class database
      {
      
      public $mysqli;
      
      public function __construct($database_server, $database_name, $database_user, $database_pass)
      {
          $this->mysqli = new mysqli($database_server,$database_user, $database_pass, $database_name);
      
          if ($this->mysqli->connect_error)
          {
                    die('Connect Error (' . $this->mysqli->connect_errno . ') '. $this->mysqli->connect_error);
          }
          echo "Database connection established successfully.<br>";
          return $this->mysqli;
      
      }
      

      class database
      {
      
      public $mysqli;
      
      public function __construct($database_server, $database_name, $database_user, $database_pass)
      {
          $mysqli = new mysqli($database_server,$database_user, $database_pass, $database_name);
      
          if ($mysqli->connect_error)
          {
                    die('Connect Error (' . $mysqli->connect_errno . ') '. $mysqli->connect_error);
          }
          echo "Database connection established successfully.<br>";
          $this->mysqli = $mysqli;
          return $this->mysqli;
      
      }
      

      【讨论】:

      • 感谢利亚姆帮助我。我真的很感激。
      【解决方案3】:

      你没有在任何地方设置$this-&gt;mysqli,你需要在你的构造中设置$this-&gt;mysqli = $mysqli;而不是return $this-&gt;mysqli

      【讨论】:

        【解决方案4】:
        public function __construct($database_server, $database_name, $database_user, $database_pass)
        {
            $mysqli = new mysqli($database_server,$database_user, $database_pass, $database_name);
        
            if ($mysqli->connect_error)
            {
                      die('Connect Error (' . $mysqli->connect_errno . ') '. $mysqli->connect_error);
            }
            echo "Database connection established successfully.<br>";
        
            // instead of return, just set the local variable to the `mysqli` property.
            $this->mysqli = $mysqli;
        
        }
        

        或者

        public function __construct($database_server, $database_name, $database_user, $database_pass)
        {
            $this->mysqli = new mysqli($database_server,$database_user, $database_pass, $database_name);
        
            if ($this->mysqli->connect_error)
            {
               die('Connect Error (' . $this^>mysqli->connect_errno . ') '. $this->mysqli->connect_error);
            }
            echo "Database connection established successfully.<br>";    
        }
        

        public $mysqli; 最好是protected

        【讨论】:

        • 感谢您花时间回答 mt 问题。您的代码实际上帮助我纠正了我的愚蠢错误。此外,所有函数都应该返回一个值。所以我不应该使用 $this->mysqli = $mysqli;返回 $this->mysqli;这是必需的吗?这是矫枉过正吗?我想学习正确正确的方法。
        • @user1675547 不,构造函数不应返回值。
        猜你喜欢
        • 2013-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多