【问题标题】:Equivalent of mysql_list_tables in PHP PDO?相当于 PHP PDO 中的 mysql_list_tables?
【发布时间】:2009-09-20 18:52:51
【问题描述】:

使用PHP PDO访问数据库时,有没有办法列出数据库中的所有表?

需要 mysql_list_tables() 之类的东西。

【问题讨论】:

    标签: php pdo


    【解决方案1】:

    如果使用 SQL 查询来做这样的事情:

    show tables
    

    或者,如果需要,指定数据库:

    show tables from crawler
    

    而且,如果您只想获取一些表格:

    show tables from crawler like 'site%'
    


    实际上,即使 mysql_list_tables() 函数存在,它的手册页也指出:

    此功能已弃用。这是 最好使用mysql_query() 发出SQL SHOW TABLES [FROM db_name] [LIKE 'pattern'] 声明 而是。

    所以,我猜 PDO 应该没问题。


    并且,使用 PDO 进行测试:

    $db = new PDO('mysql:dbname=crawler;host=127.0.0.1', 'crawler', 'crawler');
    $result = $db->query("show tables");
    while ($row = $result->fetch(PDO::FETCH_NUM)) {
        var_dump($row[0]);
    }
    

    我得到了这样的输出:

    string 'headers' (length=7)
    string 'headers_sites' (length=13)
    string 'headers_sites_0' (length=15)
    ...
    string 'headers_sites_7' (length=15)
    string 'reporting_sites_servers_software' (length=32)
    string 'servers' (length=7)
    string 'sites' (length=5)
    string 'sites_0' (length=7)
    ...
    string 'sites_servers' (length=13)
    string 'sites_software' (length=14)
    string 'software' (length=8)
    

    这与我在这个数据库中实际拥有的表相符。

    【讨论】:

    • 是的。只要“显示表”查询语法对所有 PDO 支持的数据库驱动程序都有效,这将起作用。是这样吗?
    • 例如,Postgres 使用“\dt”来列出表,而不是“显示表”。所以如果我们的目标是跨数据库兼容(使用PDO),那么这种方式就行不通了。
    • @saintsjd : 可能不是,不幸的是 :-( ;; 通过 Doctrine ORM 框架的源代码,用于列出数据库表的查询对于 MsSQL 来说有点复杂,更复杂再次用于 SQLite,而 PgSQL 则更复杂 :-(
    • 如果实现跨数据库兼容性是您的真正目标,您可能会更好地使用像 Doctrine 这样的东西(它实现了许多与 DB 兼容性相关的东西),我可以补充一下:PDO 很好,但是它只是抽象了一些差异(比如不必使用 mysqli_* 或 pg_* 或 ...);;它没有抽象出每个数据库引擎理解的 SQL 语法之间的差异。
    • 这就是为什么uk.php.net/manual/en/intro.pdo.php 的文档说:“PDO 不提供数据库抽象”
    【解决方案2】:

    如果您想要一种可移植的方式来查询架构,可以使用 ansi 标准 INFORMATION_SCHEMA

    【讨论】:

      【解决方案3】:
      $alltables=$db->query("SHOW TABLES",PDO::FETCH_NUM);
      
      while($result=$alltables->fetch()){
      
      echo $result[0].'<br/>';
      }
      

      我猜这正是你想要的代码。

      【讨论】:

        【解决方案4】:

        如果您想以跨平台的方式执行此操作,请查看Zend FrameworkZend_Db,它提供了listTables() 方法

        【讨论】:

          猜你喜欢
          • 2017-07-02
          • 2020-02-19
          • 2023-03-21
          • 1970-01-01
          • 1970-01-01
          • 2015-04-22
          • 2010-11-14
          • 1970-01-01
          • 2011-07-12
          相关资源
          最近更新 更多