函数内部的mysqli连接不起作用


mysqli connection not working inside function?

在php函数中执行mysql查询时遇到一些问题。我得到的错误是

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

有几个文件相互调用,所以我将尝试概述必要的信息。

访问的URL:

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

serverList/api/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;
    }
}

服务器列表/api/inc/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;
}
?>

服务器列表/api/inc/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());
}
?>

我已经验证了被调用的查询是否有效。我还验证了连接信息(上面屏蔽的)是通过使用该软件的另一个查询数据库的页面来工作的。

我想我一定在某个地方遗漏了一个引号或paren,但我不知道它可能在哪里。

问题出在PHP变量作用域上。在首次引用$link变量之前,在allServer()函数中添加此行:

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