2012-06-09 65 views
2

我读过很多关于这个问题的东西,但是我仍然无法修复它。PHP未定义的变量在函数和包含的脚本

在我的函数文件我声明一个变量,象这样的值:

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

+2

每次您想要发送SQL查询时重新连接是一个坏主意。代码中的前两个操作应该只在脚本开始时执行一次。除此之外,考虑使用'mysqli'或'PDO',它们比旧的'mysql'扩展更好 - 它们支持例如准备好的语句(比转义更好,更安全)。 – ThiefMaster

+0

好的,我已经采纳了所有的建议,并且正在研究OOP。感谢所有的帮助! – ToshNeox

回答

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指南和相关FAQ以获取更多信息。替代该功能包括:

我不是在这里说,你必须在你的项目做什么,但阅读文档和遵循的窍门/建议是为您的项目的成功至关重要。 :)

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

这应该解决这个问题。

+2

函数外的'global'语句什么也不做 - 你只需要在函数中导入一个全局变量。 – ThiefMaster

+0

实际上,这是正确的,但不应该在函数外的变量上使用“全局”。它不用于声明全局变量;他们默认是全球性的。 – Atli

+0

感谢您的通关和修复。 :) –

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 ;-)