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

536 Views Asked by At

Problem

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

Why does it do it?

Duplicates?

There were no correct answers on SO regarding it. Last question was PHP PDO Exception + Warning on MySQL Has Gone Away? but people just marked it as duplicate instead of carefully answer.

Accepted answer not answers why does it do it and when. So I researched and will answer.

2

There are 2 best solutions below

0
On BEST ANSWER

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

1
On

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