You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP中PDO错误无法显示,prepare后页面停止执行求助

问题分析与解决方案

你的代码存在几个关键问题,导致页面在执行$conn->prepare($sql)后中断且无错误提示:

1. 数据库连接失败后未终止脚本

当PDO连接失败时,$conn变量并未被正确初始化,但你仅输出错误信息却未终止脚本。后续执行$conn->prepare($sql)时,会触发致命错误(因$conn未定义)。这类致命错误不属于PDOException范畴,无法被后续的try/catch捕获,直接导致页面中断;若PHP未开启错误显示,就只会出现白屏。

解决方法:在连接失败的catch块中添加exit()终止脚本:

catch(PDOException $e) {
  echo "Connection failed: " . $e->getMessage();
  exit(); // 停止脚本,避免后续调用未定义的$conn
}

2. catch块中异常抛出类型错误

你在catch里写了throw new error($pdoError->getMessage());,但PHP中没有名为error的内置异常类,正确写法应为Exception。另外,若只是想显示错误信息,直接输出即可——抛出异常会终止脚本,反而可能看不到提示:

catch (PDOException $pdoError) {
    echo "查询出错: " . $pdoError->getMessage();
    // 无需抛出异常,除非有上层逻辑需要处理
}

3. 开发环境需开启错误显示

开发阶段建议在脚本开头添加以下代码,确保能看到所有错误(包括致命错误):

ini_set('display_errors', 1);
error_reporting(E_ALL);

修正后的完整代码

<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);

try {
  $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
  $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
  echo "Connection failed: " . $e->getMessage();
  exit();
}

$orderNumber = $_GET['orderID'];
echo "Order number: $orderNumber";

$sql = "SELECT userID, order_files.orderID, order_files.serviceID, SUM(file_total) as orderTotal, date_created FROM order_files
        LEFT JOIN orders ON order_files.orderID = orders.orderID where order_files.orderID = :orderID GROUP BY order_files.orderID";

try {
    $stmt = $conn->prepare($sql);
    $stmt->execute(['orderID' => $orderNumber]);
    $results = $stmt->fetchAll();
    var_dump($results);
} catch (PDOException $pdoError) {
    echo "查询执行失败: " . $pdoError->getMessage();
}
?>

注:你之前添加的if (!$stmt)判断完全多余——因为已设置ERRMODE_EXCEPTION,prepare失败会直接抛出异常进入catch块,无需手动判断。

内容的提问来源于stack exchange,提问作者Yas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 10:07:37