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。谢谢你的帮助!