如何使用PDO抑制PHP警告

3

我努力尝试绕过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_timeoutsleep 只是为了帮助测试。

无论如何,我总是得到相同的结果:

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

正如您所看到的,异常已被捕获(最后一行),并且使用捕获PDOExceptionThrowable,带或不带反斜杠都可以捕获到。

我只想抑制PHP警告,通常由于ERRMODE_EXCEPTION参数,它不应该出现,但是这个警告总是“弹出”。

有关上下文的几件事:

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

谢谢

1个回答

0

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

ini_set('display_errors', 0);

你也可以在php.ini中设置这个。


你好 @Kasia,这可能是一个选项(比使用@符号稍微好一点),但实际上我想使用一个“干净”的选项,也就是说不仅仅是隐藏警告,而是避免它的出现(通常在错误模式设置为异常时,警告不应该被显示)。事实上,这部分代码在一个非常敏感的环境中运行,不允许隐藏警告。 - Unkl Benz
在生产服务器上,您可能希望将错误信息导入日志文件中,这样仍然可以完成此操作,但不会在浏览器中显示。无论哪种方式,我希望您能找到所需的内容 :) - Kasia Gogolek
你说得对 ;) 这有点复杂,是为了在CLI中运行的后台脚本,但你说得对。 - Unkl Benz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接