Php MySQL在不引发异常的情况下检查表是否存在
检查MySQL中是否存在表(最好通过PHP中的PDO)而不引发异常的最佳方法是什么。我不想解析“SHOW TABLES like”等的结果。一定存在某种布尔查询?如果您使用的是MySQL 5.0及更高版本,您可以尝试:Php MySQL在不引发异常的情况下检查表是否存在,php,mysql,pdo,database,Php,Mysql,Pdo,Database,检查MySQL中是否存在表(最好通过PHP中的PDO)而不引发异常的最佳方法是什么。我不想解析“SHOW TABLES like”等的结果。一定存在某种布尔查询?如果您使用的是MySQL 5.0及更高版本,您可以尝试: SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = '[database name]' AND table_name = '[table name]'; 任何结果都表明该表存在 From:我
SELECT COUNT(*)
FROM information_schema.tables
WHERE table_schema = '[database name]'
AND table_name = '[table name]';
任何结果都表明该表存在
From:我不知道它的PDO语法,但这似乎很简单:
$result = mysql_query("SHOW TABLES LIKE 'myTable'");
$tableExists = mysql_num_rows($result) > 0;
我使用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 attacs的攻击,因此请确保您的
$table
var是干净的,或者更好地使用参数化查询。为什么您让它如此难以理解
function table_exist($table){
$pTableExist = mysql_query("show tables like '".$table."'");
if ($rTableExist = mysql_fetch_array($pTableExist)) {
return "Yes";
}else{
return "No";
}
}
这是我在使用存储过程时更喜欢的解决方案。用于检查当前数据库中是否存在表的自定义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
如果有人来找这个问题,这篇文章就会贴出来。尽管有一点答案。有些答复使问题变得比需要的更复杂 对于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条件推到或中。为了我的需要,我只需要死。虽然你可以设置或设置其他东西。有些人可能更喜欢if/else if/else。然后删除或提供if/else if/else。由于在较大的数据库上“显示表”可能速度较慢,我建议使用“描述”并检查结果是否为真/假
$tableExists = mysqli_query("DESCRIBE `myTable`");
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;
}
如果希望这样做的原因是创建条件表,那么“如果不存在则创建表”似乎非常适合此工作。在我发现这一点之前,我使用了上面的“描述”方法。此处的更多信息:也许我遗漏了什么,但为什么要在显示表时使用此方法?@nickf它是ansi标准的一部分,因此可以在不同的rdbms之间移植。@nickf:它也适用于MySQL以外的数据库。据我所知,这包括PostgreSQL和SQL Server。想知道这是否是一个安全漏洞,您可以从未连接到的数据库中查询信息…没有安全风险--对信息\u架构数据库的查询将只显示连接用户有权访问的表。谢谢,完全忘记了像这样的显示表只能限于一个确切的表。请执行以下操作:$tableExists=$db->query(“显示像‘myTable’’这样的表)->rowCount()>0;mysqli:if($db->query(“SHOW TABLES LIKE'myTable'”)->num_rows==0){//create table}@MathewFoscarini,rowCount()在这种情况下可能不可靠,请参见。不再支持
mysql.*
函数,它们不再被维护,将来也将被维护。您应该使用或更新代码,以确保将来项目的功能。请为代码添加准确的注释,以提供最佳质量的答案。简单地粘贴一些代码对问题的作者来说并没有多大意义。这实际上很可怕。因此,如果有50000个表,您将加载所有表,循环遍历每个表以查找是否存在正确的表?只有当您让某人填写$table var时,sql语句中并非每个var都是危险的,只有当您从不受信任的源获取数据时。当然,您要负责如何使用函数和进行过滤。没有必要否决这个答案。如果你发布这样的代码,最终会有人在数据未被正确检查的地方使用它,并最终导致SQL注入。只要使用参数化请求,就可以避免任何问题,不管数据是否已检查。没有任何理由不这样做,这只是一种不好的做法。添加一个真正的“转义”字符串如何?使用参数化查询并避免恐怖故事。根据我所读的,如果“显示”变得低效,“信息模式”比“描述”更受欢迎。
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;
}