Php 全局变量,无法关闭连接

Php 全局变量,无法关闭连接,php,mysqli,global-variables,database-connection,Php,Mysqli,Global Variables,Database Connection,上面的代码文件包含在第二个文件的顶部,我正在尝试关闭数据库连接 global $link; function linkDb() { $hostname = 'xxxxx'; $username = 'xxxxxx'; $password = 'xxxxxx'; $database = 'xxxxxx'; $link = mysqli_connect($hostname, $username, $password); if (!$link)

上面的代码文件包含在第二个文件的顶部,我正在尝试关闭数据库连接

global $link;

function linkDb() {

    $hostname = 'xxxxx';
    $username = 'xxxxxx';
    $password = 'xxxxxx';
    $database = 'xxxxxx';

    $link = mysqli_connect($hostname, $username, $password);

    if (!$link) {
        echo ('Error: Could not make a database link using provided credentials');
        die();
            } 

            if (!mysqli_select_db($link, $database)) {
        echo ('Error: Could not connect to database');
        die();
    }   

    return $link;           
}

function unlinkDb() {
    mysqli_close($link);    
}
但是它说

unlinkDb();

我很困惑。

您需要在函数中使用
global
关键字:

"ERROR: Undefined variable: link "
然后按如下方式使用:

function unlinkDb() {
    global $link;
    mysqli_close($link);    
}
尽管更好的解决方案是不使用
global
关键字并将
$link
作为参数传递给
linkDb()


在此处使用函数定义:

$link = linkDb();
unlinkDb($link);

如果您希望将连接保持在类内部(我假设我正在查看一个类),那么可以将其定义为变量,并从实例化对象内部引用它; 这样,您可以通过调用$This->linkDb()从对象内部的任何位置关闭/打开连接;和/或$this->unlinkDb()

您还可以通过函数本身传递它(如前所述),假设您不是在类中工作:

class DBClass {
    private $link;

    function linkDb(){
       $this->link = mysqli_connect($hostname, $username, $password);
    }

    function unlinkDb() {
        mysqli_close($this->link);    
    }
}

我对代码进行了修改,并将其更改为以下内容:

function linkDb(){
    $link = mysqli_connect($hostname, $username, $password);
    // Do fancy stuff
    unlinkDb($link);
}

function unlinkDb($link){
    mysqli_close($link);
}
在打开连接的另一个文件中,我执行了以下操作:

function linkDb() 
{ 
   $link = ''; 
 .............. 
} 

function unlinkDb($link) { 
   mysqli_close($link); 
} 
在同一个文件中,通过以下方式调用函数关闭DB:

$link = linkDb(); 

现在,它的工作方式,我需要。我要感谢所有在这里试图帮助我的人。

您需要在您的函数中将$link定义为全局函数,以便在这些函数中赋予它作用域。。。。在外部将其定义为全局是没有意义的,因为它已经是全局的,所以也尝试了这一点,但它不起作用(…也就是说,在每个使用全局
$link
的函数中,必须将其标识为
global$link;
不要在更高的范围内这样做,在函数中这样做。更好的是,使用
$GLOBALS['link']
更好的是,将
$link
作为参数传递给需要它的函数。您的解决方案类似于下面给出的两个答案。@farhanahmed为什么不接受其中一个来结束问题?但我不想要参数化的函数。为什么不呢?这是函数参数的教科书用例。如果您想继续更改在函数中,必须在函数参数之前添加&operator。否则,更改只能用于函数范围。
function linkDb() 
{ 
   $link = ''; 
 .............. 
} 

function unlinkDb($link) { 
   mysqli_close($link); 
} 
$link = linkDb(); 
unlinkDb($link);