检查数据库和/或表是否存在

min*_*gos 7 php sql database installer zend-framework

我正在尝试使用Zend Framework编写一个简单的安装脚本.它应该运行一些测试:

  • 测试application.ini中指定的数据库是否存在(或者是否有访问权限).
  • 如果是,请测试user数据库中是否存在调用的表
  • 如果是,请检查是否有网站管理员用户

如果任何步骤失败,控制器将负责将用户重定向到安装过程的正确步骤.

我用以下代码创建了一个模型:

public function verify () {
    $db = $this->getDefaultAdapter(); //throws exception
    if ($db == null) return self::NO_BATABASE;
    $result = $db->describeTable('user'); //throws exception
    if (empty($result)) return self::NO_USER;
    $result = $db->fetchRow('SELECT * FROM user WHERE id = 1');
    if ($result == null) return self::USER_EMPTY;
    else return self::OK;
}
Run Code Online (Sandbox Code Playgroud)

但是,我高估了我使用过的功能.getDefaultAdapter()可能会返回null,但如果没有要连接的数据库,则会抛出异常.同样的情况发生describeTable(),抛出异常而不是返回一个空数组.

因此,我的问题是:如何检查数据库/表是否存在而不会出现异常或错误?

Shi*_*ryu 11

粗略的例子:

public function verify () {
    try{
       $db = $this->getDefaultAdapter(); //throws exception
       if ($db == null) return self::NO_BATABASE;
    }catch(Exception $e){
       return self::NO_BATABASE;
    }
    try{
       $result = $db->describeTable('user'); //throws exception
       if (empty($result)) return self::NO_USER;
    }catch(Exception $e){
       return self::NO_USER;
    }
    $result = $db->fetchRow('SELECT * FROM user WHERE id = 1');
    if ($result == null) return self::USER_EMPTY;
    else return self::OK;
}
Run Code Online (Sandbox Code Playgroud)