使用PDO之前首先开启PHP的PDO扩展,方法见百度。

PDO连接数据库的方式有三种

1.通过参数的形式连接数据库 (推荐)

//通过参数形式连接数据库
try{
$dsn = 'mysql:host=localhost;dbname=test';
$username = 'root';
$passwd = '';
$options = array(PDO::ATTR_PERSISTENT=>TRUE); //设置属性[可选参数]
$pdo = new PDO($dsn, $username, $passwd, $options);
var_dump($pdo);
}catch(PDOException $e){
echo $e->getMessage();
}

2.通过URI的形式连接数据库

3.通过配置文件的形式连接数据库

首先在配置文件php.ini添加一行 pdo.dsn.test="mysql:localhost;dbname=test"   //test是自定义的数据源名称

$dsn  = 'test';  //配置文件中数据源名称
$username = 'root';
$passwd = '';
$pdo = new PDO($dsn, $username, $passwd);

PDO常用操作

exec()   执行一条sql语句,并返回受影响的行数(只对写数据操作有效,如增删改)

$sql =<<<EOF
insert into user2 values(1);
EOF;
$result = $pdo->exec($sql);

lastInsertId()   得到最后的自增的ID号

errorCode()      返回上一次操作的错误码

errorInfo()       返回上一次操作的错误信息

query()           执行查询SQL语句,返回关联+索引的二维数组,但是该方法也可以执行写数据库的SQL,只是不能返回受影响的行数。

prepare()        预处理

execute()        执行一条预处理命令

fetch()            从结果集里获取一行数据

fetchAll()        获取结果集里面的所有数据

   $sql =<<<EOF
select * from user;
EOF;
$pre = $pdo->prepare($sql);
$info = $pre->execute(); while($row = $pre->fetch(PDO::FETCH_BOTH)){
var_dump($row);
echo "<br/>";
}
$result = $pre->fetchAll(PDO::FETCH_ASSOC);

getAttribute()  获取属性

setAttribute()  设置属性

rowCount()     返回查询的行数或者受影响的行数

nextRowset()   将指针移动到下一个结果集

防止SQL注入攻击

quote方法在字符串前面自动加上单引号并转义特殊符号

$pass = "' or 1 = 1 #";
$pass = $pdo->quote($pass);

//return   '\' or 1 = 1 #'

预处理语句中的占位符使用

第一种占位符是 :的形式

$sql = " SELECT * FROM user WHERE id = :id AND name = :name ";
$pre = $pdo->prepare($sql);
$pre->execute(array(':id'=> , ':name'=>'b'));
$rsult = $pre->rowCount(); //返回查询的行数

第二种占位符是?的形式

$sql = " SELECT * FROM user WHERE id = ? AND name = ? ";
$pre = $pdo->prepare($sql);
$pre->execute(array( , 'b'));
$rsult = $pre->rowCount(); //返回查询的行数

bindParam()方法绑定参数

:变量占位符方式
$sql = " INSERT INTO user(id, name) VALUES (:id, :name)";
$pre = $pdo->prepare($sql);
$pre->bindParam(':id', $id, PDO::PARAM_STR); //绑定参数
$pre->bindParam(':name', $name, PDO::PARAM_STR); //绑定参数
$id = ;
$name = 'cj';
$pre->execute();
?占位符方式
$sql = " INSERT INTO user(id, name) VALUES (?, ?)";
$pre = $pdo->prepare($sql);
$pre->bindParam(, $id, PDO::PARAM_STR); //绑定参数
$pre->bindParam(, $name, PDO::PARAM_STR); //绑定参数
$id = ;
$name = 'cj';
$pre->execute();

bindValue() 绑定参数【跟bindParam大同小异】

设置PDO三种错误处理模式

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT); //默认模式,静默模式
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); //警告模式
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //异常模式,推荐使用

PDO事务处理

事务是把很多SQL语句放在一起执行,如果某条出错,可以回滚到最初始的状态,这样可以保证流程的完整。

//关闭自动提交
setAttribute(PDO::ATTR_AUTOCOMMIT, 0);

rollBack();  //失败就回滚

commit();  //提交

inTransaction();   //检查是否在事务中

//关闭自动提交
$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, );
//开启事务
$pdo->beginTransaction();
$sql1 = 'INSERT INTO user VALUES (13, "transaction")';
$action1 = $pdo->exec($sql1);
if($action1 == ){
echo '插入10失败';
$pdo->rollBack(); //失败就回滚
}
$sql2 = 'INSERT INTO user VALUES (10, "transaction")';
$action2 = $pdo->exec($sql2);
if($action2 == ){
echo '插入11失败';
$pdo->rollBack(); //失败就回滚
}
//检查是否在事务中
$position = $pdo->inTransaction();
$pdo->commit(); //提交

 

PDO基础知识的更多相关文章

  1. PDO 基础知识

    PDO: 一.含义: 数据访问抽象层 二.作用 :通过PDO能够访问其它的数据库 三. 用法: 1.造对象 ①$dsn="mysql:dbname=zz(数据库名);host=localho ...

  2. MySQL_基础知识

    -----基础知识 1.什么是数据库?     数据库(Database)是按照数据结构来组织.存储和管理数据的仓库   2.什么是关系型数据库.主键,外键,索引分别是什么?        关系型数据 ...

  3. .NET面试题系列[1] - .NET框架基础知识(1)

    很明显,CLS是CTS的一个子集,而且是最小的子集. - 张子阳 .NET框架基础知识(1) 参考资料: http://www.tracefact.net/CLR-and-Framework/DotN ...

  4. RabbitMQ基础知识

    RabbitMQ基础知识 一.背景 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然 ...

  5. Java基础知识(壹)

    写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...

  6. selenium自动化基础知识

    什么是自动化测试? 自动化测试分为:功能自动化和性能自动化 功能自动化即使用计算机通过编码的方式来替代手工测试,完成一些重复性比较高的测试,解放测试人员的测试压力.同时,如果系统有不份模块更改后,只要 ...

  7. [SQL] SQL 基础知识梳理(一)- 数据库与 SQL

    SQL 基础知识梳理(一)- 数据库与 SQL [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5902856.html 目录 What's 数据库 ...

  8. [SQL] SQL 基础知识梳理(二) - 查询基础

    SQL 基础知识梳理(二) - 查询基础 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5904824.html 序 这是<SQL 基础知识梳理( ...

  9. [SQL] SQL 基础知识梳理(三) - 聚合和排序

    SQL 基础知识梳理(三) - 聚合和排序 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5926689.html 序 这是<SQL 基础知识梳理 ...

随机推荐

  1. line-height下的dispay:inline-block垂直居中

    html: <div class="search fl"> <span class="search-box"> <input ty ...

  2. web api简单验证实现办法

    需要使用WEBAPI,但是有验证问题没解决.后来参考网上文章做了一下DEMO 思路: 就是根据用户的账号在服务端加密一个字符串,然后返回给用户端. 具体: 一个用户编号用于唯一身份识别,密码,一个密钥 ...

  3. 前端jquery实现点击图片弹出大图层(且滚动鼠标滑轮图片缩放)

    <img src="{$vo.photo}" height="50px" onclick="showdiv({$i});"> & ...

  4. Jasper_passValue_return value from the subreport to main report

    create a variable In subreport  say returnValue variable class type --> whatever u want calculati ...

  5. js各种进制数之间的转换

    计算机中常用的进制数有二进制.八进制.十进制.十六进制 一.十进制 to 其他 var x = 10; // 或定义其他值均可 x.toString(n); // n 代表要转换到的进制,比如n可以为 ...

  6. 图铭Android平台银行卡号识别系统

    随着智能终端(智能手机及平板电脑)及移动通信(3G)的发展,原来运行在PC上的信息系统(如邮件系统.即时通信.网页浏览.协同办公.网络购物.社交网站.博客等)逐渐转移到智能终端设备上.可以预见未来几年 ...

  7. VBoxManage.exe: error: Resize hard disk operation for this format is not implemented yet!

    VirtualBox虚拟磁盘空间不够了,默认10G.想扩大,图形界面下没有找到可操作菜单.Google了一下用 Vbox自带的命令工具VBoxManage即可解决. C:\Program Files\ ...

  8. JVM virtual memory

    This has been a long-standing complaint with Java, but it's largely meaningless, and usually based o ...

  9. ANSIC程序到KeilC51的移植心得

    摘要:本文讲述了将ANSIC程序移植到KeilC51上应该注意的事项.文章讲述了存储类型.指针类型.重入函数.根据目标系统RAM的分布的段定位和仿真栈设置.函数指针.NULL指针问题.字节顺序.交叉汇 ...

  10. 模拟IIC总线汇编程序软件包

    一.概述 为了非常方便地对 I2C 从器件进行快速的.正确的读写操作,我们为此而设计出虚拟 I2C 总线操作平台软件包.本软件包是主方式下的虚拟 I2C 总线软件包,只要用户给子程序提供几个主要的参数 ...