我是一个php新手(但是其他语言的长期开发人员),我正在尝试“PHP,MySQL和JavaScript”中的一些示例数据库连接。它显示了一个包含数据库连接变量(服务器名,用户名,密码,数据库等)的示例文件。我有一个php文件,它有一些我写的函数,其中一个有一些SQL查询。无论出于何种原因,在该文件中调用require_once不会输出任何错误(我已配置E_ALL)但我的数据库php文件中的那些变量为空。
我用该函数中的所有变量调用了一个echo,看看它到底发生了什么,当然它打印出一个空白行。世界上什么超出了范围?我不得不遗漏一些简单的东西。
这是我正在做的事情的一个例子
db_login.php
<?php
$db_server = 'localhost';
// ....
?>
的functions.php
<?php
require_once('db_login.php');
function myfunction() {
echo "$db_server";
// ...
}
?>
叫我疯了,但这不应该足够简单吗?
答案 0 :(得分:7)
PHP没有function scope之类的Javascript,因此您无法访问db_login.php
函数内functions.php
内的变量。
有多种方法可以解决这个问题。由于您可能使用服务器名称global constants可能是一个很好的解决方案,因为没有什么可以改变它们。
在您的情况下,您可以这样做:
<?php
require_once('db_login.php');
// You have access to $db_server here.
// Create a constant.
define("DB_SERVER", $db_server);
function myfunction() {
// Using a constant. Note that there is no "$".
echo DB_SERVER ;
// Constants are interpreted inside double quotes too
echo "\nMy constant is DB_SERVER";
// ...
}
?>
在您的情况下,将服务器名称作为常量可能是合适的。如果您要处理要作为真实变量处理的内容,可以通过值或引用将变量传递给函数:
myfunction($variable);
// by value
function myfunction($pass_variable_to_me_by_value)
{
echo $pass_variable_to_me_by_value;
// ...
}
function myfunction(& $pass_variable_to_me_by_reference)
{
echo $pass_variable_to_me_by_reference;
// ...
}
作为备注,在您的情况下,使用global
关键字或函数内的$GLOBALS数组为essentially the same as passing by reference.,但如果您没有通过从全局范围来看,它们可能非常不同(例如,在一个类或另一个函数中)。
答案 1 :(得分:6)
您在db_login.php
中声明的变量是全局变量。要在您的函数中访问它们,您需要使用$GLOBALS
变量,例如$GLOBALS['db_server']
,或使用global
关键字在您的函数中将其声明为全局,例如global $db_server
。
答案 2 :(得分:5)
在“myfunction”函数内部,您无权访问这些变量......