将PDO封装成类

php完美pdo类封装 php pdo类封装,单例模式,多种操作方式,预处理,事务 立即下载
将PDO封装成类
new PDO("mysql:host=localhost;dbname=php100","root","pwd" [,driverOptions]);
如果需要长连接,需要长最后一个参数driverOption:persistent:/aj/持续的,不断的
new PDO("连接信息","root","pwd",array(PDO::ATTR_PERSISTENT=>true));
使用array()来传入最后一个参数,是可以带多个选项值,如:
$pdo = new PDO('mysql:host=localhost;dbname=forum','root','123456',array(PDO::ATTR_PERSISTENT=>TRUE,PDO::ATTR_CASE=>PDO::CASE_UPPER,PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION));
上面分别指定了:长连接开启,强制PDO获取的列字符大写,以及使用PDOException抛出异常。
对于这个属性参数,也可以用setAttribute来更改,如下:
$pdo->setAttribute(PDO::ATTR_CASE,PDO::CASE_LOWER);
那么接下去就可以用$row['city']来访问列值,而不必要用$row['CITY']大写方式来访问。
PDO常用方法:
PDO::query() 主要用于有记录结果返回的操作,特别是select操作。
PDO::exec()主要是针对没有结果集合返回的操作。如insert,update等操作。返回影响行数。
PDO::lastInsertId()返回上次插入操作最后一条ID,但要注意:如果用insert into tb(col1,col2) values(v1,v2),(v11,v22)..的方式一次插入多条记录,lastinsertid()返回的只是第一条(v1,v2)插入时的ID,而不是最后一条记录插入的记录ID。
PDOStatement::fetch()是用来获取一条记录。配合while来遍历。
PDOStatement::fetchAll()是获取所有记录集到一个中。
PDOStatement::fetchcolumn([int column_indexnum]) 用于直接访问列,参数column_indexnum是该列在行中的从0开始索引值,但是,这个方法一次只能取得同一行的一列,只要执行一次,就跳到下一行。因此,用于直接访问某一列时较好用,但要遍历多列就用不上。
PDOStatement::rowcount()适用于当用query("select ...")方法时,获取记录的条数。也可以用于预处理中。$stmt->rowcount();
PDOStatement::columncount()适用于当用query("select ...")方法时,获取记录的列数。
注解:
1、选fetch还是fetchall?
小记录集时,用fetchall效率高,减少从数据库检索次数,但对于大结果集,用fetchall则给系统带来很大负担。数据库要向WEB前端传输量太大反而效率低。
2、fetch()或fetchall()有几个参数:
mixed pdostatement::fetch([int fetch_style [,int cursor_orientation [,int cursor_offset]]])


array pdostatement::fetchAll(int fetch_style)
fetch_style参数:
■$row=$rs->fetchAll(PDO::FETCH_BOTH); FETCH_BOTH是默认的,可省,返回关联和索引。
■$row=$rs->fetchAll(PDO::FETCH_ASSOC); FETCH_ASSOC参数决定返回的只有关联数组。
■$row=$rs->fetchAll(PDO::FETCH_NUM); 返回索引数组
■$row=$rs->fetchAll(PDO::FETCH_OBJ); 如果fetch()则返回对象,如果是fetchall(),返回由对象组成的二维数组,如:
Array
(
    [0] => stdClass Object
        (
            [cityid] => 2
            [city] => 福州
            [countryid] => 1
        )
    [1] => stdClass Object
        (
            [cityid] => 3
            [city] => 厦门
            [countryid] => 1
        )
...
);
遍历:
foreach($row as $r)
{
echo "{$r->cityid}:城市 {$r->city}.<br />";
//或echo "{$r[0]}:城市 {$r[1]}.<br />";
}
■$row=$rs->fetch(PDO::FETCH_LAZY); FETCH_LAZY返回对象:如:
PDORow Object
(
    [queryString] => select * from city
    [cityid] => 2
    [city] => 福州
    [countryid] => 1
)
■ $row = $stmt->fetch(PDO::FETCH_BOUND);用于使fetch返回true,并将获取的列值赋给bindParam()方法中指定的相应变量。参考最后一个示例。----相当于mysqli绑定到结果。
-----------------------------------------------
例:概要
$rs=$db->query("select * from php100");
while($row = $rs->fetch())
{
print_r($row);
}
或不使用while来遍历:
$rs=$db->query("select * from php100");
$row=$rs->fetchall();
print_r($row);
$db->exec('insert into ...');
------------------------------------------------
例:select 遍历记录和取得记录总数
try{
$pdo = new PDO("mysql:host=localhost;dbname=forum","root","123456");
}catch(PDOException $e){
echo '连接错误:'.$e->errorcode();
}
$q="select * from city";
$rs=$pdo->query($q);
$row=$rs->fetchAll();
foreach($row as $r)
{
echo "{$r['cityid']}:城市 {$r['city']}.<br />";
//或echo "{$r[0]}:城市 {$r[1]}.<br />";
}
echo "共有{$rs->rowcount()}条记录" //$rs->rowcount()返回行数。
返回的数组格式:可以看到,每一组都带有关联和索引的两种形式:
Array
(
    [0] => Array
        (
            [cityid] => 2
            [0] => 2
            [city] => 福州
            [1] => 福州
            [countryid] => 1
            [2] => 1
        )
    [1] => Array
        (
            [cityid] => 3
            [0] => 3
            [city] => 厦门
            [1] => 厦门
            [countryid] => 1
            [2] => 1
        )
)
如果用:while($row = $rs->fetch()){ print_r($row);}
while返回的每一个数组格式是:
Array
(
    [cityid] => 2
    [0] => 2
    [city] => 福州
    [1] => 福州
    [countryid] => 1
    [2] => 1
)
可以看到:
$rs->fetch()一次返回一个,
$rs->fetchAll()一次返回所有的记录,
两者相同的是:都可以用索引数组或关联数组来取得最终字段值,
两者不同的是,fetchAll()返回的是二维数组。可以用foreach遍历。


-----------------------------
例:插入记录
$affectedrows = $pdo->exec("insert into city(cityid,city,countryid) values(NULL,'北京',2),(NULL,'南京',2)");
echo '共影响行数:'.$affectedrows.'<br />';
echo '最后插入的记录ID为:'.$pdo->lastinsertid();
这里当用insert into city(cityid,city,countryid) values(NULL,'北京',2)时,返回的正确的ID值,但按上例的方法插入多条记录,则返回的依旧是北京那一条记录的ID,解决办法是把这个值 lastinsertid()+行数-1。


------------------------------
例:返回exec或query错误
把上例的insert随便改一个,使插入错误,再加上一行:
print_r($pdo->errorinfo());
返回:数组0表示存储SQL标准中定义的SQLSTATE码。1表示错误码,0表示错误消息,这里是指city表插入的外键在country表中不存在。
Array
(
    [0] => 00000
    [1] => 1452
    [2] => Cannot add or update a child row: a foreign key constraint fails (`forum`.`city`, CONSTRAINT `FK_city_country` FOREIGN
KEY (`countryid`) REFERENCES `country` (`country_id`))
)
***************************************************************
PDO的预处理:准备语句
0、连接:$pdo = new PDO(....);
1、准备:查询和mysqli的方式不同,支持两种参数占位方式:问号参数“?”和命名参数“:字段名”;命名参数更明确。
     $q="insert into city(city,countryid) values(?,?)"; //或$q = "insert into city(city,countryid) values(:city,:countryid)"; 
     $stmt = $pdo->prepare($q);
2、执行execute:$pdo->lastinsertid();对预处理也是可用的。
   有两种方式:注意两种方式用“?”问号参数绑定时有不同的execute占位引用方式。并且偏移基数不同。
    (1)显式地把参数值做为参数传给execute: boolean PDOSTatement::execute([array input_parameters])
     命名参数方式:     
        $q = "insert into city(city,countryid) values(:city,:countryid)";
        $stmt = $pdo->prepare($q);
        $stmt->execute(array(':city'=>'太原',':countryid'=>'2'));//本条可多次执行。注意,countryid是数值型,但也要用单引号来包住。
     问号参数:
      $q = "insert into city(city,countryid) values(?,?)";
      $stmt = $pdo->prepare($q);
      $stmt->execute(array('0'=>'武汉','1'=>'2')); //注意这里不是用'?'的方式,而是用上面占位符的从0开始的索引偏移,
    (2)绑定参数。boolean PDOSTatement::bindParam(mixed parameter,mixed &variable [,int datatype [,int length [,mixed driver_option]]])
       mixed parameter 是占位符,当用?问号参数时,parameter是占位符的从1开始的索引偏移,而不是‘?’,这和MYSQLI的预处理不相同。
       variable是绑定的变量值
       datatype有以下几种类型:
         PDO_PARAM_BOOL 布尔类型。
         PDO_PARAM_input_output 参数传给存储过程时使用此类型,可以在过程执行后修改。
         PDO_PARAM_INT 整型。
         PDO_PARAM_NULL NULL类型。
         PDO_PARAM_LOG   大对象类型。
         PDO_PARAM_STMT   PDO对象类型,当前不可操作。
         PDO_PARAM_STR   char,varchar和其它字符串类型。
       length指定数据类型长度。只有当赋为PDO_PARAM_input_output类型时才需要此参数。
      driver_option用来传递任何数据库驱动程序特定的选项。
   如:
       $q = "insert into city(city,countryid) values(?,?)";
       $stmt = $pdo->prepare($q);
       $city='大连';
       $country=1;
       
       $stmt->bindparam(1,$city); //注意这里parameter不是用“'?'”方式。并且从1开始偏移。
       $stmt->bindparam(2,$country);
       $stmt->execute();
---------------------
预处理的绑定列:
boolean PDOStatement::bindcolum(mixed column_index,mixed &param [,int type [,int maxlen[,mixed driver_options]]]);
参数column_index是要绑定的行中列偏移,从1开始。当然也可以用列名。type就用来设置类型限制变量值,如PDO::PARAM_STR是限制文本,具体参bindParam()。通过maxlen限制其长度。
try{
$pdo = new PDO("mysql:host=localhost;dbname=forum","root","123456");
}catch(PDOException $e){
echo '连接错误:'.$e->errorcode();
}
$q="select * from city";
$stmt=$pdo->prepare($q);
$stmt->execute();
$rscount=$stmt->rowcount(); //总记录数
$stmt->bindcolumn(1,$cityid);
$stmt->bindcolumn('city',$city,PDO::PARAM_STR,1);
$stmt->bindcolumn(2,$countryid);
for($i=1;$i<=$rscount;$i++)
{
   $row = $stmt->fetch(PDO::FETCH_BOUND);
   printf("%s 的ID是: %s ",$city,$cityid);
   echo '<hr />';
}
**********************************************************
用PDO处理事务:
PDO->__construct()方法的作用是建立一个PDO链接数据库的实例。   
PDO->beginTransaction(),PDO->commit(),PDO->rollBack()这三个方法是在支持回滚功能时一起使用的。PDO->beginTransaction()方法标明起始点,PDO->commit()方法标明回滚结束点,并执行SQL,PDO->rollBack()执行回滚。   
<?php   
try {   
    $dbh = new PDO('mysql:host=localhost;dbname=test', 'root', '');   
    $dbh->query('set names utf8;');   
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);   
    $dbh->beginTransaction();   
    $dbh->exec("INSERT INTO `test`.`table` (`name` ,`age`)VALUES ('mick', 22);");   
    $dbh->exec("INSERT INTO `test`.`table` (`name` ,`age`)VALUES ('lily', 29);");   
    $dbh->exec("INSERT INTO `test`.`table` (`name` ,`age`)VALUES ('susan', 21);");   
   $dbh->commit();   
       
} catch (Exception $e) {   
   $dbh->rollBack();   
    echo "Failed: " . $e->getMessage();   
}   
?>
用 OP-TEE 给 AI 模型“上锁”:密文存储、TEE 解密放行、推理后销毁(实战可落地) 本文提出一种基于OP-TEE的AI模型保护方案,通过两级密钥体系确保模型静态存储为密文,运行时仅在TEE内解密。方案采用KEK+DEK架构,DEK永不出TEE,支持分块解密与可验证擦除。该方案能有效防御静态分析、应用层逆向等威胁,但需承认其物理级攻击的局限性。文章详细描述了端到端架构、文件格式设计及TA实现要点,包括密钥管理、分块解密策略和销毁机制,为设备侧AI部署提供了工程可行的安全解决方案。 阅读详情

相关推荐

高数 | 【极限与等价无穷小】两个重要极限 & 经典错误 & 什么情况下求极限可以直接带入

一. 第一个重要极限 二. 第二个重要极限 三. 导数定义式 全文见【高等数学】两个重要的极限 - 知乎

"You are worthy! You can do it!" 6万+

PHP mysqli_connect()连接

1、首先在mysql命令控制台新建数据库mysql&gt; create database test; Query OK, 1 row affected (0.04 sec) mysql&gt; use test; Database changed mysql&gt; create table test_table( -&gt; id int(5) auto_increment pri...

都随它大小便吧 9598

QT串口通信控制LED上位机开发教程

串口通信是嵌入式系统与PC端交互的基础技术,通过UART协议实现设备间的数据传输。QT框架提供了跨平台的串口编程支持,结合其GUI模块可以快速开发上位机控制程序。在工业自动化和物联网领域,这种上下位机架构广泛应用于设备监控和控制场景。本案例展示了如何使用QT的SerialPort模块实现LED控制功能,包含串口参数配置、指令发送等核心功能实现,为嵌入式GUI开发提供实践参考。

weixin_42598278的博客 582

PDO使用归纳【PHP】 【任务】将PDO封装成类

<br />PDO使用归纳【PHP】 <br /> 【任务】将PDO封装成类<br /><br /> new PDO("mysql:host=localhost;dbname=php100","root","pwd" [,driverOptions]);<br /> 如果需要长连接,需要长最后一个参数driverOption:persistent:/aj/持续的,不断的<br /> new PDO("连接信息","root","pwd",array(PDO::ATTR_PERSISTENT=>tru

gjpdeyx的专栏 970

Windows 11下JDK 21与JMeter 5.6.3环境配置全攻略

环境变量是操作系统管理软件路径与执行权限的核心机制,它通过预设的键值对,指引系统在调用命令时定位可执行文件。理解其工作原理,是解决软件安装后“命令未找到”等问题的关键。对于Java生态而言,正确配置JAVA_HOME和Path变量,不仅能让java、javac等基础命令全局可用,更是Maven、Gradle乃至JMeter等众多工具链顺畅运行的基石。JMeter作为一款基于Java开发的经典性能测试与接口测试工具,其稳定运行高度依赖健全的Java环境。本文聚焦于在Windows 11系统上,为JDK 21与

weixin_30940783的博客 450

汽车UDS诊断详解及Vector相关工具链使用说明——1.1 应用层协议整体介绍

本文我们先从整体的维度来介绍一下应用层协议,每个UDS服务都遵循本文中的协议。 一、SI(Service ID) SI是UDS指令的第一个字节,我们第一篇文章中提到的10等服务就是指这个服务的SI=0x10,它是服务的标识,每个服务的SI都是唯一的。 ...

weixin_42967006的博客 5475

PHP-单例模式封装PDO,简化数据库查询、插入、更新

简化PDO方式操作数据库,封装成Read和Write两个方法,减少工作量 一、数据库相关信息 数据库名为:dian 数据表名:dian_users 有user和pass字段 二、实现代码 1.封装类文件名 sql_class.php <?php class sql_class{ //-------------------------------------------- priv...

小白 1721

浅谈innovus Update io latency相关作用

同样我们使用update io latency,工具取launch clock latency负值反标到clock端口上,同时认为capture clock latency与launch clock latency相等,这样可以相互抵消,这样setup time slack = T – Tsetup -Tcomb – Toutput_delay,因此采用update io latency后,reg2out timing path的setup check变得真实些。图3 in2reg示意图。

芯冰乐 475

单例模式封装MyPDO类

【代码】单例模式封装MyPDO类。

winkexin的博客 171

汇川Easy系列PLC系统PID指令编程应用(增量型)

增量式PIDS7-1200/1500增量式PID(输出归一化、支持PWM输出)_西门子1200pid算法公式-优快云博客文章浏览阅读1k次。本文介绍了S7-1200/1500 PLC中增量式PID算法的应用,包括输出归一化和PWM输出。通过详细解析,阐述了PID输出如何限制在0.0-1.0之间,并且如何将PID输出与PWM占空比关联,适用于温度等控制场景。

RXXW_Dor的博客 1424

Win7 x64位系统下几乎完美使用安装RTX3050 6G显卡驱动详细教程

RTX3050 6G显卡驱动安装指南:由于该显卡发布时间晚于驱动,需手动修改安装文件。首先在NVIDIA官网下载驱动并解压,通过设备管理器获取硬件ID(PCI\VEN_10DE&DEV_2584),然后在解压目录的.inf文件中添加对应的设备标识。安装完成后可能出现设备管理器感叹号问题,推荐通过命令提示符启用测试模式(bcdedit /set testsigning on)解决,此方法无需每次启动按F8,但会显示测试模式水印。文中提供了详细的图文操作步骤和两种解决方案。

m0_67194883的博客 2891

php在数据表手动输入,PHP 数据库操作

使用 PDO 扩展类库(推荐)使用 Mysqli 扩展类库(这是Mysql类库的升级版,但已经不推荐使用)PDOPDOStatementPDOExceptionPDO 与 Mysqli 区别PDO可以支持多种数据库,而且操作方法一致Mysqli只支持Mysql数据库如何使用PDO连接数据库?什么是DSN?如何关闭连接?通过new PDO()来连接数据库,其中必须传入DSN数据源名称try {$...

weixin_39634480的博客 127

计算机组成原理(第三版)唐朔飞-第九章控制单元的功能-课后习题

计算机组成原理(第三版)唐朔飞-第九章控制单元的功能-课后习题

weixin_45735391的博客 4万+

php pdo怎么封装类,pdo 封装成一个类

该楼层疑似违规已被系统折叠隐藏此楼查看此楼class ConnectionPool { private static $_instance; private $_pool = []; public static function getInstance() { if (!self::$_instance) { self::$_instance...

weixin_31889705的博客 128

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

php封装pdo类,pdo 封装成一个类

该楼层疑似违规已被系统折叠隐藏此楼查看此楼class ConnectionPool { private static $_instance; private $_pool = []; public static function getInstance() { if (!self::$_instance) { self::$_instance...

weixin_35607383的博客 176

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

php pdo 简单封装,pdo 封装成一个类

该楼层疑似违规已被系统折叠隐藏此楼查看此楼class ConnectionPool { private static $_instance; private $_pool = []; public static function getInstance() { if (!self::$_instance) { self::$_instance...

weixin_32163411的博客 148

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

php 封装pdo,pdo 封装成一个类

该楼层疑似违规已被系统折叠隐藏此楼查看此楼class ConnectionPool { private static $_instance; private $_pool = []; public static function getInstance() { if (!self::$_instance) { self::$_instance...

weixin_39727402的博客 102

php中pdo封装类,pdo 封装成一个类

该楼层疑似违规已被系统折叠隐藏此楼查看此楼class ConnectionPool { private static $_instance; private $_pool = []; public static function getInstance() { if (!self::$_instance) { self::$_instance...

weixin_39783360的博客 105

php如何实例化一个pdo类,pdo 封装成一个类

该楼层疑似违规已被系统折叠隐藏此楼查看此楼class ConnectionPool { private static $_instance; private $_pool = []; public static function getInstance() { if (!self::$_instance) { self::$_instance...

weixin_42365492的博客 201

pdo 连接数据库封装成一个类

/** * 连接数据库及操作 */ class linkMysql{ private $pdo=null; private $dbms="mysql"; //数据库类型 private $host="localhost"; //服务器地址 private $name="root"; //登录账号 private $pwd="root"; //密码 private $Basenam

MyJDL的博客 1419

封装PDO函数

funPDO.php <?php /** * @title: 封装PDO函数 * * @Features: * 1. 封装 SELECT ,INSERT,DELETE,UPDATE 操作 @done(2019-3-22 13:35:30) * 2. 加入回滚事务 @done(2019-3-22 15:35:46) * * @ TODO: * 1. 完善S...

diruanye2939的博客 229

PDO使用归纳

【任务】将PDO封装成类 new PDO("mysql:host=localhost;dbname=php100","root","pwd" [,driverOptions]); 如果需要长连接,需要长最后一个参数driverOption:persistent:/aj/持续的,不断的 new PDO("连接信息","root","pwd",array(PDO::ATTR_PE

指点江山 193

【转】 PDO使用归纳【PHP】

【任务】将PDO封装成类 new PDO("mysql:host=localhost;dbname=php100","root","pwd" [,driverOptions]); 如果需要长连接,需要长最后一个参数driverOption:persistent:/aj/持续的,不断的 new PDO("连接信息","root","pwd",array(PDO::ATTR_PERSI...

weixin_30666753的博客 105

使用Chatgpt编写的PHP数据库pdo操作类(增删改查)

使用Chatgpt编写的PHP数据库pdo操作类(增删改查)

TANKING,开源开发者! 1088

跟着百度学PHP[14]-初识PDO数据库抽象层

目录: 00x1 php中的pdo是什么? 00x2 pdo创建一个PDO对象   00x1 php中的pdo是什么? 就是操作数据库的方法,pdo就是把操作数据库的函数封装成一个pdo类,其间做了安全验证而已。 果要开启某个PDO直接在PHP.ini当中激活即可。(直接将分号去除即可) 详细的开启服务可以在phpinfo下面查询即可。 00x2 创建一个PDO对象...

weixin_34055787的博客 111

预编译封装

/** * 获取查询结果并封装为一个对象数组 * @param $sql 需要执行的SQL语句 * @param array $arr 预编译语句需要添加的数据值,数组结构 * @param string $class_name 创建类的名称 * @param array $ctor_args 此数组的元素被传递给对...

aixian6529的博客 175
上一篇: PHP PDO 学习笔记
下一篇: http与https的区别
HackProgramer
博客等级 码龄12年 255粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值