【发布时间】:2018-07-11 16:37:08
【问题描述】:
我努力绕过 PDO 警告,但没有成功。
这是我的代码(文件名和参数被XXXXXX混淆):
try {
ini_set('pdo_mysql.debug' , '0');
$pdo = new PDO("mysql:host=XXXXXX;port=XXXXXX;dbname=XXXXXX", 'XXXXXX', 'XXXXXX', [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->exec('SET session wait_timeout=1');
$pdo->query('SELECT 1');
echo "SELECT 1\n";
sleep(2);
$pdo->query('SELECT 1');
echo "SELECT 1\n";
} catch (Exception $e) {
echo "Exception: {$e->getMessage()}\n";
}
我尝试过使用和 w/o ini_set,我尝试过在构造函数、参数或两者中使用 PDO 错误模式(如本例所示),我也尝试过使用命名主机或其 IP 地址.
SET wait_timeout 和 sleep 只是为了帮助测试
无事可做,我总是得到相同的结果:
SELECT 1
PHP Warning: PDO::query(): MySQL server has gone away in XXXXXX/test.php on line 19
PHP Stack trace:
PHP 1. {main}() XXXXXX/test.php:0
PHP 2. PDO->query() XXXXXX/test.php:19
PHP Warning: PDO::query(): Error reading result set's header in XXXXXX/test.php on line 19
PHP Stack trace:
PHP 1. {main}() XXXXXX/test.php:0
PHP 2. PDO->query() XXXXXX/test.php:19
Exception: SQLSTATE[HY000]: General error: 2006 MySQL server has gone away
如您所见,异常已被捕获(最后一行),并且在捕获 PDOException 或 Throwable(带或不带反斜杠)时也已捕获。
我只是想抑制 PHP 警告,通常由于 ERRMODE_EXCEPTION 参数它不应该出现,但这个警告总是“弹出”。
关于上下文的一些事情:
- 这部分代码仅用于测试,整个代码都在一个需要很多东西的类中,我不能不记录 PHP 警告
- 在生产环境中,我们只有 PHP 警告(不是堆栈跟踪)
- 代码在 Linux 服务器上的 PHP v7.0 中运行
- 我不想使用
@隐藏警告
谢谢
【问题讨论】:
标签: php mysql pdo error-handling warnings