我努力尝试绕过 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";
}
我尝试过使用和不使用
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 参数它不应该出现,但这个警告总是“弹出”。
有关上下文的一些事情:
@
来隐藏警告谢谢
我认为你的异常被捕获了,但是你需要更改错误显示的设置:
ini_set('display_errors', 0);
您也可以在 php.ini 中设置
error_reporting
函数: 以这种方式抑制警告
function () {
// A PDOStatement attached to a "dead" PDO instance will issue a warning on failure.
// We disable the warnings before database interaction.
$errorReportingPrev = error_reporting(0);
error_reporting(~ E_WARNING & $errorReportingBefore);
$pdo = new PDO(...);
// At this point, the MySQL server has gone away.
$statement = $pdo->query('SELECT 1'); // Issues warning, but it is suppressed.
// When you're done, set error reporting to the previous state.
error_reporting($errorReportingPrev);
}
这是相对干净的,因为您仅在与数据库进行交互时抑制警告。 然后将其设置回之前的值。