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。这又包括 prepend.php,其中包括 session.php 和包括 database.php。map.php 还包括尝试使用该database对象的 rmap.php。

问题是我得到一个

致命错误:在第5行调用C:\Develop\map\includes\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);
}
?>

global 被认为是不完美的,因为它违反了 OOP 的原则,并且据说对性能有一些影响,因为全局变量及其所有成员都添加到函数的范围内。不过,我不知道这对性能有多大影响。

如果你想进入这个问题,我问了一个关于如何组织这些事情的问题,并得到了一些很好的答案和链接。

于 2009-12-30T14:20:47.227 回答
0

您的$database变量无法从函数的范围内自动访问。您可能需要global $database;在函数中声明它。

PHP中的范围在文档中进行了解释:http: //de3.php.net/manual/en/language.variables.scope.php

另请注意,PHP 4 和 MySQL3 在很长一段时间内都不再支持,并且可能包含安全问题和其他未修复的问题。

于 2009-12-30T14:24:55.110 回答
0

你需要包括

global $database;

在 的顶部getGameNumber(),因为$database在 getGameNumber 本身之外定义

于 2009-12-30T14:21:55.087 回答