PHP - mysql_query () внутри статической функции класса - PullRequest
0 голосов
/ 20 января 2012

Ситуация

У меня есть таблица в БД, которая содержит типы работ, в основном определяемые меткой и ценой.Я пытаюсь сделать простой SELECT * FROM jobtype, но я не могу заставить его работать, хотя я использую один и тот же блок снова и снова в остальной части кода.Основное отличие здесь состоит в том, что это одиночный файл, пытающийся выполнить функцию.

Проблема в том, что, как только я раскомментирую строку $rs_job_types = mysql_query($query_job_types, $vtconnection) or die(mysql_error());, страница перестанет загружаться в этой конкретной точке кода.

Код

Ниже приведен код моей функции getJobTypes():

require_once('Connections/vtconnection.php');
class JobTypes extends Singleton{
    static private $job_types;

    public static function getJobTypes(){
        if (self::$job_types == null){
            echo 'DEBUG: For now, $job_types is NULL.'."\n";
            mysql_select_db($database_vtconnection, $vtconnection);
            $query_job_types = 'SELECT * FROM jobtype';
            $rs_job_types = mysql_query($query_job_types, $vtconnection) or die(mysql_error());

            while ($rs_row = mysql_fetch_assoc($rs_job_types)){
                // let the job type identifier in the db be its index in our array
                self::$job_types[$rs_row['id']]['label'] = $rs_row['label']; // job type label
                self::$job_types[$rs_row['id']]['price'] = $rs_row['price']; // job type price
            }
            if (self::$job_types != null) echo 'DEBUG: $job_types has been populated.'."\n";
        }
        return self::$job_types;
    }
}

Который я так называю:

$jt = JobTypes::getJobTypes();

Вот мой шаблон синглтона:

class Singleton{
    private static $instances = array();

    final private function __construct(){
    }

    final public function __clone(){
        trigger_error('You don\'t clone a singleton!', E_USER_ERROR);
    }

    final public static function getInstance(){
        $c = get_called_class();
        if(!isset(self::$instances[$c])){
            self::$instances[$c] = new $c;
        }
        return self::$instances[$c];
    }
}

Я перевернул проблему в своей голове, прокомментировал все внутри функции getJobtypes() и не комментировал шаг за шагом.Я обнаружил, что проблема действительно возникает со строкой mysql_query(), просто не могу понять, почему.Что-то явно не так в моем коде?


Решено

Как и предполагалось, я использовал global $vtconnection,$database_vtconnection; в начале своей статической функции, и все прошло гладко.Это не оптимальное решение, но оно указало на проблему объема, которую я сейчас попытаюсь решить.

Я также избавился от шаблона синглтона.

1 Ответ

2 голосов
/ 20 января 2012

Ну, самое очевидное, что $database_vtconnection $vtconnection не определены нигде в вашей функции getJobTypes.Если они являются частью класса, вам нужны $this (объект) или self (статические) ссылки.Скорее всего, похоже, что вы пытаетесь использовать глобальные переменные, и в этом случае вы должны вытянуть их в область действия функции.

mysql_select_db может автоматически подключаться (если $vtconnection не предоставляется), но только если он знает, как - есть предыдущее подключение (или возможная конфигурация INI с помощью db / host /user / pass).

Чтобы вывести их в область видимости, вам необходимо добавить строку в начале функции:

global $vtconnection,$database_vtconnection;`

... Или использовать суперглобальный массив $GLOBALS:

mysql_select_db($GLOBALS["database_vtconnection"],$GLOBALS["vtconnection"]);

Для записи использование глобалов не является особенно хорошим решением.

...