3

クラス内から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、およびフェッチ部分)を使用しており、どちらの場合も機能します。これにより、クラス内からクエリを実行できないか、別の方法で実行できると思います。誰かが私を正しい方向に向けることができますか?

ありがとう

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 に答える