【问题标题】:Getting query error in OOP php在 OOP php 中获取查询错误
【发布时间】:2017-01-18 10:24:47
【问题描述】:

我只是使用 OOP php 的新手,我很难弄清楚如何使用类方法在数据库中查询。这是我的代码,我遇到了一个我不知道如何解决的错误。

我声明了连接变量,但我不知道为什么它是未定义的

注意:未定义变量:连接

致命错误:在非对象中调用成员函数 query()

db.php

class DbConnector {

   private $serverName;
   private $userName;
   private $password;
   private $dbName;
   private $connection;

   public function __construct(){
      $this->serverName = "localhost";
      $this->userName = "root";
      $this->password = "attl";
      $this->dbName = "oop";

      $this->connection = new mysqli($this->serverName, $this->userName, $this->password, $this->dbName);

      if ($this->connection->connect_error) {
          $this->connection = die("Connection failed: " . $this->connection->connect_error);
      } 
  }

  public function getConnection(){
      return $this->connection;
  }
}

index.php

include('../queries/db.php');

class Users{

  private $connection;

  public function __construct(){
      $con = new DbConnector();
      $connection = $con->getConnection();
  }
  public function getUsers(){
      $sql = $connection->query("SELECT * FROM login");

      while($getUsers = $sql->fetch_array()){
          echo $getUsers['username'];
      }
  }

}

$user = new Users();
return $user->getUsers();

【问题讨论】:

  • 在@hanky panky 上面标记的链接上非常不同
  • 原来的问题是I'm getting error Notice: Undefined variable: connection in C:\xampp\htdocs\oop\views\index.php on line 13 所以恕我直言,重复的标志可以帮助您快速解决问题
  • 你得到什么错误?
  • 是的,谢谢,但它非常不同,因为寻找链接它不是类 OOP 方法。 @HankyPanky
  • 注意:未定义变量:第 13 行 C:\xampp\htdocs\oop\views\index.php 中的连接 致命错误:在 C 中的非对象上调用成员函数 query() :\xampp\htdocs\oop\views\index.php 第 13 行。我不知道,但已声明连接。 @MUNISHKUMAR

标签: php mysql oop


【解决方案1】:

您的问题是您正在尝试访问本地范围的变量而不是类属性

public function getUsers(){
  $sql = $connection->query("SELECT * FROM login"); // HERE

  while($getUsers = $sql->fetch_array()){
      echo $getUsers['username'];
  }
}

在该范围内找不到名为$connection 的变量,您需要使用$this 访问对象属性。

class Users {

  private $connection;

  public function __construct()
  {
      $con = new DbConnector();
      // Assign this to object propety declared above 
      $this->connection = $con->getConnection();
  }

  public function getUsers()
  {
      // now access the object property set in constructor.
      $sql = $this->connection->query("SELECT * FROM login");

      while($getUsers = $sql->fetch_array()){
          echo $getUsers['username'];
      }
  }
}

【讨论】:

  • 干杯安德鲁。正如我之前告诉 OP 的那样;我没有看到您在此处发布的答案,我问她问题是否仍然存在,因此我花时间对其进行测试并找出她哪里出错了,并且正在将其全部输入。您的回答很好地说明了这一点。
【解决方案2】:

由于您将以下内容声明为私有:
private $connection;

并将其包含在您的构造中:

  public function __construct(){
      $con = new DbConnector();
      $connection = $con->getConnection();

你需要使用$this作为它的属性:

$this->connection = $con->getConnection();

然后改变:

$sql = $connection->query

$sql = $this->connection->query

为了使用连接属性。

现在,我不得不承认我不是 OOP 专家,可能有另一种方法可以解决这个问题,但这是我从中得到的,对我有用。

【讨论】:

  • 谢谢免费 -ii- 我只是重新编写代码并运行它。如果你再次看到我的另一个问题.. 哈哈它与这里不同。但另一个问题更多关于控制器,我不知道它是如何工作的。我只是想慢慢学习MVC。
  • TBH,在看到其他答案之前,我已经写了这个。我不是在这里为代表踢 lol 只是说。 @GeninaAnneGabuten 我很高兴您找到了完整的解决方案。不客气干杯
猜你喜欢
  • 2018-11-23
  • 1970-01-01
  • 2015-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-30
相关资源
最近更新 更多