Php 为什么PDO在我们告诉它不要这样做时会产生警告?

Php 为什么PDO在我们告诉它不要这样做时会产生警告?,php,pdo,mysqlnd,Php,Pdo,Mysqlnd,问题 我们告诉PDO将每个问题包装成异常。 在某些情况下,它会生成一些警告,然后抛出异常 为什么它会这样做 重复项? 关于这件事,没有正确的答案。最后一个问题是,但人们只是将其标记为重复,而不是仔细回答 被接受的答案不是答案,它为什么这么做,什么时候做。因此,我进行了研究并将回答。这是因为PDO可以使用mysqlnd驱动程序,它不尊重PDO的任何“将问题转换为扩展”策略 你看 我们清楚地看到有直接调用php\u error\u docref 下面几行解释了一个示例:使用set\u error\u

问题

我们告诉PDO将每个问题包装成异常。 在某些情况下,它会生成一些警告,然后抛出异常

为什么它会这样做

重复项?

关于这件事,没有正确的答案。最后一个问题是,但人们只是将其标记为重复,而不是仔细回答


被接受的答案不是答案,它为什么这么做,什么时候做。因此,我进行了研究并将回答。

这是因为PDO可以使用mysqlnd驱动程序,它不尊重PDO的任何“将问题转换为扩展”策略

你看

我们清楚地看到有直接调用
php\u error\u docref

下面几行解释了一个示例:

使用set\u error\u handler()和restore\u error\u handler()

公共函数查询($sql)
{
$retries=0;
$result=null;
while(true){
试一试{
设置错误处理程序(函数(){
});
$result=$this->pdo->query($sql);
还原错误处理程序();
打破
}捕获(例外$e){
还原错误处理程序();
如果(++$retriesgetMessage(),'server has away')!==false){
$this->connect();
$this->getLogger()->info('重新连接数据库,原因:服务器已离开');
}
}否则{
扔$e;
}
}
}
返回$result;
}

这是显而易见的。问题是“为什么”会发生。不是怎么治的。无论如何,它会帮助那些不知道它的人。
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;
}