【问题标题】:Codeigniter/PHP check if can connect to databaseCodeigniter/PHP 检查是否可以连接到数据库
【发布时间】:2012-09-18 19:40:10
【问题描述】:

我想用我的主数据库备份我的只读副本(即从属)数据库,但我做的这个简单的布尔值失败了:

$config['hostname'] = "myReadReplicaDatabase.com";
//...$config['other_stuff']; other config stuff...
$db_obj=$CI->load->database($config, TRUE);

if(!$db_obj){
     $config['hostname'] = "myMasterDatabase.com";
     $db_obj=$CI->load->database($config, TRUE);
}

终止我的只读副本数据库后,我希望布尔值评估为FALSE,然后脚本使用我的主数据库。不幸的是,我得到了以下 PHP 错误:

Unable to connect to your database server using the provided settings.
Filename: core/Loader.php

我想要的只是连接返回真或假,有人知道如何在 Codeigniter 中执行此操作吗?

【问题讨论】:

  • 使用第二个参数为 TRUE 手动连接到 codeigniter 中的数据库,将返回可以运行查询的数据库对象。如果连接由于某种原因被拒绝,codeigniter 将停止您的应用程序并为您抛出该错误。
  • 我知道这一点,但如何让它使用第二个配置 hostname 而不是抛出错误?
  • @wes 你能提供一个证明try/catch的答案吗?
  • 查看 CI 文档,有一个配置选项可以抑制 db 错误,尝试将其添加到第一个配置数组中,看看效果如何;键名是 $config['db_debug'] = false;然后在第二个数据库配置中将其设置回 true。
  • @Ibere 谢谢,不幸的是,抑制调试错误所做的只是防止长时间超时和显示错误消息。它不会使 $db_obj 返回 FALSE 以便使用我的主数据库配置。

标签: php mysql codeigniter database-connection


【解决方案1】:

this thread on Codeigniter forums 已回答我的问题。

关键是自动初始化数据库:

$db['xxx']['autoinit'] = FALSE; 

要抑制错误,您可以设置它

$db['xxx']['db_debug'] = FALSE; 

然后在检查数据库状态的代码中,检查 initialize() 函数的 TRUE/FALSE:

$db_obj = $this->database->load('xxx',TRUE);
  $connected = $db_obj->initialize();
  if (!$connected) {
  $db_obj = $this->database->load('yyy',TRUE);
} 

这是我的整个配置文件以供将来参考:https://gist.github.com/3749863

【讨论】:

  • 您好,codeigniter 论坛的链接失效了。请建议备用网址。谢谢。
  • 论坛不是理解所必需的。我把它包括在内只是为了感谢原作者。
  • $this->database->load 必须是 $this->load->database
【解决方案2】:
$this->load->database();

print_r($this->db);

【讨论】:

  • 您能否为您的答案添加任何解释? :)
  • 1.打开文件夹 application->config->database.php 中的 database.php 文件 2.编辑 database.php 文件 $db['default'] = array( 'hostname' => 'localhost ', 'username' => '你的mysql用户名', 'password' => 'password', 'database' => 'database name' ); 3.在welcome controller index方法里面我们可以写 //load database libraries $this->load->database(); //调用databse.php里面的db方法 print_r($this->db);
【解决方案3】:

我测试了我发现的所有东西,没有任何东西,我发现的唯一方法是使用 dbutil 检查数据库是否存在,如下所示:

$this->load->database();
$this->load->dbutil();

// check connection details
if( !$this->dbutil->database_exists('myDatabase'))
    echo 'Not connected to a database, or database not exists';

【讨论】:

    【解决方案4】:

    根据这里所说的: Codeigniter switch to secondary database if primary is down

    您可以在$db_obj 上查看conn_id

    if ($db_obj->conn_id === false) {
        $config['db_debug'] = true;
        $config['hostname'] = "myMasterDatabase.com";
        $db_obj=$CI->load->database($config, TRUE);
    }
    

    这应该可行。

    【讨论】:

      【解决方案5】:

      当您连接到数据库时,如果成功则返回带有连接 ID 的连接对象,否则返回 false。

      您可以检查它以确保数据库连接已完成。

      $db_obj=$CI->load->database($config, TRUE);
      if($db_obj->conn_id) {
          //do something
      } else {
          echo 'Unable to connect with database with given db details.';
      }
      

      试试这个,如果您有任何其他问题,请告诉我。

      【讨论】:

        【解决方案6】:
        try { 
        
        // do database connection
        
        } catch (Exception $e) {
          // DO whatever you want with the $e data, it has a default __toString() so just echo $e if you want errors or default it to connect another db, etc.
          echo $e->getMessage();
        
        // Connect to secondary DB.
        }
        

        对于那些不赞成我的人,您可以这样做。异常将捕获 PDOException。

        try {
        
            $pdo = new PDO($dsn, $username, $password);
        
        } catch(PDOException $e) {
        
            mail('webmaster@example.com', 'Database error message', $e->getMessage());
        
            // and finally... attempt your second DB connection.
        
           exit;
        
        }
        

        【讨论】:

        • PHP 错误不是异常,无法捕获。但是,如果 CI 将所有错误都转换为异常,情况可能并非如此
        • -@wes,很遗憾这不起作用,还有其他建议吗?
        • 您可以捕获数据库错误。在这种情况下,codeigniter 可以关闭。
        • CI 有它自己的 db 包装器并且不使用 pdo,这就是它触发错误的原因。您可以捕获 PDO 引发的异常,而不是错误。
        • @karka91 好吧,那是一个交易破坏者。
        【解决方案7】:
        $readReplica = @$CI->load->database($config, TRUE); // ommit the error
        if ($readReplica->call_function('error') !== 0) {
            // Failed to connect
        }
        

        我不确定错误代码(不确定它是否是 int/string)并且附近没有 CI 来测试它,但这个原则应该有效

        【讨论】:

        • -@karka91,谢谢,你能解释一下为什么你把@放在$CI前面吗?
        • @ 运算符隐藏由下一个函数调用触发的任何错误,因此不会显示您得到的错误。但是,你不会知道你是否连接了这就是为什么你应该尝试调用 mysql_error 来检查连接是否正常
        • 嗯,call_function() 是什么?你能在你的答案中显示我应该把mysql_error放在哪里吗?
        • 不需要打电话给mysql_error。当您调用call_function('error') 时,CI 会调用它。 Documentation$readReplica->call_function('error') === mysql_error($readReplica->conn_id)
        • $readReplica->call_function('error') !== 0 不是正确的语法。您介意通过 Codeigniter 查找正确的错误代码吗?
        【解决方案8】:

        对我有用

        $config['xxx'] = xx;
                ...    
        $config['db_debug'] = false;
        $db_obj = @$this->load->database($config,true);
        if(!@$db_obj->initialize()){
            echo "Unable to connect database";
            die;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-13
          • 2012-08-26
          • 2016-11-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多