2

我已经阅读了很多关于这个问题的东西,但是我仍然无法解决它。

在我的函数文件中,我声明了一个具有如下值的变量:

$px_host = "localhost";

我有一个像这样的数据库查询功能:

function dbQuery($database, $reqquery){
if(!$connect = mysql_connect($px_host, $px_dbuser, $px_dbpass)){
    exit("Error - cannot connect to MySQL server - " . mysql_error());
}

if(!$database = mysql_select_db($database)){
    exit("Error - cannot select database - " . mysql_error());
}

if(!$query = mysql_query($reqquery)){
    exit("Error - query error.");
}

return $query;
}

每当我尝试运行该函数时,都会收到“未定义变量”错误。我尝试将变量设置为全局,但它仍然说它是未定义的。它们在同一个文件中,变量在函数之前定义和设置。

(我不擅长解释这一点,所以尝试解决它)包含的文件dbQuery()包含在另一个文件中。在另一个文件中,有一个函数用于dbQuery()获取某些信息。是否有可能因为它最初是从第一个文件运行的,所以变量超出了范围?

4

3 回答 3

3

在您的特定情况下,您应该在函数内声明全局函数外的所有变量。所以

function dbQuery($database, $reqquery){
    global $px_host,$px_dbuser,$px_dbpass;
    // rest of function
}

但是您的代码可以改进:您应该在脚本的开头定义常量

define('DB_HOST','localhost');
define('DB_USER','user');
define('DB_PASS','pass');

并在函数内部使用常量(因此无需声明全局,而且更符合逻辑,因为主机、用户和传递不是变量而是常量)。

您应该在流程开始时只连接一次数据库,以便函数dbQuery只执行查询(根据函数名称)。

编辑答案的完整性:

正如一些用户在其他评论中所说的那样,我邀请您阅读mysql_connect 的 php 文档并查看红色建议:

不鼓励使用此扩展程序。相反,应该使用 MySQLi 或 PDO_MySQL 扩展。另请参阅 MySQL:选择 API 指南和相关的常见问题解答以获取更多信息。此功能的替代方案包括:

我不是在这里说你必须在你的项目中做什么,但阅读文档并遵循提示/建议对于你的项目的成功至关重要。:)

于 2012-06-09T17:50:47.210 回答
1

时间不早了,所以这只是部分答案。

您可以采取的另一种方法是将数据库实例传递到您的辅助函数中,从而解决凭据问题。

function dbQuery($database, $reqquery)
{
    if (false !== ($query = mysql_query($reqquery, $database))) {
        exit("Error - query error.");
    }

    return $query;
}

现在这个函数通过参数接收它的依赖并且也更短并且不会每次都连接/查询/断开连接。

剩下的代码必须写在别处;如果您在每个页面都需要一个数据库,则可以在链的上层编写:

if (false === ($connect = mysql_connect($px_host, $px_dbuser, $px_dbpass))) {
    exit("Error - cannot connect to MySQL server - " . mysql_error());
}

if (false === mysql_select_db($database)) {
    exit("Error - cannot select database - " . mysql_error());
}

$connect然后你在任何需要的地方传递。

$res = dbQuery($connect, 'SELECT "hello world"');

当然,mysql_connect朋友们使用隐含连接,所以从技术上讲,无论如何您都不需要传递它;尽管如此,这是一个很好的模式。

最后但并非最不重要的

学习如何使用 PDO 并陶醉在 OOP 的神奇世界中;-)

于 2012-06-09T17:25:28.770 回答
-3

如果将变量设置为全局,则还需要在函数中将其设置为全局。在这种情况下:

$px_host = "localhost";

function dbQuery($database, $reqquery){
    global $px_host;
    if(!$connect = mysql_connect($px_host, $px_dbuser, $px_dbpass)){
        exit("Error - cannot connect to MySQL server - " . mysql_error());
    }

    if(!$database = mysql_select_db($database)){
        exit("Error - cannot select database - " . mysql_error());
    }

    if(!$query = mysql_query($reqquery)){
        exit("Error - query error.");
    }

    return $query;
}

这应该可以解决这个问题。

于 2012-06-09T16:46:17.917 回答