我试图尝试/捕获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
答案 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();