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
相关产品推荐
相关产品推荐

