Intereting Posts
Как использовать услугу переводчика внутри Entity? Как передать аргументы от маршрутизатора к промежуточному программному обеспечению в laravel 5? Пустой экран контактной формы SMTP для отправки как извлечь данные из mysql, содержащие специальные символы? Проблема с symfony 1.49 и MySQL 5.5.8 MongoDB GridFS хранит несколько размеров изображения или использует на лету изменение размера Оптимальный дизайн для базы данных с повторяющимся событием Индекс слов PHP, производительность и разумные результаты Обмен пользователями между двумя базами данных Данные Swift httppost, не вставляемые в базу данных MySQL Вычисление корней с помощью bc_math или GMP Как разделить IP-адрес в PHP PHP – PDO не принимает вмонтированный массив в качестве параметра вопроса вопроса для предложения IN в запросе SELECT Как изменить контент в div, основанный на выпадающем списке PHP: как вызвать стандартные функции библиотеки

Область действия функции PHP

У меня есть файл, который загоняет мои повторно используемые функции в один файл ( functions.php ). Это include_once() 'd на каждой странице, которая ему нужна. Я получаю сообщение об ошибке, когда мои пользовательские функции пытаются получить доступ к соединению MySQL вне их собственной области. Источник немного похож на этот:

 <?php // functions.php $connect = mysql_connect("localhost", "user", "pass") or die("MySQL said: ".mysql_error()); mysql_select_db("database", $connect) or die("MySQL said: ".mysql_error()); // no error /* ... */ function getmotd($user) { $query = "SELECT cid FROM `users` WHERE id = ".$user; $query = mysql_query($query, $connect); // error occurs here, $connect is not a valid MySQL link-resource /* ... */ } ?> 

Почему моя переменная доступа не может быть объявлена ​​выше ее области? Я могу получить успешное соединение, воспроизведя объявление $connect в функции.

Любое понимание того, как я могу обойти это или что я здесь делаю неправильно?

Используйте ключевое слово global .

пример

 function getmotd($user) { global $connect; $query = "SELECT cid FROM `users` WHERE id = ".$user; $query = mysql_query($query, $connect); // error occurs here, $connect is not a valid MySQL link-resource /* ... */ } 

Вы также можете сделать это так

 function getmotd($user) { $query = "SELECT cid FROM `users` WHERE id = ".$user; $query = mysql_query($query, $GLOBALS['connect']); // error occurs here, $connect is not a valid MySQL link-resource /* ... */ } 

Если вы хотите сделать повторно используемые коды, вам, вероятно, будет лучше с ООП. Создайте класс для базы данных и добавьте некоторые свойства для информации о базе данных и получите доступ к ним из функций с помощью this ключевого слова.

Вы не можете получить доступ к $ connect, потому что он выходит за рамки функции; то есть PHP может видеть только переменные внутри функции, когда она находится внутри нее. Вы можете использовать ключевое слово global, чтобы PHP знал, что переменная находится за пределами области действия, как предлагает Кемаль, но я думаю, что лучший способ действий – передать соединение в функцию. Это даст вам лучшую инкапсуляцию. Если вы научитесь писать свои функции (и более поздние классы) с передачей необходимых ресурсов и данных (практика, известная как «инъекция зависимостей»), вы обнаружите, что у вас есть более чистый и более удобный код. Вот пример:

 function getmotd($db, $user) { $query = "SELECT cid FROM users WHERE id = " . (int)$user; $result = mysql_query($query, $db); /.../ } $connect = mysql_connect(...); mysql_select_db(...); $motd = getmotd($connect, $user); 

Надеюсь это поможет.