如何在 PHP 和 Laravel 中测试 MySQL 连接? [重复]

问题描述 投票:0回答:3

我正在制作一个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)并不取决于用户是否提供数据库数据,或者数据库数据是否正确/不正确..

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

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

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

有什么方法可以修改此代码或者您有其他代码建议吗?

php mysql laravel laravel-4
3个回答
5
投票

您的问题是:

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

但是您正在设置标准 PHP MySQLi 连接,如下所示:

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

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

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

几乎所有有能力且被广泛采用的编程框架都应该能够在其自己的结构内并使用自己的方法来处理这些事情。

也就是说,查看 Laravel 文档中的“基本数据库使用” 显示了以下内容。这位于位于

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();
}

但是你也在说:

我正在制作 PHP 应用程序安装程序......

既然存在诸如

Phing
这样的 PHP 构建系统,为什么还要重新发明轮子呢?


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();
}

1
投票

如果你真的想捕获laravel db连接失败的错误, 你可以定义这个:

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

我在里面定义了它:

/app/start/global.php

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

© www.soinside.com 2019 - 2024. All rights reserved.