0

データベースからデータを取得するためにphpオブジェクトを呼び出すhtmlページがあります。正常に動作しますが、スクリプトが扱いにくくなったため、一部の関数をいくつかの関数に分割することにしました。

だから私は次のファイルを持っています:

// htdocs/map.php
<?php
    include("config.php");
    include("rmap.php");

    $id = 1;
    $gamenumber = getGameNumber($id);
    echo $gamenumber;
?>

// htdocs/config.php
<?php
$_PATHS["base"]      = dirname(dirname(__FILE__)) . "\\";
$_PATHS["includes"]  = $_PATHS["base"] . "includes\\";

ini_set("include_path", "$_PATHS[includes]");
ini_set("display_errors", "1");
error_reporting(E_ALL); 

include("prepend.php");
?> 

// includes/prepend.php
<?php
include("session.php");
?>

// includes/session.php
<?php
includes("database.php");

class Session {
    function Session() {
    }

};

$session = new Session;
?>

// includes/database.php
<?php
include("constants.php");

class Database {

    var $connection;

    function Database() {
        $this->connection = mysql_connect(DB_SERVER, DB_USER, DB_PASS) or die(mysql_error());
        mysql_select_db(DB_NAME, $this->connection) or die(mysql_error());
    }

    function query($query) {
        return mysql_query($query, $this->connection);
    }
};

/* Create database connection */
$database = new Database;
?>

// includes/rmap.php
<?php
function getGameNumber($id) {
    $query = "SELECT gamenumber FROM account_data WHERE usernum=$id";
    $result = $database->query($query); // line 5
    return mysql_result($result, 0);
}
?>

また、定数には多数の定義(DB_USERなど)が含まれています。

したがって、map.phpにはconfig.phpが含まれています。これには、session.phpを含み、database.phpを含むprepend.phpが含まれます。map.phpには、オブジェクトを使用しようとするrmap.phpも含まれていdatabaseます。

問題は私が得ることです

致命的なエラー: 5行目のC:\ Develop \ map \ include\rmap.phpにある非オブジェクトのメンバー関数を呼び出します

これの通常の原因は、$ databaseオブジェクトが作成/初期化されていないことですが、コードを追加して、(およびを介しecho "DB connection created";echo "using DB connection";)いつ呼び出されるかを示すコードを追加すると、正しい順序で呼び出されます(または少なくとも表示されます)。

include("database.php")rmap.phpに追加すると、constants.phpの内容を再定義する際にエラーが発生します。使用するrequire_onceと、以前と同じエラーが発生します。

私はここで何が間違っているのですか?

4

3 に答える 3

2

$database関数の範囲外ですGetGameNumber

最も簡単ですが、必ずしも最善ではありませんが、解決策は次のとおりです。

<?php
function getGameNumber($id) {
    global $database;  // added this
    $query = "SELECT gamenumber FROM account_data WHERE usernum=$id";
    $result = $database->query($query); // line 5
    return mysql_result($result, 0);
}
?>

グローバルはOOPの原則に違反しているため完全ではないと見なされ、グローバル変数とそのすべてのメンバーが関数のスコープに追加されるため、パフォーマンスに何らかの影響を与えると言われています。しかし、それが実際にパフォーマンスにどの程度影響するかはわかりません。

この問題に取り組みたい場合は、しばらく前にそのようなものを整理する方法について質問し、いくつかの良い回答とリンクを取得しました。

于 2009-12-30T14:20:47.227 に答える
0

含める必要があります

global $database;

getGameNumber自体の外部で定義されているgetGameNumber()ため、の上部にあります$database

于 2009-12-30T14:21:55.087 に答える
0

$database関数のスコープから変数に自動的にアクセスすることはできません。関数のように宣言する必要があるかもしれませんglobal $database;

PHPのスコープは、ドキュメントで説明されています:http: //de3.php.net/manual/en/language.variables.scope.php

また、PHP 4とMySQL3は長い間サポートされておらず、セキュリティの問題やその他の未修正の問題が含まれている可能性があることにも注意してください。

于 2009-12-30T14:24:55.110 に答える