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

news2024/11/25 2:23:01

前言:

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=<<<EOF
		create 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=<<<EOF
		create 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);//这个可以执行查询select
	var_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.coloradmin.cn/o/1326880.html

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

相关文章

hab_virtio hypervisor 虚拟化

Linux的 I / O 虚拟化 Virtio 框架 简而言之&#xff0c;virtio是半虚拟化管理程序中设备上的抽象层。virtio由Rusty Russell开发以支持他自己的虚拟化解决方案lguest。本文从准虚拟化和仿真设备的介绍开始&#xff0c;然后探讨的细节virtio。重点是virtio2.6.30内核发行版中的…

提前预判和确认再做 现货白银投资的两种思路

在现货白银投资中&#xff0c;对于交易的步骤长期有两种看法。一种是提前预判行情并提前布局。另外一种是等待行情启动再做布局。这种两种方法要怎么选呢&#xff1f;笔者将从自己的角度出发&#xff0c;对这个问题进行讨论。 我们来看一下前一种的投资者&#xff0c;他们喜欢提…

vulnhub-Tre(cms渗透)

靶机和kali都使用net网络&#xff0c;方便探测主机获取ip1.靶机探测 使用fping扫描net网段 靶机ip&#xff1a;192.168.66.130 2.端口扫描 扫描发现该靶机三个端口&#xff0c;ssh&#xff0c;还有两个web&#xff0c;使用的中间件也是不一样的&#xff0c;一个是apache&…

TortoiseGit通过SSH连接配置,生成SSH密钥方法

生成SSH密钥&#xff1a; Win环境下命令(git ssh key是可以自定义命名的)&#xff1a; ssh-keygen -t ed25519 -C "git ssh key" && start "" "C:\Windows\notepad.exe" "C:\Users\%username%\.ssh\id_ed25519.pub" 打开cm…

指针---你真的会使用指针吗?

指针作为C语言中的一个部分&#xff0c;可以说指针是C语言的核心&#xff0c;那么它的难度肯定是不言而喻的&#xff0c;总是能把人给绕得找不到方向。 今天我就好好的说一说指针这个东西。 1、何为指针&#xff1f; 指针是C语言中用来存放地址的一个变量类型。我们可以将指针看…

图像增强2023最新经典顶会论文和代码合集,附开源数据集下载

图像增强是图像处理领域长期的、不可回避的研究课题&#xff0c;也是活跃在各大顶会中的热门研究方向。其应用范围广泛涉及医学影像分析、安全监控、智能交通、目标检测与识别、遥感影像处理等领域&#xff0c;具有很高的实用性&#xff0c;因此每年的相关论文数量也比较多。 …

2023/12/20 work

1. 使用select完成TCP客户端程序 服务端&#xff1a;#include <stdio.h> #include <string.h> #include <stdlib.h> #include <myhead.h>#define PORT 9999 //端口号 #define IP "192.168.125.12" //IP地址int ma…

C++实现位图

目录 一、什么是位图 二、位图类 1.参数及构造函数 2.set函数设置为1&#xff08;代表存在&#xff09; 3.reset函数设置为0&#xff08;代表不存在&#xff09; 4.test函数查看状态&#xff08;0还是1&#xff09; 三、位图的变形 一、什么是位图 位图这个词汇比较少见…

一行代码修复100vh bug

你知道奇怪的移动视口错误&#xff08;也称为100vh bug&#xff09;吗&#xff1f;或者如何以正确的方式创建全屏块&#xff1f; 一、100vh bug 什么是移动视口错误&#xff1f; 你是否曾经在网页上创建过全屏元素&#xff1f;只需添加一行 CSS 并不难&#xff1a; .my-page {h…

PAT 乙级 1023 组个最小数

1023 组个最小数 分数 20 作者 CAO, Peng 单位 Google 给定数字 0-9 各若干个。你可以以任意顺序排列这些数字&#xff0c;但必须全部使用。目标是使得最后得到的数尽可能小&#xff08;注意 0 不能做首位&#xff09;。例如&#xff1a;给定两个 0&#xff0c;两个 1&#xff…

【教程】cocos2dx资源加密混淆方案详解

1,加密,采用blowfish或其他 2,自定是32个字符的混淆code 3,对文件做blowfish加密,入口文件加密前将混淆code按约定格式(自定义的文件头或文件尾部)写入到文件 4,遍历资源目录,对每个文件做md5混淆,混淆原始串“相对路径”“文件名”混淆code, 文件改名并且移动到资源目录根…

Python开发GUI常用库PyQt6和PySide6介绍之二:设计师(Designer)

Python开发GUI常用库PyQt6和PySide6介绍之二&#xff1a;设计师&#xff08;Designer&#xff09; PySide6和PyQt6都有自己的设计师&#xff08;Designer&#xff09;&#xff0c;用于可视化地设计和布局GUI应用程序的界面。这些设计师提供了丰富的工具和功能&#xff0c;使开…

acwing-蓝桥杯C++ AB组辅导课Day2-递归习题+递推+二分

感谢梦翔老哥的蓝桥杯C AB组辅导课~ 递归习题&#xff1a; 1.递归实现组合型枚举 题意&#xff1a; 题目要求输出组合枚举&#xff0c;与排列不同&#xff0c;排列具有顺序之分&#xff0c;对于组合来说&#xff0c;是没有顺序之分的&#xff0c;所以[1,2,3]和[3,2,1]被看成同…

灰盒测试简要学习指南!

在本文中&#xff0c;我们将了解什么是灰盒测试、以及为什么要使用它&#xff0c;以及它的优缺点。 在软件测试中&#xff0c;灰盒测试是一种有用的技术&#xff0c;可以确保发布的软件是高性能的、安全的并满足预期用户的需求。这是一种从外部测试应用程序同时跟踪其内部操作…

【【迭代16次的CORDIC算法-verilog实现】】

迭代16次的CORDIC算法-verilog实现 -32位迭代16次verilog代码实现 CORDIC.v module cordic32#(parameter DATA_WIDTH 8d32 , // we set data widthparameter PIPELINE 5d16 // Optimize waveform)(input …

数字化时代的智能支持:亚马逊云科技轻量应用服务器技术领先

轻量应用服务器是一种简化运维、门槛低的弹性服务器&#xff0c;它的"轻"主要体现在几个方面&#xff1a;开箱即用、应用优质、上手简洁、投入划算、运维简便以及稳定可靠。相较于普通的云服务器&#xff0c;轻量应用服务器简化了云服务的操作难度、使用和管理流程&a…

全链路压测之分布式架构/SkyWalking链路追踪/中间件

最近刷题&#xff0c;学习了些压测的知识&#xff0c;大多是在小破站上的笔记&#xff0c;仅供大家参考~ 一、分布式微服务架构 微服务&#xff1a;多个系统之间相互调用 全链路&#xff1a;简单理解&#xff0c;就是一个系统调用另一个系统 二、SkyWalking链路追踪平台 链路…

阿里云经济型、通用算力型、计算型、通用型、内存型云服务器最新活动报价

阿里云作为国内领先的云计算服务提供商&#xff0c;提供了多种规格的云服务器供用户选择。为了满足不同用户的需求&#xff0c;阿里云推出了经济型、通用算力型、计算型、通用型和内存型等不同类型的云服务器。下面将详细介绍这些云服务器的最新活动报价。 一、阿里云特惠云服…

01-Go语言介绍以及win环境搭建

1、Go 语言介绍 Go 即 Golang&#xff0c;是 Google 公司 2009 年 11 月正式对外公开的一门编程语言。 根据 Go 语言开发者自述&#xff0c;近 10 多年&#xff0c;从单机时代的 C 语言到现在互联网时代的 Java&#xff0c; 都没有令人满意的开发语言&#xff0c;而 C往往给人…

python学习笔记--异常捕获

异常场景 numinput("input you number:") n9000 try:resultn/int(num)print({} 除以num 结果为{}.format(n,result)) except ZeroDivisionError as err:print("0不可以作为除数&#xff0c;出现报错{}".format(err)) except ValueError as err:print(&quo…