【问题标题】:MySQL check if a table exists without throwing an exceptionMySQL 检查表是否存在而不抛出异常
【发布时间】:2010-12-04 06:58:26
【问题描述】:

在不抛出异常的情况下,检查 MySQL 中是否存在表(最好通过 PHP 中的 PDO)的最佳方法是什么。我不想解析“SHOW TABLES LIKE”等的结果。一定有某种布尔查询?

【问题讨论】:

    标签: php mysql pdo database


    【解决方案1】:

    我使用 mysqli 创建了以下函数。假设你有一个名为 $con 的 mysqli 实例。

    function table_exist($table){
        global $con;
        $table = $con->real_escape_string($table);
        $sql = "show tables like '".$table."'";
        $res = $con->query($sql);
        return ($res->num_rows > 0);
    }
    

    希望对你有帮助。

    警告:@jcaron 建议此函数可能容易受到 sqlinjection 攻击,因此请确保您的 $table 变量是干净的,或者更好地使用参数化查询。

    【讨论】:

    • 仅当您让某人填充 $table var 时,并非 sql 语句中的每个 var 都是危险的,只有当您从不受信任的来源获取数据时。当然,您对如何使用该功能和进行过滤负责。没有必要对这个答案投反对票。
    • 如果你发布这样的代码,最终会有人在没有正确检查数据的地方使用它,并最终导致SQL注入。只需使用参数化请求,无论数据是否已检查,您都将避免任何问题。在这里没有任何理由不这样做,这只是不好的做法。
    • 添加一个real_escape_string怎么样?
    • 使用参数化查询并避免恐怖故事。
    【解决方案2】:

    如果想要这样做的原因是有条件的表创建,那么“CREATE TABLE IF NOT EXISTS”似乎是这项工作的理想选择。在我发现这一点之前,我使用了上面的“DESCRIBE”方法。更多信息在这里:MySQL "CREATE TABLE IF NOT EXISTS" -> Error 1050

    【讨论】:

      【解决方案3】:

      Zend 框架

      public function verifyTablesExists($tablesName)
          {
              $db = $this->getDefaultAdapter();
              $config_db = $db->getConfig();
      
              $sql = "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = '{$config_db['dbname']}'  AND table_name = '{$tablesName}'";
      
              $result = $db->fetchRow($sql);
              return $result;
      
          }
      

      【讨论】:

        【解决方案4】:

        由于“显示表”在大型数据库上可能会很慢,我建议使用“DESCRIBE”并检查结果是否为真/假

        $tableExists = mysqli_query("DESCRIBE `myTable`");
        

        【讨论】:

        • 从我读到的内容来看,如果“SHOW”变得低效,那么“information_schema”比“DESCRIBE”更受欢迎。
        【解决方案5】:

        如果有人来寻找此问题,则会发布此信息。即使它被回答了一点。有些回复使它变得比它需要的更复杂。

        对于我使用的 mysql*:

        if (mysqli_num_rows(
            mysqli_query(
                            $con,"SHOW TABLES LIKE '" . $table . "'")
                        ) > 0
                or die ("No table set")
            ){
        

        在我使用的 PDO 中:

        if ($con->query(
                           "SHOW TABLES LIKE '" . $table . "'"
                       )->rowCount() > 0
                or die("No table set")
           ){
        

        有了这个,我只是将 else 条件推入 or。为了我的需要,我只需要死。虽然你可以设置或其他的东西。有些人可能更喜欢 if/else if/else。然后删除 or 然后提供 if/else if/else。

        【讨论】:

          【解决方案6】:

          这是我在使用存储过程时更喜欢的解决方案。自定义mysql函数用于检查当前数据库中是否存在表。

          delimiter $$
          
          CREATE FUNCTION TABLE_EXISTS(_table_name VARCHAR(45))
          RETURNS BOOLEAN
          DETERMINISTIC READS SQL DATA
          BEGIN
              DECLARE _exists  TINYINT(1) DEFAULT 0;
          
              SELECT COUNT(*) INTO _exists
              FROM information_schema.tables 
              WHERE table_schema =  DATABASE()
              AND table_name =  _table_name;
          
              RETURN _exists;
          
          END$$
          
          SELECT TABLE_EXISTS('you_table_name') as _exists
          

          【讨论】:

            【解决方案7】:
            $q = "SHOW TABLES";
            $res = mysql_query($q, $con);
            if ($res)
            while ( $row = mysql_fetch_array($res, MYSQL_ASSOC) )
            {
                foreach( $row as $key => $value )
                {
                    if ( $value = BTABLE )  // BTABLE IS A DEFINED NAME OF TABLE
                        echo "exist";
                    else
                        echo "not exist";
                }
            }
            

            【讨论】:

            • 请为代码添加准确的注释以提供最佳质量的答案。简单地粘贴一些代码并不能告诉问题的作者。
            • 这实在是太可怕了。因此,如果有 50,000 个表,您将加载所有表,遍历每个表以查找是否存在正确的表?
            【解决方案8】:

            你为什么这么难理解?

            function table_exist($table){ 
                $pTableExist = mysql_query("show tables like '".$table."'");
                if ($rTableExist = mysql_fetch_array($pTableExist)) {
                    return "Yes";
                }else{
                    return "No";
                }
            } 
            

            【讨论】:

              【解决方案9】:

              我不知道它的 PDO 语法,但这似乎很简单:

              $result = mysql_query("SHOW TABLES LIKE 'myTable'");
              $tableExists = mysql_num_rows($result) > 0;
              

              【讨论】:

              • 谢谢,完全忘记了 SHOW TABLES LIKE 可能仅限于一个确切的表
              • PDO: $tableExists = $db->query("SHOW TABLES LIKE 'myTable'")->rowCount() > 0;
              • mysqli : if ($db->query("SHOW TABLES LIKE 'myTable'")->num_rows==0) { // 创建表 }
              • @MathewFoscarini,rowCount() 在这种情况下可能不可靠,请参阅PHP doc
              • mysql_* 函数不再支持,它们是 officially deprecated不再维护,将在未来。您应该使用PDOMySQLi 更新您的代码,以确保您的项目在未来的功能。
              【解决方案10】:

              如果您使用的是 MySQL 5.0 及更高版本,您可以尝试:

              SELECT COUNT(*)
              FROM information_schema.tables 
              WHERE table_schema = '[database name]' 
              AND table_name = '[table name]';
              

              任何结果都表明该表存在。

              发件人:http://www.electrictoolbox.com/check-if-mysql-table-exists/

              【讨论】:

              • 也许我遗漏了什么,但你为什么要在 SHOW TABLES 上使用这种方法?
              • @nickf 它是 ansi 标准的一部分,所以它可以在不同的 rdbms'es 之间移植。
              • @nickf:它也适用于 MySQL 以外的数据库。据我所知,这包括 PostgreSQL 和 SQL Server。
              • 想知道这是否是一种安全漏洞,您可以从未连接到的数据库中查询信息...
              • 不存在安全风险 -- 对 information_schema 数据库的查询将只显示已连接用户有权访问的表。
              猜你喜欢
              • 1970-01-01
              • 2011-09-21
              • 1970-01-01
              • 1970-01-01
              • 2013-08-23
              • 2021-06-13
              • 1970-01-01
              相关资源
              最近更新 更多