如何使用 PDO 抑制 PHP 警告

问题描述 投票:0回答:2

我努力尝试绕过 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 参数它不应该出现,但这个警告总是“弹出”。

有关上下文的一些事情:

  • 这部分代码仅用于测试,整个代码位于一个调用很多东西的类中,我不能只是不记录 PHP 警告
  • 在生产环境中,我们只有 PHP 警告(不是堆栈跟踪)
  • 代码在 Linux 服务器上的 PHP v7.0 中运行
  • 我不想使用
    @
    来隐藏警告

谢谢

php mysql pdo error-handling warnings
2个回答
0
投票

我认为你的异常被捕获了,但是你需要更改错误显示的设置:

ini_set('display_errors', 0);

您也可以在 php.ini 中设置


0
投票

您可以使用

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);
}

这是相对干净的,因为您仅在与数据库进行交互时抑制警告。 然后将其设置回之前的值。

© www.soinside.com 2019 - 2024. All rights reserved.