【问题标题】:How to test MySQL connection in PHP and Laravel? [duplicate]如何在 PHP 和 Laravel 中测试 MySQL 连接? [复制]
【发布时间】:2014-08-03 03:31:48
【问题描述】:

我正在制作一个 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;

    }
}

此代码似乎无法正确测试连接。函数返回值(真/假)不依赖于用户是否提供数据库数据,或者数据库数据是否正确/不正确..

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

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

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

有没有办法修改这段代码或者你有其他代码建议?

【问题讨论】:

  • ...问题是?
  • 问题在标题中。我还编辑了问题的正文
  • 我发布了完整的答案,但为什么不使用Phing 作为应用程序安装程序呢?无需在这种东西上重新发明轮子。

标签: php mysql laravel laravel-4


【解决方案1】:

你的问题是:

如何在 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 构建系统存在时,为什么要重新发明轮子?

【讨论】:

  • 关于 Phing:你明白我想要做什么了吗?像 Wordpress 网络安装程序之类的东西。 Phing 有能力做出这样的事情吗?
  • 所以你想在 Laravel 中创建一个安装程序来安装 Laravel 应用程序?那么Phing就不合适了。这是一个命令行安装程序。我仍然建议您在 Laravell 框架中工作的统计数据相同。
  • 是的,我正在尝试将应用程序分发给不知道使用命令行等的非技术型人员。只是上传应用程序并使用分步安装向导安装它。跨度>
  • @mpet 是的。这就是为什么我说 Phing 不合适。
  • 检查 getDatabaseName 实际上并没有对数据库做任何事情。它返回.env中的配置变量的值,所以这不起作用。
【解决方案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();
}

【讨论】:

  • 这不起作用,Laravel DB::connection() 会返回一个 Illuminate\Database\MySqlConnection 对象,即使数据库不存在或凭据错误。稍后,当您尝试查询数据库时,代码将引发异常。
  • 是的,它会抛出一个异常,所以用户会得到它。检查每个必需的参数是否可用。应该调用DB::connection()-&gt; getConfig(),它将返回一个数组,但要检查数据库是否可用,必须进行查询,例如something like this。如果凭据无效,则查询将不会成功,在这种情况下,任何人都无法检查mySql 的凭据,他们只能知道凭据与异常不匹配。
【解决方案3】:

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

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

我在里面定义了:

/app/start/global.php

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

【讨论】:

    猜你喜欢
    • 2012-01-04
    • 2019-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多