从类里面查询mysql数据库

Log*_*ker 3 php mysql mysqli class

我正在尝试从类中运行MySQL数据库的查询,但由于某种原因它不起作用.我将该类放在一个单独的文件中,我正在使用该require_once()函数进行链接.

这是主.php文件的样子:

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

  $a = new theClass;
  $a->runQuery();
}
Run Code Online (Sandbox Code Playgroud)

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>";
}
Run Code Online (Sandbox Code Playgroud)

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>";
    }
  }
};
Run Code Online (Sandbox Code Playgroud)

我已经尝试将类复制到主.php文件中,它仍然无效; 但是,我在外部.php文件中以及主.php文件中使用了完全相同的代码(查询,准备,执行,bind_result和获取部分),并且它已经工作了两次.这让我相信你无法从一个类中运行查询,或者有一种不同的方式来执行此操作.有人能指出我正确的方向吗?

谢谢

kap*_*apa 8

将其传递给方法本身

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

function runQuery($mysqli)
Run Code Online (Sandbox Code Playgroud)

并称之为

$a = new theClass;
$a->runQuery($mysqli);
Run Code Online (Sandbox Code Playgroud)

将它传递给构造函数

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

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>";
    }
  }
};
Run Code Online (Sandbox Code Playgroud)

并称之为

$a = new theClass($mysqli);
$a->runQuery();
Run Code Online (Sandbox Code Playgroud)

这两种方法都清楚地表明你的类的依赖是一个mysqli对象,这有利于将来的维护和可读性.