这篇文章主要介绍了PHP中PDO连接数据库的操作步骤,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。
PDO—数据库抽象层
简介:PDO扩展为PHP访问数据库定义了一个轻量级的、一致性的接口,PDO解决了数据库连接不统一的问题。
一、 PDO简介
本章主要介绍PDO的安装与配置,以及使用PDO连接数据库的方法。
1-1PDO简介
PDO是PHP Data Object(PHP数据对象)的简称,它是与PHP5.1版本一起发布的,目前支持的数据库包括Firebird、FreeTDS、Interbase、MySQL、MS SQL Server、ODBC、Oracle、Postgre SQL、SQLite和Sybase。当操作不同数据库时,只需要修改PDO中的DSN
(数据库源) ,即可使用PDO的统一接口进行操作。
PDO特性:
编码一致性:PDO提供可用于各种数据库的单一接口
灵活性:PDO在运行时必须加载数据库驱动程序,所以不需要每次在使用数据库时,重新配置和重新编译PHP
高性能:PDO是用C语言编写的编译为PHP,与用php编写的其他方案相比,虽然其他功能相同,但提供了更高的性能
面向对象特性:PDO是利用的PHP5面向对象的特性,可以获得更高效的数据库通信。
注意:PDO扩展只是一个抽象的接口层,利用PDO扩展本身,并不能实现任何数据库的操作,必须使用一个特性的形式把各自的特色表现出来才行。
1-2 PDO的配置与启用
1-3 PDO连接数据库
1.通过参数形式连接数据库(重点掌握此种办法)
//通过参数形式连接数据库
try{
$dsn='mysql:host=localhost;dbname=school';
$username='root';
$password='root';
$pdo=new PDO($dsn,$username,$password);
var_dump($pdo);
}catch (PDOException $e){
echo $e->getMessage();
};
需要注意:dsn是你的数据源
输出结果:object(PDO)#1 (0) { }
二、 PDO对象的使用
主要介绍PDO对象方法的使用。
2-1 [PDO] exec()方法执行建表操作
<?php
try{
//驱动器的名称 mysql
$pdo=new PDO('mysql:host=localhost;dbname=school','root','root');
//exec():执行一条sql语句并返回其受影响的行数;如果没有受影响的记录,它返回0
//exec对于select没有作用
//PHP是一个Web编程语言,在编程过程中难免会遇到用echo来输出大段的html和javascript脚本的情况,
//如果用传统的输出方法 ——按字符串输出的话,
//肯定要有大量的转义符来对字符串中的引号等特殊字符进行转义,以免出现语法错误。
//如果是一两处还可以容忍,但是要是一个完整的 html文本或者是一个200行的js我想是谁都会崩溃的。
//这就是PHP为什么要引入一个定界符的原因——至少一大部分原因是这样的。
/* 1.PHP定界符的作用就是按照原样,包括换行格式什么的,输出在其内部的东西;
2.在PHP定界符中的任何特殊字符都不需要转义;
3.PHP定界符中的PHP变量会被正常的用其值来替换。
PHP中的定界符格式是这样的:
<<<Eof
……
Eof;*/
$sql=<<<EOF
create table if not exists t_teacher(
id int UNSIGNED auto_increment primary key,
teaname varchar(20) not null UNIQUE,
pwd char(32) not null,
email varchar(30) not null
);
EOF;
$res= $pdo->exec($sql);
var_dump($res);
}catch (PDOException $e){
echo $e->getMessage();
};
输出结果:int(0);
2-2 [PDO] exec()方法执行插入记录操作
续上面:插入一条或多条记录
<?php
try{
//驱动器的名称 mysql
$pdo=new PDO('mysql:host=localhost;dbname=school','root','root');
$sql='insert into t_teacher values(default,"king5","'.md5('king').'","waly@qq.com");';
$res=$pdo->exec($sql);
echo $res;
}catch (PDOException $e){
echo $e->getMessage();
};
<?php
try{
//驱动器的名称 mysql
$pdo=new PDO('mysql:host=localhost;dbname=school','root','root');
//$sql='insert into t_teacher values(default,"king6","'.md5('king').'","waly@qq.com");';
$sql=<<<EOF
insert into t_teacher values
(default,"king7","'.md5('king').'","waly@qq.com"),
(default,"king8","'.md5('king').'","waly@qq.com"),
(default,"king9","'.md5('king').'","waly@qq.com")
EOF;
$res=$pdo->exec($sql);
echo '受影响的记录的条数为:'. $res."<br/>";
//$pdo->lastInsertId():得到新插入记录的ID号
//echo '最后插入的ID号为:'.$pdo->lastInsertId();
}catch (PDOException $e){
echo $e->getMessage();
};
2-3 [PDO] exec()方法执行其他SQL操作
本身是king,修改为king,会是0条记录被影响.
lastInsertId() 只能对插入有影响。
exec()对查询无作用
2-4 [PDO] errorCode()和errorInfo()方法查看错误信息
<?php
try{
//驱动器的名称 mysql
$pdo=new PDO('mysql:host=localhost;dbname=school','root','root');
//错误的表名
$sql='insert into t_teacher1 values(default,"king6","'.md5('king').'","waly@qq.com");';
$res=$pdo->exec($sql);
if($res===false){
//$pdo->errorCode(); SQLSTATE的值
echo $pdo->errorCode();
echo '<hr/>';
//$pdo->errorInfo():返回的错误信息的数组,数组中包含3个单元
//0=>SQLSTATE(错误编号),1=>CODE(错误码),2=>INFO(错误信息)
$errInfo=$pdo->errorInfo();
print_r($errInfo);
}
}catch (PDOException $e){
echo $e->getMessage();
};
2-5 [PDO] query()方法执行查询语句
<?php
try{
//驱动器的名称 mysql
$pdo=new PDO('mysql:host=localhost;dbname=school','root','root');
//查询一条记录
//$sql='select * from t_teacher where id=5';
//查询多条记录
$sql='select * from t_teacher';
//$pdo->query($sql):执行sql语句,返回PDOStatement对象:需要遍历这个对象,将里面的内容取出来
$stmt=$pdo->query($sql);
var_dump($stmt); //只能看出这个语句返回的是一个对象
echo '<hr/>';
foreach ($stmt as $row){
print_r($row);
echo '<hr/>';
echo '编号:'.$row['id'].'<br/>';
echo '用户名:'.$row['teaname'].'<br/>';
echo '邮箱:'.$row['email'].'<br/>';
echo '<hr/>';
}
}catch (PDOException $e){
echo $e->getMessage();
};
Query()用于插入数据
<?php
try{
//驱动器的名称 mysql
$pdo=new PDO('mysql:host=localhost;dbname=school','root','root');
//插入一条记录
$sql='insert into t_teacher values(default,"king12","'.md5('king').'","waly@qq.com");';
//$pdo->query($sql):执行sql语句,返回PDOStatement对象:需要遍历这个对象,将里面的内容取出来
$stmt=$pdo->query($sql);
var_dump($stmt); //只能看出这个语句返回的是一个对象
}catch (PDOException $e){
echo $e->getMessage();
};
注意:更多的用query()查询数据,用exec()实现增删改
2-6 [PDO] prepare()和execute()方法执行查询语句
<?php
//查询单条语句
try{
//驱动器的名称 mysql
$pdo=new PDO('mysql:host=localhost;dbname=school','root','root');
//查询一条记录
$sql='select * from t_teacher where id=5';
//$pdo->prepare($sql);准备sql语句
$stmt=$pdo->prepare($sql);
//execute():执行预处理语句
$res=$stmt->execute();
//var_dump($res); //会返回bool(true)
//查数据使用
//fetch():得到结果集中的一条记录(作为索引+关联样式返回)
$row=$stmt->fetch();
print_r($row);
}catch (PDOException $e){
echo $e->getMessage();
};
<?php
try{
//驱动器的名称 mysql
$pdo=new PDO('mysql:host=localhost;dbname=school','root','root');
//查询多条记录
$sql='select * from t_teacher';
//$pdo->prepare($sql);准备sql语句
$stmt=$pdo->prepare($sql);
//execute():执行预处理语句
$res=$stmt->execute();
//var_dump($res); //会返回bool(true)
//查数据使用
//fetch():得到结果集中的一条记录(作为索引+关联数组)
/*if($res){
while ($row=$stmt->fetch()){
print_r($row);
echo '<hr/>';
}
}*/
//fetchAll() 查询所有记录,以二维数组(索引+关联方式)
$rows=$stmt->fetchAll();
print_r($rows);
}catch (PDOException $e){
echo $e->getMessage();
};
指定类型:我们更多的是想得到关联数组,我们可以通过两种方式来获得,第一种方式:设置其取回数据的方式(设置参数、常量);第二种方式:通过方法
三、 PDOStatement对象的使用
本章主要介绍PDOStatement对象方法的使用,以及参数的绑定与预处识。
3-1 [PDO] quote()方法防止SQL注入
带条件查询 登录实现的例子
<?php
header('content-type:text/html;charset=utf-8');
$username=$_POST['username'];
$password=$_POST['password'];
try{
//连接数据库
$pdo=new PDO('mysql:host=localhost;dbname=school','root','root');
//向数据库表查找对应的用户信息//如果存在,证明有这个用户,登录成功;否则登录失败
//输入 'or 1=1 # 可以查看查到的数据
//$sql="select * from t_user WHERE `name`='{$username}' AND `password`='{$password}'"; //通过quote():返回带引号的字符串,过滤字符串中的特殊字符
$username=$pdo->quote($username);
$sql="select * from t_user WHERE `name`={$username} AND `password`={$password}";
echo $sql;
$stmt=$pdo->query($sql);
//PDOStatement对象的方法:rowCount() :对于select操作返回的结果集中记录的条数,
//对于INSERT、UPDATE、DELETE返回受影响的记录的条数
echo $stmt->rowCount();
}catch (PDOException $e){
echo $e->getMessage();
}
3-2 [PDO] 预处理语句中的占位符的使用
<?php
header('content-type:text/html;charset=utf-8');
$username=$_POST['username'];
$password=$_POST['password'];
try{
//连接数据库
$pdo=new PDO('mysql:host=localhost;dbname=school','root','root');
//占位符有两种方法
//第一种方法
$sql="select * from t_user WHERE `name`=:username and `password`=:password";
$stmt=$pdo->prepare($sql);
$stmt->execute(array(":username"=>$username,":password"=>$password));
//PDOStatement对象的方法:rowCount() :对于select操作返回的结果集中记录的条数,
//对于INSERT、UPDATE、DELETE返回受影响的记录的条数
echo $stmt->rowCount();
//第二种方法
$sql="select * from t_user WHERE `name`=? and `password`=?";
$stmt=$pdo->prepare($sql);
$stmt->execute(array($username,$password));
echo $stmt->rowCount();
}catch (PDOException $e){
echo $e->getMessage();
}
3-3 [PDO] bindParam()方法绑定参数
两种方式:命名参数占位符,问号方式
<?php
header('content-type:text/html;charset=utf-8');
try{
//连接数据库
$pdo=new PDO('mysql:host=localhost;dbname=school','root','root');
// $sql="insert into t_user(`name`,`password`,`sex`) VALUES (:username,:password,:sex)";
$sql="insert into t_user VALUES (DEFAULT ,:username,:password,:sex)";
$stmt=$pdo->prepare($sql);
$stmt->bindParam(":username",$username,PDO::PARAM_STR);
$stmt->bindParam(":password",$password,PDO::PARAM_STR);
$stmt->bindParam(":sex",$sex,PDO::PARAM_STR);
$username='张三';
$password='123654';
$sex='M';
$stmt->execute();
echo $stmt->rowCount();
}catch (PDOException $e){
echo $e->getMessage();
}
<?php
header('content-type:text/html;charset=utf-8');
try{
//连接数据库
$pdo=new PDO('mysql:host=localhost;dbname=school','root','root');
// $sql="insert into t_user(`name`,`password`,`sex`) VALUES (:username,:password,:sex)";
$sql="insert into t_user VALUES (DEFAULT ,?,?,?)";
$stmt=$pdo->prepare($sql);
$stmt->bindParam(1,$username);
$stmt->bindParam(2,$password);
$stmt->bindParam(3,$sex);
$username='张三1';
$password='1236541';
$sex='F';
$stmt->execute();
echo $stmt->rowCount();
}catch (PDOException $e){
echo $e->getMessage();
}
3-4 [PDO] bindValue()方法绑定参数
向用户表插入数据:命名参数占位符,问号方式类似
<?php
header('content-type:text/html;charset=utf-8');
try{
//连接数据库
$pdo=new PDO('mysql:host=localhost;dbname=school','root','root');
// $sql="insert into t_user(`name`,`password`,`sex`) VALUES (:username,:password,:sex)";
$sql="insert into t_user VALUES (DEFAULT ,?,?,?)";
$stmt=$pdo->prepare($sql);
$username='李四';
$password='123654';
$stmt->bindValue(1,$username);
$stmt->bindValue(2,$password);
$stmt->bindValue(3,'M');
$stmt->execute();
echo $stmt->rowCount();
$username='李四1';
$password='1236541';
$stmt->bindValue(1,$username);
$stmt->bindValue(2,$password);
$stmt->bindValue(3,'M');
$stmt->execute();
echo $stmt->rowCount();
}catch (PDOException $e){
echo $e->getMessage();
}
3-5 [PDO] bindColumn()方法绑定参数
<?php
header('content-type:text/html;charset=utf-8');
try{
//连接数据库
$pdo=new PDO('mysql:host=localhost;dbname=school','root','root');
// $sql="insert into t_user(`name`,`password`,`sex`) VALUES (:username,:password,:sex)";
$sql="select `name`,`password`,`sex` from t_user";
$stmt=$pdo->prepare($sql);
$stmt->execute();
echo '结果集中的列数一共有:'.$stmt->columnCount();
echo "<hr/>";
print_r($stmt->getColumnMeta(0));
$stmt->bindColumn(1,$username);
$stmt->bindColumn(2,$password);
$stmt->bindColumn(3,$sex);
while ($stmt->fetch(PDO::FETCH_BOUND)){
echo '用户名:'.$username."-密码:".$password."-性别:".$sex."<hr/>";
}
echo $stmt->rowCount();
}catch (PDOException $e){
echo $e->getMessage();
}
3-6 [PDO] fetchColumn()方法从结果集中返回一列
<?php
header('content-type:text/html;charset=utf-8');
try{
//连接数据库
$pdo=new PDO('mysql:host=localhost;dbname=school','root','root'); $sql="select `name`,`password`,`sex` from t_user";
$stmt=$pdo->query($sql);
//索引默认从0开始
echo $stmt->fetchColumn(0),"<br/>";
echo $stmt->fetchColumn(1),"<br/>";
echo $stmt->fetchColumn(2);
}catch (PDOException $e){
echo $e->getMessage();
}
3-7 [PDO] debugDumpParams()方法打印一条预处理语句
<?php
header('content-type:text/html;charset=utf-8');
try{
//连接数据库
$pdo=new PDO('mysql:host=localhost;dbname=school','root','root');
// $sql="insert into t_user(`name`,`password`,`sex`) VALUES (:username,:password,:sex)";
$sql="insert into t_user VALUES (DEFAULT ,:username,:password,:sex)";
$stmt=$pdo->prepare($sql);
$stmt->bindParam(":username",$username,PDO::PARAM_STR);
$stmt->bindParam(":password",$password,PDO::PARAM_STR);
$stmt->bindParam(":sex",$sex,PDO::PARAM_STR);
$username='张三';
$password='123654';
$sex='M';
$stmt->execute();
$stmt->debugDumpParams();
}catch (PDOException $e){
echo $e->getMessage();
}
四、PDO事务处理
主要介绍如何使用PDO进行事务处理
4-1 PDO错误处理模式
3种错误处理模式
静默模式
<?php
header('content-type:text/html;charset=utf-8');
/*PDO::ERRMODE_SLIENT:默认模式,静默模式*/
try{
//连接数据库
$pdo=new PDO('mysql:host=localhost;dbname=school','root','root');
$sql="select * from nonet_user";
$stmt=$pdo->query($sql);
echo $pdo->errorCode();
echo '<br/>';
echo $pdo->errorInfo();
}catch (PDOException $e){
echo $e->getMessage();
}
<?php
header('content-type:text/html;charset=utf-8');
/*PDO::ERRMODE_SLIENT:默认模式,静默模式
*PDO::ERRMODE_WARNING:警告模式
* PDO::ERRMODE_EXCEPTION:异常模式
*/
try{
//连接数据库
$pdo=new PDO('mysql:host=localhost;dbname=school','root','root');
//设置警告模式
//$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
//设置异常模式:推荐使用
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$sql="select * from nonet_user";
$stmt=$pdo->query($sql);
echo $pdo->errorCode();
echo '<br/>';
echo $pdo->errorInfo();
}catch (PDOException $e){
echo $e->getMessage();
}
4-2 PDO事务处理
<?php
header('content-type:text/html;charset=utf-8');
try{
$option=array(PDO::ATTR_AUTOCOMMIT,0);
$pdo=new PDO('mysql:host=localhost;dbname=school','root','root',$option);
//开启事务
$pdo->beginTransaction();
var_dump($pdo->inTransaction());
$sql="update account set money=money-200 WHERE username='king'";
$res=$pdo->exec($sql);
if($res==0){
throw new PDOException('转账失败');
}
$res1=$pdo->exec('update account set money=money+200 WHERE username="queen"');
if($res1==0){
throw new PDOException('接收失败');
}
$pdo->commit();
}catch (PDOException $e){
$pdo->rollBack();
echo $e->getMessage();
}
感谢你能够认真阅读完这篇文章,希望小编分享PHP中PDO连接数据库的操作步骤内容对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,遇到问题就找亿速云,详细的解决方法等着你来学习!
亿速云「云数据库 MySQL」免部署即开即用,比自行安装部署数据库高出1倍以上的性能,双节点冗余防止单节点故障,数据自动定期备份随时恢复。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。