3

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

这是主 .php 文件的样子:

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

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

连接.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 部分),并且两次都有效。这使我相信您无法从类内部运行查询,或者有不同的方法可以这样做。谁能指出我正确的方向?

谢谢

4

2 回答 2

9

将其传递给方法本身

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

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对象,这有利于以后的维护和可读性。

于 2012-10-19T23:52:16.297 回答
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>";
    }
  }
};
于 2012-10-19T23:52:31.990 回答