Sorunun Yine başka 'olmayan bir nesne üzerinde bir üye işlev Çağrı'

3 Cevap php

Ben geri veritabanından bazı verileri almak için bir php nesnesini çağıran bir html sayfası var. Bu iyi çalışır, ancak komut hantal başlamıştı bu yüzden işlevleri bir grup içine bazı patlak verdi.

Yani aşağıdaki dosyaları var:

// 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);
}
?>

Ve sabitler içinde define (DB_USER, vb) bir grup vardır.

Yani, map.php Config.php içerir. Bu olduğu takdirde, session.php içeren ve database.php içerir prepend.php içerir. map.php da database nesnesini kullanmaya çalışır rmap.php içerir.

Sorun olsun bir

Fatal error: Call to a member function on a non-object in C:\Develop\map\includes\rmap.php on line 5

Bu olağan neden $ veritabanı nesne başlatıldı / yaratılmış olmasıdır, ama ben ne zaman çağrılır, hangi göstermek için kod eklerseniz (echo "DB connection created"; ve üzeri echo "using DB connection";) dedikleri doğru sırayla (ya da en azından görüntülenir).

I include("database.php") rmap.php eklerseniz ben constants.php yılında şeyler yeniden tanımlanması hakkında hataları olsun. Ben kullanırsanız require_once Ben daha önce olduğu gibi aynı hataları almak.

What am I doing wrong here?

3 Cevap

$database GetGameNumber fonksiyonunun kapsamında değildir.

Kolay, ama ille de iyi, çözümdür

<?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);
}
?>

Küresel bu OOP ilkelerini ihlal çünkü mükemmel değil kabul edilir ve bir genel değişken ve tüm üyeleri işlevin kapsamına eklenir çünkü performansı üzerinde bazı etkileri olduğu söyleniyor. Gerçi, bu gerçekten performansını ne kadar etkilediğini bilmiyorum.

Sen, ben asked a question on how to organize such things bir süre tekrar konuya girmek istiyorum ve bazı iyi cevaplar ve bağlantılar var ise.

Sen eklemeniz gerekir

global $database;

üstündeki getGameNumber(), $database getGameNumber kendisi dışında tanımlanır tarihi

Sizin $database otomatik işlevin kapsamdan erişilebilir değil varibleis. Siz işlevinde global $database; olarak ilan etmek gerekebilir.

PHP kapsamları belgelerinde açıklanmıştır: http://de3.php.net/manual/en/language.variables.scope.php

Ayrıca PHP 4and MySQL3 looooong süre için destek dışında ve güvenlik sorunları ve diğer sabitlenmemiş konuları içerebilir Lütfen aklınızda.