Php MySQL在不引发异常的情况下检查表是否存在

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:我

检查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:

我不知道它的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;

    }