我想检查一下我使用PHP和PDO连接的数据库中是否存在具有特定名称的表。
它必须适用于所有数据库后端,如MySQL,SQLite等。
答案 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
}