出于安全原因,我尝试使用PHP / MySQL处理或捕获可能的错误,并且想知道我是否做对了。第一种情况:我将其用作函数,并在需要数据库连接时始终调用它。第二种情况:我不确定如何处理。我将所有准备好的语句置于if
条件中,但这很尴尬。那又如何$stmt->execute
呢?这也可能会失败,并且如果情况真的变得令人困惑,也要进行处理。我希望有更好的方法。
第一:
function pdo () {
try {
$pdo = new PDO('mysql:host=localhost;dbname=dbname', 'user', 'pw');
}
catch(PDOException $e) {
header("Location: handle_error.php");
exit;
}
return ($pdo);
}
第二:
if ($stmt = $pdo->prepare("SELECT a FROM b WHERE c = :c")) {
$stmt->execute(array(':c' => $c));
$result = $stmt->fetch();
echo 'All fine.';
}
else {
echo 'Now we have a problem.';
}
您当前的代码有一些缺陷。让我给你一些指导。
您不需要创建的函数,至少不需要当前形式的函数。每次调用此函数时,它都会创建一个新的PDO对象,这可能会妨碍脚本的性能。理想情况下,整个脚本的执行过程中只需要一个连接。
创建新的PDO连接时,您需要记住3件事:设置正确的连接字符集,启用错误报告和禁用模拟准备。
utf8mb4
。完整的代码应如下所示:
$options = [
\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
\PDO::ATTR_EMULATE_PREPARES => false,
];
$pdo = new \PDO('mysql:host=localhost;dbname=dbname;charset=utf8mb4', 'user', 'pw', $options);
除非您知道如何处理这些异常,并且肯定要这样做,否则不要捕获这些异常。最好是例外。让PHP与其他异常/错误/警告一起处理它们。毕竟为什么只为PHP异常创建一个异常?所有PHP错误都应以相同的方式处理。不管你做什么从来不打印(包括die
,exit
,echo
,var_dump
手动在屏幕上)的错误信息。如果此类代码曾经投入生产,那么这将是一个巨大的安全问题。
如果您的PDO连接设置为在错误上引发异常,则无需使用if
语句检查prepare()
或的返回代码execute()
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句