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

发布于 2024-10-18 11:27:16 字数 870 浏览 0 评论 0原文

我正在尝试使用 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() 也会发生同样的情况,它抛出异常而不是返回空数组。

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

I am trying to write a simple installation script using Zend Framework. It's supposed to run a few tests:

  • test if the database specified in application.ini exists (or if there's access to it).
  • if it does, test if a table called user exists within the database
  • if it does, check if there's a site admin user

Should any of the steps fail, the controller will take care of redirecting the user to the proper step of the installation process.

I created a model with the following code:

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

However, I overestimated the functions I have used. getDefaultAdapter() may return null, but in case there's no database to connect to, an exception is thrown. Same happens with describeTable(), which throws an exception instead of returning an empty array.

My question is therefore: how do I check whether the database/table exists without getting an exception or error?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

陌上青苔 2024-10-25 11:27:16

粗略的例子:

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

Rough example :

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;
}
七色彩虹 2024-10-25 11:27:16

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();

describeTable will work but will error if the table does not exists, so I went for the below as it will will return 0 or 1 if the table exists.

 $db = Zend_Db_Table::getDefaultAdapter();
 $sql = 'SELECT count(*) FROM information_schema.TABLES WHERE TABLE_NAME = \'table name\'';
 $result = $db->query($sql)->fetch();
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文