Используйте Require_once () для правильного включения переменных подключения к базе данных - PullRequest
8 голосов
/ 01 сентября 2010

Я новичок в php (но долгое время являлся разработчиком на других языках), и я пробую некоторые примеры соединений с БД в "PHP, MySQL и JavaScript".Он показывает пример файла, который включает переменные соединения БД (имя сервера, имя пользователя, пароль, база данных и т. Д.).У меня есть php-файл, в котором есть несколько функций, которые я написал, и один из них имеет несколько SQL-запросов.По какой-то причине вызов require_once в этом файле не выдает никаких ошибок (у меня есть E_ALL config'd), но эти переменные в моем php-файле базы данных имеют значение null.

Я вызвал echo со всеми переменными в этомфункция, чтобы увидеть, что, черт возьми, происходит, и, конечно, он печатает пустую строку.Что в мире выходит за рамки?Я должен упустить что-то простое.

Вот пример того, что я делаю

db_login.php

<?php
    $db_server = 'localhost';
    // ....
?>

functions.php

<?php
    require_once('db_login.php');

    function myfunction() {
        echo "$db_server";
        // ...
    }
?>

Назовите меня сумасшедшим, но разве это не должно быть достаточно простым для работы?

Ответы [ 3 ]

7 голосов
/ 01 сентября 2010

PHP не имеет область действия , как Javascript, поэтому у вас нет доступа к переменным в db_login.php внутри функции functions.php.

Есть несколько способов справиться с этим. Ввиду вероятного использования вами имени сервера глобальные константы , вероятно, будут хорошим решением, поскольку ничто не может их изменить.

В вашем случае вы можете сделать:

<?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 внутри функции равно по сути то же самое, что и передача по ссылке. , но если вы не переходите из глобальной области видимости, они могут сильно отличаться (например, в классе или другой функции).

6 голосов
/ 01 сентября 2010

Переменные, которые вы объявляете в db_login.php, являются глобальными. Чтобы получить к ним доступ в своей функции, вам нужно использовать переменную $GLOBALS, например, $GLOBALS['db_server'], или объявите их как глобальные внутри вашей функции, используя ключевое слово global, например, global $db_server.

5 голосов
/ 01 сентября 2010

Внутри функции "myfunction" у вас нет доступа к этим переменным ...

Подробнее см .: http://php.net/manual/en/language.variables.scope.php

...