我在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;
,一切顺利。它不是一个最佳解决方案,但它指出了我现在试图解决的范围问题。
我也摆脱了单身模式。
答案 0 :(得分:2)
最明显的事情是$database_vtconnection
$vtconnection
在getJobTypes
函数中无处定义。如果它们属于该类,则需要$this
(对象)或self
(静态)引用。更可能看起来你正试图使用全局变量,在这种情况下你必须将它们拉入函数的范围。
mysql_select_db
可以自动连接(如果没有提供$vtconnection
),但只有在知道如何时 - 才有先前的连接(或者可能是带有db / host / user / pass的INI配置)。
要将它们拉入范围,您需要在函数的开头添加该行:
global $vtconnection,$database_vtconnection;`
...或者使用$GLOBALS
超全局数组:
mysql_select_db($GLOBALS["database_vtconnection"],$GLOBALS["vtconnection"]);
对于使用全局变量的记录不是一个特别好的解决方案。