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

时间:2012-06-09 16:40:53

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

3 个答案:

答案 0 :(得分: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只执行查询(根据函数名称)。

编辑完整答案:

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

  

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

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

答案 1 :(得分: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的神奇世界; - )

答案 2 :(得分:-3)

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

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

这可以解决这个问题。