PHP 函数和包含脚本中的未定义变量


PHP Undefined variable in functions and included scripts

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

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

$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()来获取某些信息。是否有可能因为它最初是从第一个文件运行的,所以变量超出了范围?

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

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仅执行查询(根据函数名称)。

编辑以完成答案:

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

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

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

天色已晚,所以这只是部分答案。

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

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的神奇世界中;-)

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

$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;
}

这应该可以解决此问题。