mysqli соединение не работает внутри функции?

У меня возникают проблемы с выполнением mysql-запроса внутри php-функции. Ошибка, которую я получаю

Notice: Undefined variable: link in C:\path\api\inc\restFunctions.php on line 16 

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

Доступ к URL:

 localhost/serverList/api/rest.php?action=allServers 

SERVERLIST / апи / rest.php

 <?php include 'inc/restFunctions.php'; $possibleCalls = array('allServers','allEnvs','allTypes','false'); if(isset($_GET['action'])){ $action = $_GET['action']; } else{ $action = 'false'; } if(in_array($action,$possibleCalls)){ switch ($action){ case 'allServers': $return = allServers(); break; case 'allEnvs': $return = allEnvs(); break; case 'allTypes': $return = allTypes(); break; case 'false': $return = falseReturn(); break; } } 

SERVERLIST / апи / вкл / restFunctions.php

 <?php include ('inc/config.php'); function allServers(){ $serverInfoQuery = "SELECT * FROM servers" $allServerResults = $link->query($serverInfoQuery); $json = array(); while($row = $allServerResults->fetch_assoc()){ $json[]['serverID'] = $row['serverID']; $json[]['environment'] = $row['environment']; $json[]['type'] = $row['type']; $json[]['serverIP'] = $row['serverIP']; $json[]['serverDescription'] = $row['serverDescription']; $json[]['serverCreatedBy'] = $row['serverCreatedBy']; $json[]['serverCreatedDtTm'] = $row['serverCreatedDtTm']; $json[]['serverUpdatedBy'] = $row['serverUpdatedBy']; $json[]['serverUpdatedDtTm'] = $row['serverUpdatedDtTm']; } $jsonResults = json_encode($json); return $jsonResults; } ?> 

SERVERLIST / апи / вкл / config.php

 <?php $host = 'localhost'; $user = 'userName'; $password = 'password'; $database = 'database'; $link = new mysqli($host, $user, $password, $database); if (mysqli_connect_errno()) { exit('Connect failed: '. mysqli_connect_error()); } ?> 

Я проверил, что вызываемый запрос работает. Я также подтвердил, что информация о подключении (замаскированная сверху) работает с использованием другой страницы этого программного обеспечения, которая запрашивает db.

Я предполагаю, что, должно быть, я пропустил цитату или парню, но я не понимаю, где это может быть.

Related of "mysqli соединение не работает внутри функции?"

Проблема связана с областью определения переменных PHP. Добавьте эту строку внутри функции allServers (), прежде чем ссылаться на переменную $ link в первый раз:

 global $link; 

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

По-моему, использование глобальных переменных не является хорошим решением. Вы можете переопределить $ link ($ link скорее обычное имя для переменной, которую вы, возможно, используете для других целей), переменную в некоторой области случайно, что приводит к путанице и сложной отладке. Просто передайте его как параметр функции – намного чище и легче читать:

 function AllServers($link) { $serverInfoQuery = "SELECT * FROM servers"; $allServerResults = $link->query($serverInfoQuery); //More PHP code } if(in_array($action,$possibleCalls)){ switch ($action){ case 'allServers': $return = allServers($link); break; } } 

Честно говоря, даже лучшее решение будет использовать некоторые общие классы / функции для установления вашего соединения mysql следующим образом:

 class DB { private static $link = null; public static function getConnectionResource() { //In that way we "cache" our $link variable so that creating new connection //for each function call won't be necessary if (self::$link === null) { //Define your connection parameter here self::$link = new mysqli($host, $user, $password, $database); } return self::$link; } } function getAllServers() { $link = DB::getConnectionResource(); //Preform your query and return results } 

Использовать глобальную переменную

 function allServers(){ global $link ... ... ... ... your code follows