0

您好,我对 PHP 编程特别陌生,所以这是我的问题。

我有一个名为 Connection 的类。我只是想创建一个连接类,我可以在其中实例化并立即获得连接,而且我不想每次连接到数据库时都填写本地主机用户名、密码、数据库,所以我制作了这个非常简单的类:

class Connection
{
    private $mysqli;
    private $filehandle;

    private $_isConnected;
    private $_isFileLoaded;

    public function __construct( $filename )
    {
        $_isFileLoaded = $this->loadKeyFromFile( $filename );
    }

    public function __destruct()
    {
        if( $this->_isConnected )
            mysqli_close( $this->mysqli );
    }

    public function getConnection()
    {
        return ( $this->_isConnected )? $this->mysqli : false;
    }

    public function isFileLoaded()
    {
        return $this->_isFileLoaded;
    }

    public function isConnected()
    {
        return $this->_isConnected;
    }

    private function loadKeyFromFile( $filename )
    {   
        if( !file_exists( $filename ) )
            return false;

        $filehandle = fopen( $filename , 'r' );
        $read = array();

        while( $line = fgets( $filehandle ) )
        {
            $read[] = $line;
        }

        fclose( $filehandle );

        if( count( $read ) == 4 )
        {
            $localhost = $read[ 0 ];
            $username  = $read[ 1 ];
            $password  = $read[ 2 ];
            $database  = $read[ 3 ];
            $this->_isConnected = $this->connect( $localhost ,$username , $password , $database );
            return true;
        }
        else
            return false;
    }

    private function connect($host , $user , $pass , $db )
    {           
        $this->mysqli = mysqli_connect( $host , $user , $pass , $db ) or die( "Database connection failed : " . mysqli_connect_error() );
        return ( true )? true : false;
    }
}

我不明白的是,即使主机是 localhost,它也找不到主机。当我尝试更改行时: mysqli_connect( 'localhost' , $user , $pass , $db );

它就像一个魅力!似乎它无法读取 $host 变量,我也有与 $user 和 $pass 相同的问题。在 $db 上我没有问题,它可以简单地读取我想要选择的数据库的名称。我已经检查了 $host $user 和 $pass 在他们的本地范围内的值,当他们第一次在函数 loadKeyFromFile() 中被读取时,它们似乎包含我真正需要的值来启动一个我只是不明白的连接这就是数据库无法检测到它的原因。我也尝试用“”包装这些变量,但仍然没有运气。

我很困惑。我不知道如何解决这个问题。典型的错误,你知道的,我什至不认为我必须发布它。mysqli_connect 抛出一个错误,即使主机是 localhost,也没有找到这样的主机。但是当我尝试插入除第 4 个参数之外的实际参数时,它可以工作。

connkey.txt 包含这些字符串

    localhost
    root
    password123
    virtualassistant

print_r 打印出结果

数组( [0] => 本地主机

    [1] => root

    [2] => password123

    [3] => virtualassistant
)

我错过了什么吗?谢谢你的时间。

4

3 回答 3

2

写如下

$con = new Connection();
$con->connect('localhost','username','password','database_name');

无论您是否获得这些传递的变量值,都尝试在连接函数中回显。这些应该对你有用。如果成功连接,请将连接函数中的变量 $_isConnected 的值设置为 true。

于 2013-10-03T06:57:19.230 回答
1

我认为,您未能正确读取配置文件。以下链接描述了从配置文件中读取数据的各种方法。

http://www.phpro.org/articles/Application-Configuration.html

例如:

创建一个名为“ config.ini ”或其他的文件。

将以下内容放入文件中:

[database]
db_username = virtualassistant
db_password = password123
db_host = localhost
db_name = test

现在,从您的 PHP 脚本中:

<?php

/*** parse the ini file ***/
    $config = parse_ini_file("config.ini", 1);

    /*** print the array ***/
    print_r($config);

您将收到一个如下所示的数组:

Array
    (
        [database] => Array
        (
            [db_username] => virtualassistant
            [db_password] => password123
            [db_host] => localhost
            [db_name] => test
        )
)

简单的...:)

于 2013-10-03T07:01:45.733 回答
0

因此,根据 Yogesh Suthar 的说法,他注意到除了第四个参数之外,每个参数都有一个额外的空格。这是因为我逐行读取此文本文件,以便每个参数都由换行符分隔,因此当我读取该行时,它会将换行符转换为空格,因为我的 var_dump 的结果。我的说法可能是错误的,但这会导致问题。第四个参数不再分开,因为下一个已经是 EOF,所以它没有多余的空间。我没有怀疑过。所以现在我已经尝试按照建议使用 trim( $val ) 每个参数进行修剪,它可以工作!谢谢你们!你太棒了!

于 2013-10-03T07:40:19.437 回答