原生php pdo几个处理「建议收藏」

原生php pdo几个处理「建议收藏」闲来无事,便记录几个最近遇到的Pdo细节问题,平常都是用orm的。 长连接 在历史的Mysql驱动中,都是使用connect和pconnect来区分长短连接,到了pdo之后,改成了参数。 PDO::…

闲来无事,便记录几个最近遇到的Pdo细节问题,平常都是用orm的。

长连接

在历史的Mysql驱动中,都是使用connect和pconnect来区分长短连接,到了pdo之后,改成了参数。

PDO::ATTR_PERSISTENT

 $dbh = new PDO(MYSQL_DSN, MYSQL_USER, MYSQL_PASS, array(
            PDO::ATTR_PERSISTENT => true,
            PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8",
        ));

代码100分

如果想使用持久连接,必须在传递给 PDO 构造函数的驱动选项数组中设置 PDO::ATTR_PERSISTENT 。如果是在对象初始化之后用 PDO::setAttribute() 设置此属性,则驱动程序将不会使用持久连接。

MySQL server has gone away

某个mysql长连接很久没有新的请求发起,达到了server端的timeout,被server强行关闭。此后再通过这个connection发起查询的时候,就会报错server has gone away,这种情况特别容易出现在脚本里。(max_allowed_packet 是包太大造成的连接中断,这里不予以讨论)

解决方案:

  1. 修改my.cnf的 wait_timeout、interactive_timeout

  2. 在连接里初始化后执行sql,sql = “set interactive_timeout=秒数”;

明明是长连接,但是为什么会产生是去连接呢?

错误与错误处理

PDO 提供了三种不同的错误处理模式,以满足不同风格的应用开发

  1. PDO::ERRMODE_SILENT
  2. PDO::ERRMODE_WARNING
  3. PDO::ERRMODE_EXCEPTION

PDO::ERRMODE_SILENT

此为默认模式。

PDO 将只简单地设置错误码,可使用 PDO::errorCode() 和 PDO::errorInfo() 方法来检查语句和数据库对象。

如果错误是由于对语句对象的调用而产生的,那么可以调用那个对象的 PDOStatement::errorCode() 或 PDOStatement::errorInfo() 方法。

如果错误是由于调用数据库对象而产生的,那么可以在数据库对象上调用上述两个方法。

PDO::ERRMODE_WARNING

除设置错误码之外,PDO 还将发出一条传统的 E_WARNING 信息,所以一般用于调试。

PDO::ERRMODE_EXCEPTION

除设置错误码之外,PDO 还将抛出一个 PDOException 异常类并设置它的属性来反射错误码和错误信息。

异常模式另一个非常有用的是,相比传统 PHP 风格的警告,可以更清晰地构建自己的错误处理,而且比起静默模式和显式地检查每种数据库调用的返回值,异常模式需要的代码/嵌套更少。

demo(异常模式):

代码100分<?php
$dsn = "mysql:dbname=testdb;host=127.0.0.1";
$user = "dbuser";
$password = "dbpass";

try {
    $dbh = new PDO($dsn, $user, $password);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    echo "Connection failed: " . $e->getMessage();
}
?>

默认模式:

 try {
                $pdo = Mysql::getInstance();
                $pdo = $pdo->getPdo();

                $sql = sprintf("insert into  ".$this->getTableName()." (`job_number`, `point_data`, `sign_time`) 
                            values("%s","%s","%s")",
                    $this->jobNum, $this->__toString(), date("Y-m-d H:i:s"), date("Y-m-d H:i:s", $this->verifyTimeMillis/1000));
                $sth = $pdo->prepare($sql);
                if ($sth) {
                    if ($sth->execute()) {
                        $this->id = $pdo->lastInsertId();
                        $success = true;
                        break;
                    }
                    $code = $sth->errorCode();
                    if($code == "23000") {
                        $success = true;
                        //["23000",1062,"Duplicate entry "1698-2019-11-26 13:43:57" for key "job_number_time_unique""]
                        if($this->id == 0) {
                            $this->checkExists();
                        }
                        break;
                    }
                     if($code == "HY000") {
                            Mysql::getInstance()->reConnection();
                           continue;
                     }

                     if(!empty($code)) {
                             Logs::writeErrorLog("数据操作失败 db error code:". $code."message:".json_encode($info));
                             continue;
                     }

                    if($code == "42S02") {
                        $this->autoCreateTable();
                    }

                } else {
                    throw new Exception("insert db error with content:" . $this->__toString());
                }
            } catch (Exception $exception) {
                $e = $exception;
            }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/10747.html

(0)
上一篇 2022-12-22
下一篇 2022-12-22

相关推荐

  • 使用python实现etl过程的简单介绍

    使用python实现etl过程的简单介绍最近,Analysis with Programming加入了Planet Python。我这里来分享一下如何通过Python来开始数据分析。具体内容如下:

    2023-10-30
    130
  • 开源公开课丨ChengYing安装原理剖析「终于解决」

    开源公开课丨ChengYing安装原理剖析「终于解决」一、直播介绍 之前的内容,我们为大家分享了ChengYing入门介绍,以及ChengYing部署Hadoop集群实战,本期我们为大家分享ChengYing安装原理。 本次直播我们将详细介绍ChengY

    2023-06-03
    142
  • 技术分享 | kubernetes 环境测试部署 MySQL 的随想「终于解决」

    技术分享 | kubernetes 环境测试部署 MySQL 的随想「终于解决」作者:王悦 爱可生研发团队成员,负责数据库管理平台相关项目的开发和故障排查,好奇 MySQL 技术原理及各类数据库实现方案。 本文来源:转载自公众号-图解 MySQL *爱可生开源社区出品,原创内容…

    2023-03-07
    134
  • Python中log10函数的应用

    Python中log10函数的应用在介绍log10函数的应用之前,我们先来了解一下log10函数。

    2024-03-21
    72
  • 如何在PyCharm中运行Python代码

    如何在PyCharm中运行Python代码Python是一种易于学习和理解的编程语言,并且在数据科学、机器学习和Web开发等领域中广泛使用。PyCharm是一种流行的IDE(集成开发环境),它针对Python编程许多功能,例如语法突出显示、自动完成和代码重构等。在本文中,您将学习如何在PyCharm中设置您的Python环境并运行Python代码。

    2024-05-17
    81
  • Ubuntu安装MySQL_ubuntu怎么安装软件

    Ubuntu安装MySQL_ubuntu怎么安装软件背景介绍 ubuntu 20.04 版本系统自带的 MySQL 版本是 8.0,普通方法很难安装 5.7 版本的。由于 8.0 版本较 5.7 版本做了不少改动,笔者比较习惯使用 5.7 版本。 网上

    2023-06-11
    139
  • Python字典元素计数技巧

    Python字典元素计数技巧在Python编程过程中,我们常常需要对容器类型的元素进行计数,以便分析数据的特征和规律,从而制定相应的处理策略。而在Python中,字典是一种非常便捷的容器类型,它可以用来存储键值对,其中键可以是任何不可变的数据类型,并且具有唯一性。因此,利用字典元素计数技巧可以高效地统计某些数据元素出现的次数,从而更好地处理数据。

    2024-01-02
    106
  • PostgreSQL源码学习–删除数据#1,2「建议收藏」

    PostgreSQL源码学习–删除数据#1,2「建议收藏」本节介绍heapam_tuple_delete和table_tuple_delete函数。 heapam_tuple_delete函数 //src/backend/access/heap/heapa…

    2023-03-09
    150

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注