如何在PHP和Laravel中测试MySQL连接?

时间:2014-06-12 17:40:27

标签: php mysql laravel laravel-4

我正在制作PHP应用程序安装程序(类似于Wordpress安装脚本),我需要在安装过程中使用用户提供的主机名,用户名,密码和数据库来检查mysql连接。

我使用此代码作为Laravel控制器方法来测试连接:

public function TestDatabaseConnection(){
    try {
        $database_host = Config::get('config.database_host');
        $database_name = Config::get('config.database_name');
        $database_user = Config::get('config.database_user');
        $database_password = Config::get('config.database_password');

        $connection = mysqli_connect($database_host,$database_user,$database_password,$database_name);

        if (mysqli_connect_errno()){
                return false;
            } else {
                return true;
            }

    } catch (Exception $e) {

        return false;

    }
}

此代码似乎无法正确测试连接。函数返回值(true / false)并不取决于用户是否提供db数据,或者db数据是否正确/不正确。

Fils /app/config/config.php包含以下数组:

<?php return array('database_host' => 'localhost', 'database_name' => 'dbasename',    'database_user' => 'dbuser', 'database_password' => 'pass');

并且在安装过程中通过表单进行更新。

有没有办法修改此代码,或者您有其他一些代码建议?

3 个答案:

答案 0 :(得分:5)

你的问题是:

  

如何在PHP和Laravel中测试MySQL连接?

但是你要设置一个标准的PHP MySQLi连接:

$connection = mysqli_connect($database_host,$database_user,$database_password,$database_name);

你为什么这样做?使用框架的整个目的是在框架内工作。包含这两个基本系统概念的东西:

  • 阅读配置文件。
  • 建立数据库连接。

做这些事情几乎是每个有能力且广泛采用的编程框架应该能够在其自身的结构和处理范围内处理。使用它自己的方法。

所以说,看the Laravel documentation on “Basic Database Usage”显示以下内容。它位于app/config/database.php.

中的数据库配置文件中
'mysql' => array(
    'read' => array(
        'host' => '192.168.1.1',
    ),
    'write' => array(
        'host' => '196.168.1.2'
    ),
    'driver'    => 'mysql',
    'database'  => 'database',
    'username'  => 'root',
    'password'  => '',
    'charset'   => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix'    => '',
),

该示例有两个不同的数据库连接:一个用于read,另一个用于write,但这并不是简单项目的大多数数据库连接的工作方式。因此,您也可以使用以下设置进行设置:

'mysql' => array(
    'host'      => Config::get('config.database_host'),
    'driver'    => 'mysql',
    'database'  => Config::get('config.database_name'),
    'username'  => Config::get('config.database_user'),
    'password'  => Config::get('config.database_password'),
    'charset'   => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix'    => '',
),

然后要测试该连接,您只需执行此操作:

if(DB::connection()->getDatabaseName())
{
   echo "Yes! successfully connected to the DB: " . DB::connection()->getDatabaseName();
}

但那说你也说:

I'm making a PHP application installer…

为什么在Phing等PHP构建系统存在时重新发明轮子?

答案 1 :(得分:2)

您可以使用以下方法检查是否建立了连接:

if(DB::connection()) {
    // connection is made
}

因为您不需要手动建立连接。如果用户在app/config/database.php中提供了正确的凭据,那么用户将能够在数据库中进行查询,但是如果您需要检查连接,那么上面给出的代码可以检查,因为如果没有建立连接则会出错将抛出并在有效连接上返回Illuminate\Database\MySqlConnection对象。因此,在这种情况下,它也可以使用:

if(DB::connection() instanceof Illuminate\Database\MySqlConnection) {
    // connection is made
}

因此,根据您的TestDatabaseConnection方法示例,您可以执行以下操作:

public function TestDatabaseConnection(){
    // Returns Illuminate\Database\MySqlConnection on successful
    // connection; otherwise an exception would be thrown if failed
    return DB::connection();
}

答案 2 :(得分:1)

如果你真的想抓住laravel db连接失败的错误, 你可以定义:

 App::error(function(PDOException $exception, $code)
 {
     die('do what you want here');
 });

我在里面定义了它:

/app/start/global.php

你可以在任何你喜欢的地方定义它。