使用PHP / PDO检查数据库表是否存在

时间:2009-11-11 19:29:39

标签: php database pdo

我想检查一下我使用PHP和PDO连接的数据库中是否存在具有特定名称的表。

它必须适用于所有数据库后端,如MySQL,SQLite等。

15 个答案:

答案 0 :(得分:33)

这是一个检查表是否存在的完整函数。

/**
 * Check if a table exists in the current database.
 *
 * @param PDO $pdo PDO instance connected to a database.
 * @param string $table Table to search for.
 * @return bool TRUE if table exists, FALSE if no table found.
 */
function tableExists($pdo, $table) {

    // Try a select statement against the table
    // Run it in try/catch in case PDO is in ERRMODE_EXCEPTION.
    try {
        $result = $pdo->query("SELECT 1 FROM $table LIMIT 1");
    } catch (Exception $e) {
        // We got an exception == table not found
        return FALSE;
    }

    // Result is either boolean FALSE (no table found) or PDOStatement Object (table found)
    return $result !== FALSE;
}

注意:PDO只会在被告知时抛出异常,默认情况下它是静默的并且不会抛出异常。这就是我们为什么需要检查结果的原因。 See PDO error handling at php.net

答案 1 :(得分:9)

执行:

select 1 from your_table

然后捕获错误。如果您没有收到任何错误,但结果集中包含一个包含“1”的列,则该表存在。

答案 2 :(得分:9)

在继续之前,我确实意识到这是一个特定于MySQL的解决方案。

虽然这里提到的所有解决方案都可行,但我(个人)希望让PDO不要抛出异常(个人偏好,就是这样)。

因此,我使用以下内容来测试表创建:

SHOW TABLES LIKE 'some_table_of_mine';

如果表不存在,则不会生成错误状态,只需获得零结果集。为我工作快速而持续。

答案 3 :(得分:3)

作为项目的一部分,创建架构视图。

对于Oracle,它将类似于

SELECT TABLE_NAME FROM ALL_TABLES

对于Mysql:

SELECT TABLE_NAME FROM information_schema.tables WHERE table_schema = 'mydbname'

ETC ..

然后在代码中针对视图运行查询。

答案 4 :(得分:2)

通过PDO处理数据库后,您可以执行以下操作:

$tableExists = gettype($dbh->exec("SELECT count(*) FROM $table")) == 'integer';

或将其包装在一个函数中。

我一开始尝试使用try / catch,但即使表不存在,也没有异常。最后,最后检查dbh exec调用返回值的数据类型。它是一个整数,如果选择计数匹配(即使计数为0,如果没有结果,则为布尔值false。

我认为这应该适用于PDO支持的所有数据库类型,因为语法非常简单。

答案 5 :(得分:1)

您可以通过使用“SHOW TABLES LIKE'your_table'”行查询然后计算行来避免依赖错误。我一直在使用MySQL和PDO成功使用此方法,但尚未使用其他数据库进行测试

答案 6 :(得分:0)

您可以从php执行“从表中选择计数(*)”查询。如果它返回错误或异常,则该表不存在。这可能是最后一个可能的度假胜地,我相信这是有效的。

或者,您可以直接检查架构表(可能需要管理员设置其他权限)

答案 7 :(得分:0)

我在使用CodeIgniter的Web应用程序中做了一些事情来检查数据库是否存在(并且很有用),其中任何一个都可以工作:

@$this->load->database();
$v = @$this->db->version()
$tables = @$this->db->list_tables();

如果在PHP设置中启用了@,则添加version()将禁止错误,并且检查list_tables()和{{1}}的结果不仅可用于确定您的数据库是否为周围(但它也是理智的。)

答案 8 :(得分:0)

起初,我使用的是可接受的答案,但是后来我发现它在使用空表时失败了。这是我现在正在使用的代码:

function DB_table_exists($db, $table){
    GLOBAL $db;
    try{
        $db->query("SELECT 1 FROM $db.$table");
    } catch (PDOException $e){
        return false;
    }
    return true;
}

此代码是我的PDO扩展类的摘录。如果该表不存在,它将产生一个错误(并返回false),但是如果该表存在和/或为空,则将成功

答案 9 :(得分:0)

进行查询,如果数据库不存在,则要求数据库创建表:

$string = "CREATE TABLE IF NOT EXISTS " .$table_name . " int(11) NOT NULL AUTO_INCREMENT,
  `id` int(3) NOT NULL,
  `blabla` int(2) NOT NULL,
  `blabla1` int(2) NOT NULL,
  `blabla3` varchar(3) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 
AUTO_INCREMENT=1 ";

$sql = $conection->prepare($string);
$sql->execute();

答案 10 :(得分:0)

这似乎至少可以在没有例外的情况下与SQLite3一起使用:

        $select =
            "SELECT CASE WHEN EXISTS (SELECT * FROM SQLITE_MASTER WHERE TYPE = 'table' AND NAME = :tableName) THEN 1 ELSE 0 END AS TABLE_EXISTS;";

答案 11 :(得分:0)

如果在同一条语句中还有其他重要动作要执行,则可以使用e-> errorInfo

try{                
    //Your major statements here
}
catch(PDOException $e){
    if($e->errorInfo[1] == 1146){
        //when table doesn't exist
    }      
}

答案 12 :(得分:0)

我建议您使用DESCRIBE

示例查询:

DESCRIBE `users`

示例 php&pdo:

$tblname = 'users'; //table name
$x = $db->prepare("DESCRIBE `$tblname`");
$x->execute();
$row = $x->fetch();
if ($row) {
    print 1; //table exists
}else{
    print 0; //table not exists
}

答案 13 :(得分:-1)

这个完整的函数与esbite的答案非常相似,但包括防止SQL注入的代码。此外,当相关表格为空时,您可能无法从接受的答案中获得一致的结果。

/**
 * This function checks if the table exists in the passed PDO database connection
 * @param PDO $pdo - connection to PDO database table
 * @param type $tableName 
 * @return boolean - true if table was found, false if not
 */
function tableExists(PDO $pdo, $tableName) {
    $mrSql = "SHOW TABLES LIKE :table_name";
    $mrStmt = $pdo->prepare($mrSql);
    //protect from injection attacks
    $mrStmt->bindParam(":table_name", $tableName, PDO::PARAM_STR);

    $sqlResult = $mrStmt->execute();
    if ($sqlResult) {
        $row = $mrStmt->fetch(PDO::FETCH_NUM);
        if ($row[0]) {
            //table was found
            return true;
        } else {
            //table was not found
            return false;
        }
    } else {
        //some PDO error occurred
        echo("Could not check if table exists, Error: ".var_export($pdo->errorInfo(), true));
        return false;
    }
}

答案 14 :(得分:-1)

这对我有用。这是几个答案的组合:

$table_name = 'your_table_here'; 
$test = "SELECT 1 FROM " . $table_name . " LIMIT 1";
$test = $db->query($test); //$db needs to be PDO instance

if($test)
{
    return 1; //Table exists
}
else
{
    return 0; //No table in database
}