【问题标题】:query mysql database from inside a class从类内部查询 mysql 数据库
【发布时间】:2012-10-19 23:48:16
【问题描述】:

我正在尝试从一个类中运行对 MySQL 数据库的查询,但由于某种原因它无法正常工作。我有一个单独的文件中的类,我使用require_once() 函数链接到该文件。

这是主 .php 文件的样子:

<?php
  require_once("connect.php");
  require_once("theClass.php");

  $a = new theClass;
  $a->runQuery();
}

connect.php:

<?php
//connect to mySQL database
$mysqli = new mysqli("host", "user", "password", "db");
if ($mysqli->connect_errno)
{
    echo "<br><h1>Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error . "</h1><br>";
}

theClass.php:

<?php
require_once('connect.php');

class theClass
{
  //class variables and other functions here

  function runQuery()
  {
    $query = "SELECT col_1 FROM db.table";
    $stmt = $mysqli->prepare($query);
    stmt->execute();
    $stmt->bind_result($r);

    while($stmt->fetch())
    {
      echo $r . "<br>";
    }
  }
};

我尝试将类复制到主 .php 文件中,但它仍然不起作用;但是,我在外部 .php 文件以及主 .php 文件中使用了完全相同的代码(查询、准备、执行、bind_result 和 fetch 部分),并且两次都有效。这使我相信您无法从类内部运行查询,或者有不同的方法可以这样做。谁能指出我正确的方向?

谢谢

【问题讨论】:

  • 值得注意的是,我的 connect.php 文件具有正确的信息并且正在工作,因为我已经能够在其他 .php 文件中运行查询

标签: php mysql class mysqli


【解决方案1】:

将其传递给方法本身

您必须将数据库对象传递给方法,因为它们不在同一范围内:

function runQuery($mysqli)

然后这样称呼它

$a = new theClass;
$a->runQuery($mysqli);

将其传递给构造函数

如果你的类进行了大量的数据库调用,你可以简单地将它传递给构造函数并将其保存为私有变量以供以后使用:

class theClass
{
  private $mysqli;

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

  function runQuery()
  {
    $query = "SELECT col_1 FROM db.table";
    $stmt = $this->mysqli->prepare($query);
    stmt->execute();
    $stmt->bind_result($r);

    while($stmt->fetch())
    {
      echo $r . "<br>";
    }
  }
};

然后这样称呼它

$a = new theClass($mysqli);
$a->runQuery();

这两种方法都明确了你的类的依赖是一个mysqli对象,有利于以后的维护和可读性。

【讨论】:

  • 谢谢,这行得通!为什么我不需要将数据库对象传递给外部函数,而需要用于类?
  • @LoganBesecker 外部函数也无法使用它。函数引入了一个新的变量范围。
  • 真的吗?不知何故,在我的外部函数中,我已经能够在不这样做的情况下度过难关了..
【解决方案2】:

您需要将 $mysqli 作为参数传递或使用全局 $mysqli

<?php
require_once('connect.php');

class theClass
{
  //class variables and other functions here

  function runQuery()
  {
    global $mysqli;
    $query = "SELECT col_1 FROM db.table";
    $stmt = $mysqli->prepare($query);
    stmt->execute();
    $stmt->bind_result($r);

    while($stmt->fetch())
    {
      echo $r . "<br>";
    }
  }
};

【讨论】:

  • 全局变量会让你的代码很快变味,所以为了一个更美好的世界,你应该避免使用它们。
  • 只是提供选项,因为它是一个可行的解决方案。这取决于应用程序的结构,哪个效果最好。
  • 同时使用类和全局变量没有意义。要么写普通的OOP,要么你可以使用好的旧函数,省去很多麻烦。
猜你喜欢
  • 2016-08-07
  • 1970-01-01
  • 1970-01-01
  • 2012-07-24
  • 2014-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多