PDO查询失败,但是看不到任何错误。 如何从PDO获取错误消息?
为了能够看到数据库错误,必须将PDO errmode设置为异常。 在许多方面,异常比常规错误要好:它们总是包含堆栈跟踪,可以使用try..catch捕获它们,也可以使用专用的错误处理程序对其进行处理。 甚至未经处理,它们也会作为常规的PHP错误,遵循站点范围的错误报告设置,提供所有重要信息。
请注意,将此模式设置为连接选项将使PDO也会在连接错误时引发异常,这非常重要。
因此,以下是正确创建PDO连接的示例:
$dsn = "mysql:host=$host;dbname=$db;charset=utf8";
$opt = array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
// other options
);
$pdo = new PDO($dsn, $user, $pass, $opt);
通过这种方式进行连接,将始终向您通知在查询执行期间发生的所有数据库错误。 请注意,您通常必须能够看到PHP错误。 在实时站点上,您必须查看错误日志,因此必须进行设置
error_reporting(E_ALL);
ini_set('display_errors',0);
ini_set('log_errors',1);
而在本地开发服务器上,可以在屏幕上显示错误:
error_reporting(E_ALL);
ini_set('display_errors',1);
当然,您永远不要在PDO语句之前使用错误抑制运算符(try..catch)。
另外,由于许多错误的示例告诉您将每个PDO语句包装到try..catch块中,因此我必须做出不同的注释:
不要仅使用try..catch运算符来回显错误消息。 未捕获的异常已经很好地用于此目的,因为它的行为方式与其他PHP错误相同-因此,您可以使用站点范围的设置来定义行为-因此,如果没有此无用的代码,您将收到错误消息。 尽管无条件回显的错误消息可能会向潜在的攻击者显示一些敏感信息,但会使诚实的访问者感到困惑。
可以在以后添加自定义异常处理程序,但这不是必需的。 特别是对于新用户,建议使用未处理的异常,因为它们非常有用,有用和安全。
仅当您要自行处理错误时才使用try..catch-例如,回滚事务。