2011-07-15 38 views
2

我在尝试访问我的mysql类中的某些函数时遇到问题。我有连接到我的数据库的功能如下:mysql_connect问题,资源类型'未知'

function connect_DB() { 
    $this->connection = mysql_connect($this->dbURL, $this->dbUser, $this->dbPass) or trigger_error('Connection failed: ' . mysql_error($connection), E_USER_ERROR); 
    $this->db = mysql_select_db($this->dbName, $this->connection) or trigger_error('Database selection failed: ' . mysql_error($db), E_USER_ERROR); 
} 

而且我用这个创造我的MySQL对象:

$dbConf = new StoreConfDB(); 
$dbConf->connect_DB(); 

现在我有一个应该抓住所有的列的功能来自指定表的名称。代码:

function get_db_columns($table) { 
global $dbConf; 
print_r($dbConf->get_db()); 
$result = $dbConf->query_DB_resource('SELECT * FROM ' . $table); 
for($i = 0; $i < mysql_num_fields($result); $i++) { 
    $meta = mysql_fetch_field($result, $i); 
    $fields[] = $meta->name; 
} 
mysql_free_result($result); 
return $fields; 
} 

但我收到错误,如:

Warning: mysql_query(): 5 is not a valid MySQL-Link resource 

如果我尝试从的mysql_query呼叫删除连接参数我得到这个:

Notice: Could not run query: No database selected in ... 

现在我正在运行一个调试器,并指出了问题所在(我认为)。当类的工作,连接变量设置为:resource id='5' type='mysql link'

但是,当它从get_db_columns()函数内部调用在mysql类的查询功能的连接变量是:resource id='5' type='Unknown'

于是莫名其妙的连接变量得到弄糟即使两个连接变量应该是相同的东西? (从$dbConf)?我已经在2个不同的地方测试了这个功能,它在一个而不是另一个中工作!请帮忙!

@footy:

在$ dbConf一个print_r的返回:

StoreConfDB Object ([dbURL] => localhost [dbUser] => root [dbPass] => [dbName] => db1 [connection] => Resource id #5 [db] => 1) 

的query_DB_resource功能:

function query_DB_resource($query) { 
    $sql_query = mysql_query($query) or trigger_error('Could not run query: '. mysql_error()); 
    return $sql_query; 
} 
+0

您确定$ dbConf变量是否在您调用* get_db_columns($ table)*函数之前被初始化*。对于更安全的方法,将数据库连接放在构造器中,以确保每次连接到数据库连接 – footy

+0

也可以发布* query_DB_resource *函数。这可能是一个错误。更好的是,将整个页面放在这里,以便让人们更轻松地获得全面的外观。 – footy

回答

0

我注意到几个问题:

你有mysql_error($connection)mysql_error($db)。那些不是有效的参数。在这两种情况下,您应该使用$this->connection。这会给你更好的错误输出。

通常,如果您将连接资源传递到mysql_query并不重要,但在这种情况下,您可能需要:mysql_query($query, $this->connection)。虽然我不能说这是一个有保证的解决方案,但它可能会有所帮助。

哦,顺便说一句 - 每次有人使用global上帝杀死一只小猫。这是真的。他告诉我。无论是我还是有一些不好的玉米片。 (是的,我在这个问题上的狂热者,这是一件好事。相信我

无论如何,如果你需要一个函数的内部变量无论是在通过它,或作出的属性新类(使StoreConfDB成为Singleton?使其可以通过工厂方法访问?您有很多选择) - 避免全局性,因为习惯会删除一些令人讨厌的东西unexpected side effects