Why PDO generates warnings when we tell it not to do it?

后端 未结 2 382
遥遥无期
遥遥无期 2021-01-05 20:21

Problem

We tell PDO to wrap each issue into exception. In some cases it generates a few warnings and only then throws exception.

Why

相关标签:
2条回答
  • 2021-01-05 21:09

    It's because of PDO could use mysqlnd driver, which not respects any of PDO's "convert-issues-to-extensions" policy.

    Just look at sources of mysqlnd driver.

    We clearly see there direct calls to php_error_docref.

    And one of examples, shown at previous question explained by these lines: https://github.com/php/php-src/blob/PHP-5.5.31/ext/mysqlnd/mysqlnd_wireprotocol.c#L35:L61

    0 讨论(0)
  • 2021-01-05 21:13

    Use set_error_handler() and restore_error_handler()

    public function query($sql)
    {
        $retries = 0;
        $result = null;
    
        while (true) {
            try {
                set_error_handler(function () {
                });
                $result = $this->pdo->query($sql);
                restore_error_handler();
                break;
            } catch (Exception $e) {
                restore_error_handler();
                if (++$retries < self::RECONNECT_ATTEMPT) {
                    if (strpos($e->getMessage(), 'server has gone away') !== false) {
                        $this->connect();
                        $this->getLogger()->info('Reconnect database, reason: server has gone away');
                    }
                } else {
                    throw $e;
                }
            }
        }
        return $result;
    }
    
    0 讨论(0)
提交回复
热议问题