我有一个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
,我会得到与之前相同的错误。
我在这里做错了什么?
答案 0 :(得分: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的原则,并且据说对性能有一些影响,因为全局变量及其所有成员都被添加到函数的范围中。不过,我不知道这对性能有多大影响。
如果你想进入这个问题,我会asked a question on how to organize such things一段时间回来并获得一些好的答案和链接。
答案 1 :(得分:0)
您需要包含
global $database;
位于getGameNumber()
的顶部,因为$database
是在getGameNumber本身之外定义的
答案 2 :(得分:0)
您的$database
varibleis无法自动从功能范围访问。您可能需要在函数中将其声明为global $database;
。
PHP中的范围在文档中进行了解释:http://de3.php.net/manual/en/language.variables.scope.php
请注意,PHP 4和MySQL3不支持漫长的时间,可能包含安全问题和其他未解决的问题。