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;
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();//错误信息
}