Я новичок php (но долгое время разработчик на других языках), и я пытаюсь подключиться к некоторым примерам подключений db в «PHP, MySQL и JavaScript». Он показывает пример файла, который должен включать переменные соединения db (имя сервера, имя пользователя, пароль, база данных и т. Д.). У меня есть php-файл, который содержит несколько функций, которые я написал, и один из них имеет несколько SQL-запросов. По какой-либо причине вызов require_once в этом файле не выводит никаких ошибок (у меня есть E_ALL config'd), но эти переменные в моем php-файле базы данных равны нулю.
Я вызвал эхо со всеми переменными внутри этой функции, чтобы увидеть, что происходит, и, конечно же, он печатает пустую строку. Что в мире выходит за рамки? Мне нужно пропустить что-то простое.
Вот пример того, что я делаю
db_login.php
<?php $db_server = 'localhost'; // .... ?>
functions.php
<?php require_once('db_login.php'); function myfunction() { echo "$db_server"; // ... } ?>
Назовите меня сумасшедшим, но разве это не должно быть достаточно простым, чтобы работать?
Переменные, которые вы объявляете в db_login.php
являются глобальными. Чтобы получить доступ к ним в вашей функции, вам нужно использовать переменную $GLOBALS
, например $GLOBALS['db_server']
, или объявить их глобальными внутри вашей функции, используя ключевое слово global
, например global $db_server
.
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 внутри функции по существу совпадает с передачей по ссылке. , но если вы не переходите из глобальной области, они могут быть очень разными (например, в классе или другой функции).
Внутри функции «myfunction» у вас нет доступа к этим переменным …
См. Больше в: http://php.net/manual/en/language.variables.scope.php