使用Require_once()正确包含数据库连接变量

时间:2010-09-01 04:16:56

标签: php scope require-once

我是一个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";
        // ...
    }
?>

叫我疯了,但这不应该足够简单吗?

3 个答案:

答案 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”函数内部,您无权访问这些变量......

请参阅:http://php.net/manual/en/language.variables.scope.php