我在尝试访问mysql类中的某些函数时遇到问题。我必须连接到我的数据库的功能如下:
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
)?我已经在两个不同的地方测试了这个功能,它在一个而不是另一个工作!请帮忙!
@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 :(得分:0)
我注意到了几个问题:
您有mysql_error($connection)
和mysql_error($db)
。那些不是有效的参数。在这两种情况下,您应该使用$this->connection
。这将为您提供更好的错误输出。
通常情况下,如果您将连接资源传递给mysql_query
,则无关紧要,但在这种情况下,您可能需要:mysql_query($query, $this->connection)
。虽然我不能说这是一个有保障的解决方案,但它可能有所帮助。
哦,BTW - 每当有人使用global
时,上帝会杀死一只小猫。这是真的。他告诉我。无论是那个还是我有一些糟糕的玉米片。 (是的,我是这个问题的狂热者。这是一件好事。 相信我 )
无论如何,如果你需要一个函数内部的变量要么传入它,要么创建一个新类的属性(使StoreConfDB成为一个Singleton?让它可以通过工厂方法访问?你有很多选择) - 避免全球化的习惯会消除一些叫做unexpected side effects
的讨厌的东西。