我正在使用 PHP 开发一个项目,并执行以下类型的查询:
$stmt = $conn->prepare($sql);
// Bindeo algunos parametros...
$stmt.execute();
我想知道管理查询时可能发生的任何类型错误的最有效方法是什么,无论是我写的错误,还是 a insert()
、 aexecuteUpdate()
等。因为我不知道他们是否抛出异常或者是否足以验证返回值。
管理这些错误的最完整方法是什么?
if($stmt.execute())
echo "Exito!";
else
echo "Falló";
或处理异常:
try {
$stmt.execute();
} catch(Exception $e) {
print_r($e);
}
两者结合?如果它们是插入或更新操作,它会改变什么吗?
使用 PDO 时,关于数据处理的安全性,必须考虑两个非常重要的方面。其中之一与处理异常密切相关。
哟
在看这两个方面之前,我首先想说的是,使用 PDO 的最佳方式是有一个专门用于处理我们与 PDO 的连接的类,我们将在每次需要连接到数据库时使用它。这使我们不必每次都创建 PDO 对象,正确配置它等等。有了一个类,我们只需使用关键字获取我们的对象
new
,就是这样。此外,我们可以根据需要为这个类提供自定义方法,绑定和其他事情可以以一种有趣的方式简化,使我们的代码非常简单。如果你愿意,你可以看看我正在创建的这个类,它现在非常适合基本的 PDO 使用。
那么让我们看看上面提到的这两个方面:
1.异常处理和可能的危险
当我们创建到 PDO 的连接时,如果在创建连接对象时没有传递正确的参数,PDO可能会在发生错误的情况下显示连接凭据(用户名、密码、数据库名称...)
error_log
。毋庸置疑,错误日志是任何黑客最喜欢的文件之一,正是因为任何恶意用户都可以在其中找到有趣的数据。如何避免?
通过在连接上设置以下参数:
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
. 有关更多详细信息,请参阅 PHP 手册:错误及其处理这将是应作为选项传递给 PDO 连接的属性之一。
让我们在这里看看,这将是一个专门用于管理我们的 PDO 连接的类的连接方法。这是上面提到的类的方法:
2.模拟准备的问题
第二个重要方面与准备好的查询和模拟准备有关。
手册
PDO::ATTR_EMULATE_PREPARES
说如下:问题是什么?
在 PDO 中这个选项被设置为
true
默认值,如果我们在创建连接对象时没有设置它false
,我们可能会被恶意用户智能准备好 SQL 注入。详细解释了如何发生这种情况,并在我对问题的回答中举例说明:如何防止 PHP 中的 SQL 注入?.
所以你会在上面的连接代码中看到,我们有这个:
如果这不存在,我们的连接对象根本不完全安全,即使我们使用 PDO,我们迟早也会对 SQL 注入感到惊讶。
二
现在让我们进入第二部分,它将更直接地回答您的问题。
如果我们的连接类中有一个
try ... catch
像上面显示的块,我们可以忘记每次必须查询数据库时继续使用它。该类将处理该问题,这就是它存在的原因。我们只需要使用 来处理创建连接对象new
,通过调用类的方法进行查询并处理数据。一些基本用途,使用我们的连接对象
A
SELECT
没有标准它会像这样简单地完成:
并检查是否有数据
SELECT
A
SELECT
有条件为了知道是否有数据,我们如上所述检查我们的变量
$datos
。任何
UPDATE
人为了验证记录是否更新,我们只需要评估数据变量,就像我们之前所做的那样,不同之处在于,在 的情况下
UPDATE
,如果有更新,变量将包含所有更新。然后:任何
INSERT
人要检查是否插入了记录,我们只需要评估数据变量,就像我们之前在
UPDATE
. 然后:结论
可以看出,使用专用类简化了对数据的任何进一步处理。以及要自定义的类是否要进行其他检查,取决于程序员的需要。
我认为您正在接受两种不同类型的错误,因此应该区别对待它们。
一件事是可能的连接错误,可能由于多种原因而发生,另一件事是其中一个
select
不正确或语句未正确编写。在这些情况下,我建议您
try {} catch()
始终在创建连接时使用它,并且仅在出现故障时需要执行其他操作的查询中使用它,例如:相反,如果您想要控制所有可能的异常并将它们显示给用户,而没有异常的可怕陷阱,您可以使用以下内容:
http://www.php.net/set-exception-handler