当我选择一个不存在的表时,PDO没有捕获错误

时间:2016-03-21 03:19:22

标签: php mysql pdo

我试图尝试/捕获PDO ::查询以确定表是否存在。但是,不是捕获错误并返回true或false,而是抛出一个未被捕获的错误:

public function __construct(){
    $this->db = parent::connect();
}

public function table_exists($table){
        try {
            $this->query("SELECT 1 FROM `$table` LIMIT 1");
            return true;
        } catch (Exception $e) {
            return false;
        }
    }

    public function query($sql){
        try {
            $this->result = $this->db->query($sql);
            return $this;
        } catch (Exception $e) {
            return null;
        }
    }

我也试过这个$this->db->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);但是没有任何区别。所以我得到了

  

致命错误:带有消息的未捕获异常'PDOException'   'SQLSTATE [42S02]:找不到基表或视图:1146表   'refritec.user'不存在'   ... \ DatabaseDriverMysql.php:34堆栈跟踪:   0 ... \ DatabaseDriverMysql.php(34):PDO->查询('SELECT 1 FROM ...')1   ... \ DatabaseDriverMysql.php(25):   Core \ DatabaseDriver->查询('SELECT 1 FROM` ...')2   ... \ Pen.php(123):   Core \ DatabaseDriver-> table_exists('user')#3 [内部函数]:   Core \ Pen-> update()#4 ... \ index.php(97):   call_user_func_array(Array,Array)#5 {main}抛出   第34行的...... \ DatabaseDriverMysql.php

3 个答案:

答案 0 :(得分:2)

除了评论中解释的那种愚蠢的错字之外,你的做法本质上是错误的。

首先,您没有检查特定的异常。意味着在任何错误的情况下会出现误报,而不仅仅是缺席表。

其次,您的代码很容易注入SQL。

第三,您正在编写一个引发故意错误的代码。那又错了。只要有办法检查表存在常规方式,就必须使用它:

$stmt = $pdo->prepare("SHOW TABLES LIKE ?");
$stmt->execute([$table]);
return $stmt->fetchColumn();

第四,这样的功能本身引起了对数据库设计的怀疑。在一个设计巧妙的应用程序中,无需动态创建表。

答案 1 :(得分:-1)

我无法重新创建您的确切问题,但您是否尝试捕获PDOException,如:

try {
    $this->query("SELECT 1 FROM `$table` LIMIT 1");
    return true;
} catch (PDOException $e) {
    return false;
}

<强>被修改

您还必须在连接上使用$this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);。因为默认情况下PDO不会像看到here那样抛出异常。

答案 2 :(得分:-1)

我使用简单的查询来查看表是否存在,如果该值与“ 0”不同,则存在一个可以显示我想要的消息的值。

    $res = $this->db->query("SHOW TABLES LIKE '".$tbname."perfil'");

    $count = $res->num_rows();