我正在尝试使用Zend Framework编写一个简单的安装脚本。它应该运行一些测试:
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()
也是如此,它抛出异常而不是返回一个空数组。
因此,我的问题是:如何检查数据库/表是否存在而不会出现异常或错误?
答案 0 :(得分: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;
}
答案 1 :(得分: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();