【深入使用】PHP的PDO 基本使用

前言:

PDO:数据库抽象层

简介:PDO扩展为PHP访问数据库定义了一个轻量级的、一致性的接口,PDO解决了数据库连接不统一的问题。是PHP 5新加入的一个重大功能
 

【为什么要使用PDO】?
PDO是PHP5新加入的一个重大功能,我们的数据库服务器为MySQL,所有的程序代码的数据库操作全是一mysql()或者mysqli()函数来操作,当我们的数据库 需要更换时比如换成,SQL、SERVER、PostgreSQL、MS 等,我们不可能去修改所有的程序代码!所以就要用到PDO,PDO很好的帮我们解决了这个问题,使用PDO操作非常方便,只需要修改数据源格式,和加载相应的驱动文件到PHP.ini即可;
 

主要内容:

二、PDO基本使用
1、PDO的配置
1)修改php.ini,添加MySQL的PDO扩展
打开PHP配置文件php.ini,找到php_pdo_mysql.dll这行去掉钱买你的分号

一、 PDO简介
1、PDO简介
(1)PHP的PDO(PHP Data Objects)是一种用于在PHP中访问数据库的扩展。它提供了一个统一的接口,使得开发人员可以使用相同的方式与不同类型的数据库进行交互,例如MySQL、PostgreSQL和SQLite等

(2)它与PHP5.1版本一起发布的,目前支持的数据库包括Firebird、FreeTDS、Interbase、MySQL、MS SQL Server、ODBC、Oracle、Postgre SQL、SQLite和Sybase。

(3)当操作不同数据库时,只需要修改PDO中的DSN数据库源,如$dsn = "mysql:host=$host;dbname=$dbname;charset=utf8mb4";) ,即可使用PDO的统一接口进行操作。

有了PDO,您不必再使用mysqli_*函数、oci_*函数或者mssql_*函数,也不必再为它们封装数据库操作类,只需要使用PDO接口中的方法就可以对各种数据库进行操作。
PDO是一个第三方的类,默认已经集成到PHP中了。
 

2、PDO特性

(1)数据库支持: PDO提供了对多种数据库的支持,包括MySQL、SQLite、PostgreSQL、Oracle等,因此你可以在不改变代码逻辑的情况下切换使用不同的数据库。

(2)面向对象的接口: PDO使用面向对象的编程接口,通过实例化PDO类来连接数据库,并使用PDOStatement类执行查询和操作。

(3)预处理语句: PDO支持预处理语句(prepared statements),这是一种在执行前将SQL查询与数据分离的方式。预处理语句可以提高性能,并提供了更好的安全性,防止SQL注入攻击。

(4)绑定参数: 使用PDO的预处理语句,你可以绑定参数到查询中,而不是直接将值插入到SQL语句中。这种方式可以有效地防止SQL注入,并允许您重复使用准备好的语句,只需更改绑定的参数即可。

(5)事务支持: PDO支持数据库事务,你可以使用beginTransaction()开始一个事务,然后通过commit()提交事务或使用rollback()回滚事务以撤消之前的更改。

(6)错误处理: PDO使用异常机制来处理数据库操作中的错误。你可以捕获和处理PDOException异常,以便在出现错误时采取适当的措施。

(7)多个结果集: 在某些数据库中,你可以执行返回多个结果集的查询。PDO提供了方法来访问和处理这些结果集。

(8)支持命名占位符和问号占位符: PDO支持使用命名占位符(如:name)或问号占位符(如?)进行参数绑定。

(9)元数据获取: PDO提供了获取数据库元数据的方法,如获取表结构、列信息等。

(10)数据库连接管理: PDO提供了对数据库连接的管理,包括连接池管理、连接参数设置等。
 

3、PDO支持的数据库

4、PDO的配置

配置php配置文件,开启相应扩展
extension=php_pdo.dll;

二、 PDO对象方法

1、对象方法:

2、代码案例    

1、连接到数据库:

<?php
$dsn="mysql:host=localhost;dbname=dbalitest";
$username="root";
$passwd="a6";try {$pdo=new PDO($dsn,$username,$passwd);//数据源:代表连接那种数据库,数据库是什么。数据库管理工具的账号+密码// 设置错误模式为异常$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);echo "成功连接到数据库";
} catch (PDOException $e) {echo "连接数据库失败: " . $e->getMessage();
}

2、执行查询语句并获取结果集:

$query = "SELECT * FROM users";
$stmt = $pdo->query($query);while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {echo $row['username'] . "<br>";
}

3、使用预处理语句执行带参数的查询:

$query = "SELECT * FROM users WHERE age > :age";
$stmt = $pdo->prepare($query);$age = 18;
$stmt->bindParam(':age', $age, PDO::PARAM_INT);
$stmt->execute();while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {echo $row['username'] . "<br>";
}

4、插入数据:

$query = "INSERT INTO users (username, email) VALUES (:username, :email)";
$stmt = $pdo->prepare($query);$username = "john";
$email = "john@example.com";$stmt->bindParam(':username', $username, PDO::PARAM_STR);
$stmt->bindParam(':email', $email, PDO::PARAM_STR);$stmt->execute();

5、更新数据:

$query = "UPDATE users SET email = :email WHERE id = :id";
$stmt = $pdo->prepare($query);$email = "newemail@example.com";
$id = 1;$stmt->bindParam(':email', $email, PDO::PARAM_STR);
$stmt->bindParam(':id', $id, PDO::PARAM_INT);$stmt->execute();

第一种连接pdo的方式:

<?php
try
{$dsn="mysql:host=localhost;dbname=mysql";$username="root";$passwd="a6";$pdo=new PDO($dsn,$username,$passwd);//数据源:代表连接那种数据库,数据库是什么。数据库管理工具的账号+密码var_dump($pdo);
}catch(PDOException $e)
{echo $e->getMessage();//错误信息
}

<?php
try
{$dsn="mysql:host=localhost;dbname=dbalitest";$username="root";$passwd="a6";$pdo=new PDO($dsn,$username,$passwd);//数据源:代表连接那种数据库,数据库是什么。数据库管理工具的账号+密码$sql=<<<EOFcreate table if not exists user(content varchar(30) not null);
EOF;
$res=$pdo->exec($sql);//执行一条sql语句,对于select没有作用
var_dump($res);
}catch(PDOException $e)
{echo $e->getMessage();//错误信息
}

<?php
try
{$dsn="mysql:host=localhost;dbname=dbalitest";$username="root";$passwd="a6";$pdo=new PDO($dsn,$username,$passwd);//数据源:代表连接那种数据库,数据库是什么。数据库管理工具的账号+密码$sql=<<<EOFcreate table if not exists user(content varchar(30) not null);
EOF;
$res=$pdo->exec($sql);//执行一条sql语句,对于select没有作用
var_dump($res);$sql="insert into user(content) values('king')";//插入数据
$res=$pdo->exec($sql);
var_dump($res);}catch(PDOException $e)
{echo $e->getMessage();//错误信息
}

<?php
try
{$dsn="mysql:host=localhost;dbname=dbalitest";$username="root";$passwd="a6";$pdo=new PDO($dsn,$username,$passwd);//数据源:代表连接那种数据库,数据库是什么。数据库管理工具的账号+密码$sql="select * from user";//实验错误码$res=$pdo->query($sql);//这个可以执行查询selectvar_dump($res);//得到一个object(PDOStatement),遍历才可以输出foreach($res as $row){print_r($row);}}catch(PDOException $e)
{echo $e->getMessage();//错误信息
}

<?php
try
{$dsn="mysql:host=localhost;dbname=dbalitest";$username="root";$passwd="alibaba123456";$pdo=new PDO($dsn,$username,$passwd);//数据源:代表连接那种数据库,数据库是什么。数据库管理工具的账号+密码$sql="select * from user";$sm=$pdo->prepare($sql);//预处理的意思是准备处理$res=$sm->execute();//通过这个方法处理$row=$sm->fetch();//得到结果的一条记录,所有记录:fetchAll()print_r($row);}catch(PDOException $e)
{echo $e->getMessage();//错误信息
}

<?php
try
{$dsn="mysql:host=localhost;dbname=dbalitest";$username="root";$passwd="a6";$pdo=new PDO($dsn,$username,$passwd);//数据源:代表连接那种数据库,数据库是什么。数据库管理工具的账号+密码$sql="select * from user";$sm=$pdo->prepare($sql);$res=$sm->execute();if($res)//直到没有数据才停止循环{while($row=$sm->fetch()){print_r($row);}}
}catch(PDOException $e)
{echo $e->getMessage();//错误信息
}

<?php
try
{$dsn="mysql:host=localhost;dbname=dbalitest";$username="root";$passwd="a6";$pdo=new PDO($dsn,$username,$passwd);//数据源:代表连接那种数据库,数据库是什么。数据库管理工具的账号+密码echo "自动提交".$pdo->getAttribute(PDO::ATTR_AUTOCOMMIT);//事务默认提交是否开启echo "<br />";echo "pdo默认处理错误模式".$pdo->getATTribute(PDO::ATTR_ERRMODE);echo "<br />";"禁用自动提交".$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT,0);echo "<br />";echo "自动提交".$pdo->getAttribute(PDO::ATTR_AUTOCOMMIT);//事务默认提交是否开启0
}	
catch(PDOException $e)
{echo $e->getMessage();//错误信息
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/236804.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ansible在ubuntu下的安装和使用

ansible在ubuntu下的安装和使用 本文目录 ansible在ubuntu下的安装和使用安装和配置虚拟机配置安装和验证 简单使用创建 ansible cfg 和 inventory 文件创建剧本并执行使用 ansible vault 加密 安装和配置 中文文档&#xff1a;http://www.ansible.com.cn/docs/intro_installa…

力扣:203. 移除链表元素(Python3)

题目&#xff1a; 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 …

芋道前端框架上线之后发现element-ui的icon图标全部乱码

前言 最近发现线上有人反映图标全部是乱码&#xff0c;登录上去看确实乱码&#xff0c;刷新就好最后一顿搜&#xff0c;发现是sass版本不兼容导致的图标乱码问题 解决办法 1.先把sass升级到1.39.0 2.来到vue.config.js文件配置代码-如果是芋道前端框架不用配置自带 css: {lo…

使用Docker部署Nexus Maven私有仓库并结合Cpolar实现远程访问

文章目录 1. Docker安装Nexus2. 本地访问Nexus3. Linux安装Cpolar4. 配置Nexus界面公网地址5. 远程访问 Nexus界面6. 固定Nexus公网地址7. 固定地址访问Nexus Nexus是一个仓库管理工具&#xff0c;用于管理和组织软件构建过程中的依赖项和构件。它与Maven密切相关&#xff0c;可…

Ruckus Wireless Admin 命令执行漏洞复现(CVE-2023-25717)

0x01 产品简介 Ruckus Wireless Admin是ruckuswireless多个路由、硬件设备的后台管理系统。 0x02 漏洞概述 Ruckus Wireless Admin在10.4 及更早版本存在命令执行漏洞。攻击者可通过该漏洞在服务器端任意执行代码&#xff0c;写入后门&#xff0c;获取服务器权限&#xff0c…

Axure之中继器的使用(交互动作reperter属性Item属性)

目录 一.中继器的基本使用 二.中继器的动作&#xff08;增删改查&#xff09; 2.1 新增 2.2 删除 2.3 更新行 2.4 效果展示 2.5 模糊查询 三.reperter属性 在Axure中&#xff0c;中继器&#xff08;Repeater&#xff09;是一种功能强大的组件&#xff0c;用于创建重复…

Spring Boot学习随笔- 文件上传和下载(在线打开、附件下载、MultipartFile)

学习视频&#xff1a;【编程不良人】2021年SpringBoot最新最全教程 第十二章、文件上传、下载 文件上传 文件上传是指将文件从客户端计算机传输到服务器的过程。 上传思路 前端的上传页面&#xff1a;提交方式必须为post&#xff0c;enctype属性必须为multipart/form-data开发…

html行内元素和块级元素的区别?

HTML中的元素可以分为两种类型&#xff1a;行内元素&#xff08;inline&#xff09;和块级元素&#xff08;block&#xff09; 文章目录 什么是行内元素什么是块级元素元素转换行内元素转块级元素块级元素转行内元素 区别总结 什么是行内元素 HTML的行内元素&#xff08;inli…

VTK读写数据

png格式图片转jpg #include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL2) VTK_MODULE_INIT(vtkInteractionStyle)#include <vtkSmartPointer.h> #include <vtkPNGReader.h> #include <vtkJPEGWriter.h> #include <vtkImageViewer2.h>…

论文中公式怎么降重 papergpt

大家好&#xff0c;今天来聊聊论文中公式怎么降重&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff0c;可以借助此类工具&#xff1a; 论文中公式怎么降重 一、引言 在论文撰写过程中&#xff0c;公式是表达学…

php伪协议 [NISACTF 2022]easyssrf

打开题目 我们直接用 file:/// 协议读取看看flag文件 file:///flag 点击curl得到回响 得到提示告诉我们应该看看提示文件 file:///fl4g 跟着去访问了一下 再跟着去访问 从代码中我们可以看出 get传参file&#xff0c;我们用stristr检测file参数里面是否含有file&#xff…

智能优化算法应用:基于堆优化算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于堆优化算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于堆优化算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.堆优化算法4.实验参数设定5.算法结果6.参考文…

一篇文章搞定Vue3响应式数据最常用的ref、reactive、computed、watch方法

前言 Vue3 中可以通过响应式 API 来创建响应式对象&#xff0c;相较于 Vue2 中使用 Object.definProperty 来劫持 get 和 set 不同&#xff0c;Vue3 中使用的是 Proxy 来创建响应式对象&#xff0c;使用Proxy有以下几点优势&#xff1a; 1. 对象新增属性不再需要手动 $set 添…

创建型模式 | 原型模式

一、原型模式 1、原理 原型模式&#xff0c;用原型实例指定创建对象的种类&#xff0c;并且通过拷贝这些原型创建新的对象。原型模式其实就是从一个对象再创建另外一个可定制的对象&#xff0c;而且不需要知道任何创建的细节。原型像是一个模板&#xff0c;可以基于它复制好多…

LeetCode Hot100 215.数组中的第k个最大元素

题目&#xff1a; 给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。 请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。 方法一&#xff…

HTML输出特殊字符详细方法

以下是部分特殊字符代码表&#xff0c;它们的完整应用代码格式为&#xff1a;&#;用下面的四位数字替换&#xff0c;将得到对应的符号。&#xff08;注意&#xff1a;应用这些代码&#xff0c;编辑器应该切换到HTML模式&#xff09; ☏260f ☎260e ☺263a ☻263b ☼263c ☽…

Leetcode—73.矩阵置零【中等】

2023每日刷题&#xff08;六十六&#xff09; Leetcode—73.矩阵置零 空间复杂度为O(mn)版实现代码 class Solution { public:void setZeroes(vector<vector<int>>& matrix) {int rowLen matrix.size();int colLen matrix[0].size();vector<int> row…

阿赵UE学习笔记——3、常用界面窗口

阿赵UE学习笔记目录 大家好&#xff0c;我是阿赵。继续学习虚幻引擎&#xff0c;这次介绍的是编辑器的常用界面窗口。 一、视口 这个视口的概念&#xff0c;可以体现出UE对于多屏幕同时显示是多么的友好。我们开发游戏的时候&#xff0c;一般都会同一台电脑用2个或者以上显示器…

Spring Security登录的简单解析

Spring Security登录的简单解析 1.自己写的登录2.进入authenticationManager.authenticate(authenticationToken);3 进入result provider.authenticate(authentication);4 进入 user retrieveUser(username, (UsernamePasswordAuthenticationToken) authentication);5 进入 U…

算法基础之约数之和

约数之和 核心思想&#xff1a; #include<iostream>#include<algorithm>#include<vector>#include<unordered_map>using namespace std;typedef long long LL;const int N 110 , mod 1e97;int main(){int n;cin>>n;unordered_map<int,int&…