【问题标题】:MySQL failed to connect when passing $variables $PHP传递 $variables $PHP 时 MySQL 连接失败
【发布时间】:2013-10-03 06:45:32
【问题描述】:

您好,我对 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;
    }
}

我不明白的是,即使主机是本地主机,它也找不到主机。 当我尝试更改线路时: 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
)

我错过了什么吗?感谢您的宝贵时间。

【问题讨论】:

  • 检查你的 $read 数组
  • 我认为你不应该这样进行配置!看看这个问题stackoverflow.com/questions/3996475/…
  • 嗯,我不明白我的代码是什么配置?实际上它只是读取一个简单的文本文件,其中写入了 localhost 用户名密码和数据库的名称,仅此而已。我只是不明白为什么 $localhost, $username ,$password 会失败,就好像它读取垃圾信一样,而数据库不是?是的,我会转储数组的内容,看看有什么失败。我能感觉到这可能是问题所在,因为 $db 是最后一个从文件中读取的。我这样做是为了了解 PHP 类是如何工作的,只是碰巧我在数据库连接上尝试过。
  • @NeonWarge 在您发布输出时,可以清楚地看到文本有 1 个额外的空间,因此请使用 trim($localhost),etc...
  • 很好用!所以我不喜欢在阅读时修剪,有没有办法逐行阅读而不包括额外的'\ n'。在我的代码中,它将新行读取为空格。很奇怪。

标签: php mysqli


【解决方案1】:

如下写

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

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

【讨论】:

  • 它有效。那么一定是什么问题呢?为什么在 loadKeyFromFile 中不起作用?
  • 如果 print_r($read); 你会得到什么如果没有得到任何数据,那么文件权限或数据格式肯定有问题。
【解决方案2】:

我想,你没有正确读取配置文件。以下链接描述了从配置文件中读取数据的各种方法。

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
        )
)

简单...:)

【讨论】:

  • 哇大字,我没有类似的配置文件。我的文本文件包含简单的文本,即:localhost root password123 virtualassistant 就是这么简单
  • 哇,谢谢!关于如何正确编写连接类是一个好主意,但实际上我读取文本文件的方式很简单。我希望你已经阅读了我的帖子。我已经编辑过了。我还不想尝试那个。我无法克服这一点。大声笑
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2016-03-19
    • 2012-03-13
    • 2015-08-23
    • 1970-01-01
    • 2013-06-12
    • 2015-01-27
    • 2012-12-21
    • 2019-03-01
    • 1970-01-01
    相关资源
    最近更新 更多