【发布时间】:2009-12-30 14:10:47
【问题描述】:
我有一个 html 页面,它调用一个 php 对象从数据库中取回一些数据。它工作正常,但脚本变得笨拙,所以我决定将其中的一些分解成一堆函数。
所以我有以下文件:
// 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 还包括 rmap.php,它尝试使用 database 对象。
问题是我得到了一个
致命错误:在非对象上调用成员函数 C:\Develop\map\includes\rmap.php 在第 5
行
通常的原因是 $database 对象没有被创建/初始化,但是如果我添加代码来显示当(通过echo "DB connection created"; 和echo "using DB connection";)它们被调用(或至少显示) 以正确的顺序。
如果我将include("database.php") 添加到 rmap.php,我会收到有关重新定义 constants.php 内容的错误。如果我使用require_once,我会得到与以前相同的错误。
我在这里做错了什么?
【问题讨论】:
-
如果我可以在问题上附加一个小 zip 文件会容易得多。
-
你真的在使用 PHP4 和 MySQL3 吗?如果是这样,你真的真的需要升级。他们都9岁了!
-
好的,给我们一个简单的方法来升级而不破坏任何东西,我们会做到的。
-
只有傻瓜才会需要一种万无一失的方法,我怀疑你不是;-] 此外,VirtualBox 和旧计算机的存在是有原因的! (如果不清楚,可用作测试服务器)
-
说到 Linux,我需要一个万无一失的方法:-) 这是一个非标准的 linux 安装,软件是以非常非传统的方式编写的。