PHP - mysql_query()里面一个类的静态函数

时间:2012-01-20 17:39:00

标签: php class visibility global

情况

我在DB中有一个包含作业类型的表,基本上由标签和价格定义。我正在尝试做一个简单的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 个答案:

答案 0 :(得分:2)

最明显的事情是$database_vtconnection $vtconnectiongetJobTypes函数中无处定义。如果它们属于该类,则需要$this(对象)或self(静态)引用。更可能看起来你正试图使用​​全局变量,在这种情况下你必须将它们拉入函数的范围。

mysql_select_db可以自动连接(如果没有提供$vtconnection),但只有在知道如何时 - 才有先前的连接(或者可能是带有db / host / user / pass的INI配置)。

要将它们拉入范围,您需要在函数的开头添加该行:

global $vtconnection,$database_vtconnection;`

...或者使用$GLOBALS超全局数组:

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

对于使用全局变量的记录不是一个特别好的解决方案。