0

配置文件:

$settings = array();

$settings['mysqlhost'] = 'localhost'; // Mysql hostname
$settings['mysqluser'] = '**'; // Mysql username
$settings['mysqlpass'] = '**'; // Mysql password
$settings['mysqldatb'] = '**'; // Mysql database

函数.php:

include_once('config.php'); 

function si_connect_db(){

    $connection = mysql_connect($settings['mysqlhost'], $settings['mysqluser'], $settings['mysqlpass']);
    $selectdb = mysql_select_db($settings['mysqldatb'], $connection);

    if($connection){
        if($selectdb){
            return true;
        }
        else
        {
            return false;
        }
    }
    else
    {
        return false;
    }
}

现在当我做例如:

include_once('functions.php');
si_connect_db();

我没有连接...我该怎么做?

4

5 回答 5

3

默认情况下,在函数外部声明的 PHP 变量在函数内部不可见。


如果您在函数外部声明一个变量,并希望它在该函数内可见,则必须使用global关键字:

function si_connect_db(){

    global $settings; // Make $settings visible inside the function

    $connection = mysql_connect($settings['mysqlhost'], $settings['mysqluser'], $settings['mysqlpass']);
    $selectdb = mysql_select_db($settings['mysqldatb'], $connection);

    ...


有关更多信息,您应该查看手册的变量范围部分。

于 2011-02-26T13:51:38.527 回答
2

你应该$settings作为全局变量

function si_connect_db(){
   global $settings;

http://php.net/manual/en/language.variables.scope.php

于 2011-02-26T13:50:56.100 回答
2

您必须在函数中使用global关键字来让函数知道它$settings是全局的。

最好使用define()例如定义全局常量:

define(MYSQLHOST, 'localhost');

这样您就不必使用global关键字来定义您的配置设置。

于 2011-02-26T13:52:39.217 回答
1

这是一个范围界定问题。该功能本质上$settings是不可见的si_connect_db

应该做的是$settings作为参数传递给si_connect_db函数。这可以通过global代替来完成,但是使用全局变量是不好的做法,并且出于多种原因不赞成。可测试性、可维护性、可读性和一般的 OOP 设计(因为它打破了封装)。

function si_connect_db($settings) {
    // do stuff here
}

然后:

include_once('functions.php');
si_connect_db($settings);
于 2011-02-26T13:59:55.377 回答
0

您应该在函数中包含您的设置文件。看在上帝的份上,避免使用全局范围。我也建议您这样做,因为如果您只需要连接,就会调用设置文件。使用我的方法,您也可以忘记每次需要连接时在每个应用程序的页面中包含设置文件。使用关键字 global 只是一种技巧。

于 2011-02-26T14:13:46.083 回答