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

PHP函数和包含的脚本中未定义的变量,php,variables,scope,Php,Variables,Scope,我已经读了很多关于这个问题的书,但是我仍然无法解决它 在我的函数文件中,我声明了一个值如下的变量: $px_host = "localhost"; 我有一个数据库查询功能,如下所示: function dbQuery($database, $reqquery){ if(!$connect = mysql_connect($px_host, $px_dbuser, $px_dbpass)){ exit("Error - cannot connect to MySQL server - "

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

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

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

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

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

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

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

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

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\u connect
和朋友使用隐含连接,所以从技术上讲,你不需要传递它;尽管如此,这是一个很好的模式

最后但并非最不重要的


了解如何使用PDO并陶醉于OOP的神奇世界;-)

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

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

编辑答案的完整性:

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

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


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

函数外部的
global
语句不起任何作用-您只需要在函数中使用它来“导入”全局变量。从本质上说,这是正确的,但您不应该在函数外部的变量上使用“global”。它不用于声明全局变量;默认情况下,它们是全局的。-1你设法使他的代码更糟。你没有提供一个合理的解决方案,而是选择了添加全局状态。我本来不打算投反对票,尽管应该不鼓励补贴使用
global
,这会导致投反对票。但后来我看到,您也没有提到OP对
mysql.*
函数的使用。PHP手册明确指出。不要鼓励
global
mysql.*
-1之所以出现此问题,是因为我需要留下一条评论。每次发送SQL查询时重新连接都不是一个好主意。代码中的前两个操作应该在脚本开始时只执行一次。除此之外,考虑使用<代码> mySqLI< /COD>或<代码> PDO/COD>这两个都比旧的代码> MySQL 扩展更好——它们支持准备好的语句(比逃跑更安全,更安全)。好的,所以我已经采纳了您的所有建议,我正在研究OOP。谢谢你的帮助!