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

7
我正在尝试使用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;
}

然而,我高估了我所使用的功能。getDefaultAdapter()可能返回null,但如果没有要连接的数据库,则会抛出异常。同样,describeTable()也会抛出异常而不是返回空数组。

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


1
使用try{}和catch{}捕获getDefaultAdapter引发的异常怎么样? - Marcin
1
异常并没有错,只需要在调用时加上 try { } catch 语句即可。http://php.net/manual/zh/language.exceptions.php - Ashley
2个回答

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

谢谢,我希望有一些针对Zend的特定函数,但这个也可以,所以我会接受这个。只是一个备注:catch需要括号(catch(Exception $e) {...) :). - mingos
好的,谢谢,我会编辑它。刚刚做了一个快速复制/粘贴的事情 :p - Shikiryu
只是顺便提一下,您可以使用SQL的IF(NOT)EXISTS函数来验证数据库/表是否存在。 - Simon
@Simon:你说得对,即使有一个被接受的答案,你也应该把你认为能帮助OP(或未来的读者)的东西作为答案。但是,在这里,使用那种PDO不需要这样的查询,因为它通常已经是引发异常的原因了。 - Shikiryu
@Simon:我先试了这些,但是在Zend Framework中它们并没有起作用 :(。 - mingos

0

describeTable会工作,但如果表不存在则会出错,因此我选择了下面的方法,它将返回0或1,如果表存在。

 $db = Zend_Db_Table::getDefaultAdapter();
 $sql = 'SELECT count(*) FROM information_schema.TABLES WHERE TABLE_NAME = \'table name\'';
 $result = $db->query($sql)->fetch();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接