Вызов функции-члена query () для необъекта - PullRequest
0 голосов
/ 06 мая 2010

Хорошо, это так странно !!! Я использую PHP версии 5.1.6, когда я пытаюсь запустить приведенный ниже код, который приводит к фатальной ошибке объекта, который не был создан. Как только я откомментирую эту строку кода // $ cb_db = new cb_db (ПОЛЬЗОВАТЕЛЬ, ПАРОЛЬ, ИМЯ, ХОСТ); все работает. Хотя я и объявил объект $ cb_db как глобальный в методе. Любая помощь будет принята с благодарностью.

require_once (ROOT_CB_CLASSES. 'Db.php');

$cb_db = new cb_db(USER, PASSWORD, NAME, HOST);

class cb_user {
    protected function find_by_sql( $sql ) {
        global $cb_db;

        //$cb_db = new cb_db(USER, PASSWORD, NAME, HOST);
        $result_set = $cb_db->query( $sql );

        $object_array = array();
        while( $row = $cb_db->fetch_array( $result_set ) ) {
            $object_array[] = self::instantiate( $row );
        }
        return $object_array;
    }
}

1 Ответ

2 голосов
/ 06 мая 2010

Если вы собираетесь использовать глобальные переменные (вместо передачи соединения через конструктор), вы должны убедиться, что он глобален, в тех местах, где вы планируете его использовать.

Global $cb_db;
$cb_db = new cb_db(USER, PASSWORD, NAME, HOST);

class cb_user {
    protected function find_by_sql( $sql ) {
        global $cb_db;

        //$cb_db = new cb_db(USER, PASSWORD, NAME, HOST);
        $result_set = $cb_db->query( $sql );

        $object_array = array();
        while( $row = $cb_db->fetch_array( $result_set ) ) {
            $object_array[] = self::instantiate( $row );
        }
        return $object_array;
    }
}

Однако я полагаю, что лучший способ сделать это - передать соединение с базой данных через конструктор.

$cb_db = new cb_db(USER, PASSWORD, NAME, HOST);
$cb_user = new cb_user($cb_db);

class cb_user {
    public __construct(cb_db $database)
    {
        $this->database = $database
    }

    protected function find_by_sql( $sql ) {

        $this->database = new cb_db(USER, PASSWORD, NAME, HOST);
        $result_set = $cb_db->query( $sql );

        $object_array = array();
        while( $row = $cb_db->fetch_array( $result_set ) ) {
            $object_array[] = self::instantiate( $row );
        }
        return $object_array;
    }
}

Вы также можете передать ее отдельной функции (find_by_sql($sql, $cb_db)), если обнаружите, что это единственная функция, которая использует соединение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...