gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 21:13:54 25 4
gpt4 key购买 nike

我正在尝试尝试/捕获 PDO::query 以确保表是否存在。但它不是捕获错误并返回 true 或 false,而是抛出一个 Uncaught Error :

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;
}
}

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

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42S02]: Base table or view not found: 1146 Table 'refritec.user' doesn't exist' in ...\DatabaseDriverMysql.php:34 Stack trace: 0 ...\DatabaseDriverMysql.php(34): PDO->query('SELECT 1 FROM ...') 1 ...\DatabaseDriverMysql.php(25): Core\DatabaseDriver->query('SELECT 1 FROM `...') 2 ...\Pen.php(123): Core\DatabaseDriver->table_exists('user') #3 [internal function]: Core\Pen->update() #4 ...\index.php(97): call_user_func_array(Array, Array) #5 {main} thrown in ...\DatabaseDriverMysql.php on line 34

最佳答案

除了评论中解释的愚蠢的拼写错误之外,您的方法本质上是错误的。

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

其次,您的代码容易受到 SQL 注入(inject)。

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

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

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

关于php - 当我选择一个不存在的表时,PDO 没有捕获错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36122615/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com