原生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

相关推荐

  • 如何安装Jupyter

    如何安装JupyterJupyter Notebook是一个非常强大的工具,可以让用户编写和分享文档,代码以及其他数据。它是一个基于Web的应用程序,支持多种编程语言,如Python,R和Julia等。使用Jupyter Notebook可以有效地组织和演示工作流程,还支持实时共享文档,便于远程团队合作。

    2024-05-11
    11
  • Python工程师的必备利器:no max

    Python工程师的必备利器:no maxno max是一款基于Python的高性能、易用性强的异步Web框架,它采用非阻塞IO模型,使用协程Coroutine来完成异步操作,可用于实现高并发的Web应用。no max极大地简化了异步编程,使得Web开发者能够更加专注于业务逻辑的实现。

    2024-03-16
    30
  • 云小课|MRS基础原理之Oozie任务调度[通俗易懂]

    云小课|MRS基础原理之Oozie任务调度[通俗易懂]阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说)、深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云。更多精彩内容请单击此处。 摘要:Oozie是一个基

    2023-06-13
    108
  • Python应用领域及优势

    Python应用领域及优势Python在数据科学及机器学习领域中拥有广泛的应用。其丰富的数据科学将某些任务的执行成为可能,比如:数据采集、数据挖掘、数据分析、数据可视化及机器学习模型的构建。Python主要用于数据科学和机器学习的应用包括NumPy、SciPy、Pandas、SciKit-Learn、Keras、TensorFlow、PyTorch等库和框架。

    2024-03-11
    31
  • Python工程师必须掌握的Pandas Split技巧

    Python工程师必须掌握的Pandas Split技巧Pandas是Python中数据处理和分析的重要库,不仅可以处理数值和时间序列数据,还可以处理结构化数据。Split技巧是Pandas中常用的技巧之一,它可以用来分割数据,从中提取有用信息。本文将介绍Python工程师必须掌握的Pandas Split技巧,包括字符串分割、列拆分、数据合并和组合等方面。

    2024-04-20
    22
  • Python字典:快速索引数据,实现高效运算

    Python字典:快速索引数据,实现高效运算Python字典是一种灵活且高效的数据结构,可以用于存储和操作键-值对,其中键必须是唯一的,且不可变的数据类型(例如字符串、数字、元组)。字典是Python标准库中的内置类型之一,使用花括号{}表示。

    2023-12-16
    58
  • SQL注入漏洞产生的原因_怎么判断是否有sql注入漏洞

    SQL注入漏洞产生的原因_怎么判断是否有sql注入漏洞low等级 代码如下: 1 <?php 2 3 if( isset( $_REQUEST[ 'Submit' ] ) ) { 4 // Get input 5 $id = $_R

    2022-12-27
    83
  • DbUTils「建议收藏」

    DbUTils「建议收藏」DBUTILS dbutils是apeach公司 封装了jdbc的jar包用来 便捷操作数据库: 核心类:QueryRunnner > 核心方法:query()查询 update()增删改 具体使用…

    2023-04-01
    120

发表回复

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