PDO Method.php
来源:原创
时间:2016-07-23
作者:脚本小站
分类:代码笔记
<?php
/**
PDO针对不同到的数据库服务器使用特定的驱动程序访问,
即对外接口相同,内部驱动不同。
在windows下安装PDO:
使用哪种数据库只要在\php5\ext目录下放入扩展文件和对
应驱动程序文件,然后在php.ini文件中开启对相应的扩展
与驱动的支持即可。以下是针对mysql数据库的安装步骤。
1.安装扩展文件:\php5\ext\php_pdo.dll,安装此扩展
可使用PDO Function函数库。
2.安装PDO mySql的驱动:\php5\ext\php_pdo_mysql.dll
3.在php.ini文件的680行附近指定扩展文件与驱动文件。
4.重新启动服务器。
PDO中包含三个预定义的类:
PDO:和数据库连接有关(连接,执行sql语句)
PDOStatement:PDO预处理类(准备语句,处理结果集)
PDOException:异常类
很多常量
*/
//=============================================================
//------------PDO类方法:(数据库连接,执行语句)----------------
PDO //创建PDO对象
beginTransaction()*//开始事务
commit()* //提交事务
rollBack()* //回滚一个事务
errorCode()* //从数据库返回一个错误代号,如果有的话
errorInfo()* //从数据库返回一个含有错误信息的数组,如果有的话
exec()* //执行一条SQL语句并返回影响的行数
query()* //执行一条SQL语句并返回一个结果集
prepare()* //为执行准备一条SQL语句
lastInsertId()* //返回最新插入到数据库的行(的ID)
quote() //返回添加了引号的字符串,以使其可用于SQL语句中
getAttribute()* //取得数据库连接属性
//设置属性
setAttribute()* //传两个参数,第一个为PDO对象特定的属性名,第二个参数是这个属性名的值
PDO::ATTR_AUTOCOMMIT //是否自动提交 true为开启
PDO::ATTR_CASE //强制大小写转换
PDO::ATTR_CLIENT_VERSION //获得客户端版本
PDO::ATTR_CONNECTION_STATUS //数据库连接状态信息
PDO::ATTR_DRIVER_NAME //获取驱动名
PDO::ATTR_ERRMODE //设置错误模式
PDO::ATTR_ORACLE_NULLS //空字符串转换为Sql的空
PDO::ATTR_PERSISTENT //设置持久连接
PDO::ATTR_PREFETCH //提前获取数据的大小
PDO::ATTR_SERVER_INFO //获取服务器信息
PDO::ATTR_SERVER_VERSION //获取服务器版本
PDO::ATTR_TIMEOUT //设置超时之前等待的秒数
//=============================================================
//-----------------------连接数据库---------------------------
/*PDO连接数据库的方式与普通连接数据库的扩展有所不同。
首先要创建PDO对象:
$PDO = new PDO($dsn(数据源),"root","320723");
dsn:(data source name)数据源。
数据源:连接哪种数据库的驱动,即主机位置,库名。
连接不同数据库使用不同的驱动,查看手册中的PDO Drivers
连接mysql的数据源格式:
$dsn = mysql:host=localhost;dbname=film;port=3306;
mysql:mysql的驱动
host = 主机
dbname = 库名
port = 端口
可将dsn放入文件:如在hello.txt文件中写入mysql:host=localh
ost;dbname=film;port=3306;在参数中:new PDO("uri:filename"
,"","");也可将文件放入远程。
也可以将dsn放入配置文件:在配置文件中加入子区域[PDO],然
后在子区域下加入pod.dsn.mysqlpdo = mysql:localhost;dbname=
film;port=3306;,在参数中的写法是new PDO("mysqlpdo","","");
其中mysqlpdo为自定义名。
*/
//---------------------------------------------------------*
//----------------------常用连接方法----------------------
try{
$arr = array(PDO::ATTR_PERSISTENT=>true);
$dsn = "mysql:host=localhost;dbname=film;port=3306";
$pdo=new PDO($dsn,"root","320723",$arr);
//设置错误模式,在sql语句执行错误时可抛出异常
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
}catch(PDOException $e){
echo $e->getMessage();
exit;
}
try{
$dsn = "mysql:host=localhost;dbname=lamp85";
//array('3'=>'1')错误设置,1为警告级别
$pdo = new PDO($dsn,'root','',array('3'=>'1'));
}catch(PDOException $e){
echo $e->getMessage();
}
//---------------------------------------------------------
//--------------------设置连接数据库属性------------------
/*在new PDO("","","","array())第四个参数中的数组是对PDO底
层驱动的一些设置。调优的参数和设置属性的参数相似*/
$arr = array(PDO::ATTR_AUTOCOMMIT=>0,PDO::ATTR_PERSISTENT=>true);
PDO::ATTR_AUTOCOMMIT=>0 //关闭自动提交
PDO::ATTR_PERSISTENT=>true //建立持久连接
/*若在连接数据库时没有设置属性,连接之后也可通过setAttr
ibute()来设置属性*/
$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT,1);
$pdo->setAttribute(3,1);
PDO::ATTR_ERRMODE; //3
PDO::ERRMODE_SILENT; //0
PDO::ERRMODE_WARNING; //1
PDO::ERRMODE_EXCEPTION; //2
//========================错误处理=============================
//--------------------------------------------------------------
/*
在PDO中错误模式有三种,1.默认模式:ERRMODE_SILENT,2.警
告模式:ERRMODE_WARNING,3.异常模式 ERRMODE_EXCEPTION。
一般在执行PDO语句时,默认不提示错误信息,即为模式一,可
以用errorCode()与errorInfo()两个方法获取错误代码与错误信
息。通过setAttribute(,)可设置错误模式,第一个参数为PDO::
ATTR_ERRMODE即错误模式,第二个参数为要设置的三种错误模式
之一,也可以用0、1、2对应代替三种模式。在三种模式中,常
用的是第三种错误模式,即异常模式;在使用异常模式时将代
码写在try catch中出现错误可调用PDO中的getMessage()方法来
抛出异常。*/
//----------------------------------------------------------
//------------错误模式1:默认模式ERRMODE_SILENT-------------
//模式一情况下try catch 抛不出异常,不建议使用
$row=$pdo->exec($sql);
if(!$row){
echo $pdo->errorCode();//错误代码
print_r($pdo->errorInfo());//错误信息
}else{
echo "执行成功";
}
//---------------------------------------------------------
//------------错误模式2:警告模式 ERRMODE_WARNING----------
/*模式二情况下try catch 抛不出异常,在模式二中errorCode
errorInfo方法同样可以使用*/
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
//---------------------------------------------------------
//---------错误模式3:异常模式 ERRMODE_EXCEPTION-----------*
/*使用ERRMODE_EXCEPTION错误模式时,将PDO代码写在try catch
中,在出现错误时调用PDO中的getMessage()方法可以抛出异常*/
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
try{
$pdo->exec($sql);
}catch(PDOException $e){
$e->getMessage();
}
//==============================================================
//---------------------执行Sql语句(不推荐)---------------------
/*执行SQL语句exec() query() prepare()
query() 执行有结果集的语句(select)
exec() 执行有影响行数的语句(update,delete,insert)
*/
//----------------------------------------------------------
//-------------------------exec-----------------------------
try{
$sql = "insert into film() values()";
$pdo->exec($sql);
echo "last ID: ".$pdo->lastInsertId();//获取最后插入的id
}catch(PDOException $e){
echo $e->getMessage();
}
//----------------------------------------------------------
//--------------------------query---------------------------
try{
$stmt=$pdo->query("select * from film");
foreach($stmt as $row){
print_r($row);
echo "<br>";
}
}catch(PDOException $e){
echo $e->getMessage();
}
//=============================================================
//-----------------PDOStatement预处理类方法-------------------
bindColumn //绑定一个PHP变量到结果集中的输出列
bindParam* //绑定一个PHP变量到一个预处理语句中的参数
bindValue //绑定一个值到与处理语句中的参数
closeCursor //关闭游标,使语句可以再次执行
errorCode* //返回一个错误代号
errorInfo* //返回一个包含错误信息的数组
getAttribute //返回一个 PDOStatement 属性
setAttribute //设置一个PDOStatement属性
getColumnMeta //返回结果集中某一列的结构(metadata?)
nextRowset //返回下一结果集
setFetchMode //为 PDOStatement 设定获取数据的方式
//结果集中使用的方法
execute //执行一条预处理语句
fetch //从结果集中取出一行
fetchAll //从结构集中取出一个包含了所有行的数组
fetchColumn //返回结果集中某一列中的数据
rowCount //返回SQL语句执行后影响的行数,select,update,delete
columnCount //返回结果集中的列的数量
//==================使用预处理方法执行语句====================
//--------------------------------------------------------------
/*
使用预处理的优点在于,它将要执行的语句集中一起执行,提
高效率。使用prepare()方法预处理语句,返回预处理对象。
预处理方法执行语句流程:
方式一:
1.prepare() 准备语句并返回对象
2.bindparam() 绑定参数并给参数赋值
3.execute() 执行语句
方式二:
1.prepare() 准备语句并返回对象
2.execute(array()) 绑定数组参数并执行语句
*/
//----------------------------------------------------------
//---------------------1.名字参数方式----------------------
//准备一条语句
$stmt=$pdo->prepare("insert into film(title,content)values(:title,:content)");
//绑定参数
$stmt->bindparam(":title",$title,PDO::PARAM_STR);//第三个参数是数据类型,可不填
$stmt->bindparam(":content",$content);
//给变量赋值
$title="title";
$content="content";
//执行语句
if($stmt->execute()){
echo "执行成功";
echo "lsat Id: ".$pdo->lastInsertId();//获取最后的id
}else{
echo "执行失败";
}
//---------------------------------------------------------
//---------------------2.?参数方式------------------------
//准备一条语句
$stmt=$pdo->prepare("insert into film(title,content)values( ?,?)");
//绑定参数
$stmt->bindparam(2,$content);
$stmt->bindparam(1,$title);
//给变量赋值
$title="title";
$content="content";
//执行语句
if($stmt->execute()){
echo "执行成功";
echo "lsat Id: ".$pdo->lastInsertId();//获取最后的id
}else{
echo "执行失败";
}
//======================绑定并执行的方法=======================
//------------------------1.名字参数方法-----------------------
//准备一条语句
$stmt=$pdo->prepare("update film set title=:title,content=:content where id=:id" );
//用数组的方法绑定传值并执行
$stmt->execute(array("title"=>"title","content"=>"content","id"=>306));
$stmt->execute(array("title"=>"title2","content"=>"content","id"=>305));
//----------------------------------------------------------*
//--------------------------2.?参数方法---------------------
$stmt=$pdo->prepare("update film set title=?,content=? where id=?" );
//用数组的方法绑定传值并执行
$stmt->execute(array("title","content",306));
$stmt->execute(array("title2","content",305));
//=======================查询数据方法==========================
//-----------------------fetch逐条获取-------------------------*
//准备一条语句
$stmt=$pdo->prepare("select id,title,addtime from film where id>:id");
//绑定并执行一条语句,此步没有就不写
$stmt->execute(array(":id"=>300));
/*fetch()方法默认返回关联数组和索引数组,括号中的参数
定义了返回形式,参数有:PDO::FETCH_NUM以索引形式返回,
PDO::FETCH_ASSOC以关联形式返回,也可以通过setFetchMode
()来设置获取模式,参数同上,只需设置一次即可。每执行
一次fetch获取一条结果集*/
$row=$stmt->fetch(PDO::FETCH_ASSOC);
print_r($row);
//或者使用循环方式来获取结果集
while($row=$stmt->fetch()){
print_r($row);
}
//---------------------------------------------------------
//------------------fetchAll一次获取全部结果集------------
//设置获取模式
$stmt->setFetchMode(PDO::FETCH_ASSOC);
//以二维数组的方式获取全部数据
$data=$stmt->fetchAll();
print_r($data);
//---------------------------------------------------------*
//-----------------绑定列方式获取结果集bindColumn---------
$stmt=$pdo->prepare("select id,title,addtime from film where id>:id");
//执行语句execute放在绑定前或后都可以
$stmt->execute(array(":id"=>300));
//将列名与值绑定 效果同 list()=array()
$stmt->bindColumn("id",$id);
$stmt->bindColumn("title",$title);
$stmt->bindColumn("addtime",$addtime);
//每循环一次就将对应的值赋给对应的变量,此方法只有fetch可以使用
while($stmt->fetch()){
echo "----$id----$title----$addtime----<br>";
}
//---------------------------------------------------------
//---------------获取某一列中的值fetchColumn--------------
$stmt=$pdo->prepare("select id,title,addtime from film where id>:id");
$stmt->execute(array(":id"=>300));
/*获取某一列,括号中的参数为某一列 0表示查询中的第一列
即id列,每次获取一个*/
while($col=$stmt->fetchColumn(0)){
echo $col ."<br>";
}
//---------------------------------------------------------
//---------------获取记录的总行数与总列数----------------
$stmt=$pdo->prepare("select id,title,addtime from film where id>:id");
$stmt->execute(array(":id"=>300));
//输出总行数
echo $stmt->rowCount()."<br>";
//输出总列数
echo $stmt->columnCount() ."<br>";
//----------------------------------------------------------
//------------用getColumnMeta获取表信息中的列名-----------
$stmt=$pdo->prepare("select id,title,addtime from film where id>:id");
$stmt->execute(array(":id"=>300));
//次循环控制列数
for($i=0;$i<$stmt->columnCount();$i++){
//取得列信息中的列名
$field=$stmt->getColumnMeta($i);
echo $field["name"]."-----";
}
//====================PDO中的事务处理==========================
//--------------------------------------------------------------
//事物处理简单示例
$pdo->beginTransaction();
$num = 2000;
$sql = "update user set money=money-{$num} where id=2";
$rows = $pdo->exec($sql);
$sql = "update user set money=money+{$num} where id=1";
$rows += $pdo->exec($sql);
if($row == 2){
$pdo->commit();
}else{
$pdo->rollBack();
}
//--------------------------------------------------------------
//--------------------------------------------------------------
/*事物处理用于转账等问题的处理,必须是InnoDB表类型,type
=InnoDB 必须设置主键primary key */
$pdo->beginTransaction() //开始事务
$pdo->commit() //方法标明回滚结束点
$pdo->rollBack() //执行回滚
//预处理实例
try {
$dbh = new PDO("mysql:host=localhost;dbname=test", "root","");
$dbh->query('set names utf8;');
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//或在此关闭自动提交
$dbh->setAttribute(PDO::ATTR_AUTOCOMMIT,false);
//开始事务
$dbh->beginTransaction();
$dbh->exec("INSERT INTO 'test'.'table' ('name' ,'age')VALUES ('mick', 22);");
$dbh->exec("INSERT INTO 'test'.'table' ('name' ,'age')VALUES ('lily', 29);");
$dbh->exec("INSERT INTO 'test'.'table' ('name' ,'age')VALUES ('susan', 21);");
$dbh->commit();
//开启自动提交
$dbh->setAttribute(PDO::ATTR_AUTOCOMMIT,true);
} catch (PDOException $e) {
$dbh->rollBack(); //回滚
echo "Failed:" . $e->getMessage();
}
//=============================================================
//-----------------PDOException异常类--------------------------
class PDOException extends Exception{
// 对应 PDO::errorInfo()
// 或 PDOStatement::errorInfo()
public $errorInfo = null;
// 文本化的错误信息
// 使用Exception::getMessage() 获取它
protected $message;
// SQLSTATE 错误代号
// 使用Exception::getCode() 获取它
protected $code;
}
//=============================================================
//--------------------PDO驱动对应的数据库---------------------
/*
PDO_DBLIB FreeTDS / Microsoft SQL Server / Sybase
PDO_FIREBIRD Firebird/Interbase 6
PDO_MYSQL MySQL 3.x/4.x
PDO_OCI Oracle Call Interface
PDO_ODBC ODBC v3 (IBM DB2, unixODBC and win32 ODBC)
PDO_PGSQL PostgreSQL
PDO_SQLITE SQLite 3 and SQLite 2 */
//=============================================================
//-------------------------------------------------------------
PDO::ATTR_AUTOCOMMIT
/*在设置成true的时候,PDO会自动尝试停止接受委托,开
始执行*/
PDO::ATTR_PREFETCH
/*设置应用程序提前获取的数据大小,并非所有的数据库
哦度支持*/
PDO::ATTR_TIMEOUT
/*设置连接数据库超时的值*/
PDO::ATTR_ERRMODE
/*设置Error处理的模式*/
PDO::ATTR_SERVER_VERSION
/*只读属性,表示PDO连接的服务器端数据库版本*/
PDO::ATTR_CLIENT_VERSION
/*只读属性,表示PDO连接的客户端PDO驱动版本*/
PDO::ATTR_SERVER_INFO
/*只读属性,表示PDO连接的服务器的meta信息*/
PDO::ATTR_CONNECTION_STATUS
PDO::ATTR_CASE
/*通过PDO::CASE_*中的内容对列的形式进行操作*/
PDO::ATTR_CURSOR_NAME
/*获取或者设定指针的名称*/
PDO::ATTR_CURSOR
/*设置指针的类型,PDO现在支持PDO::CURSOR_FWDONLY和
PDO::CURSOR_FWDONLY*/
PDO::ATTR_DRIVER_NAME
/*返回使用的PDO驱动的名称*/
PDO::ATTR_ORACLE_NULLS
/*将返回的空字符串转换为SQL的NULL
PDO::ATTR_PERSISTENT
/*获取一个存在的连接*/
PDO::ATTR_STATEMENT_CLASS
PDO::ATTR_FETCH_CATALOG_NAMES
/*在返回的结果集中,使用自定义目录名称来代替字段名。*/
PDO::ATTR_FETCH_TABLE_NAMES
/*在返回的结果集中,使用自定义表格名称来代替字段名。*/
PDO::ATTR_STRINGIFY_FETCHES
PDO::ATTR_MAX_COLUMN_LEN
PDO::ATTR_DEFAULT_FETCH_MODE
/*Available since PHP 5.2.0*/
PDO::ATTR_EMULATE_PREPARES
/*Available since PHP 5.1.3.*/
//数据类型
PDO::PARAM_BOOL
//表示一个布尔类型
PDO::PARAM_NULL
//表示一个SQL中的NULL类型
PDO::PARAM_INT
//表示一个SQL中的INTEGER类型
PDO::PARAM_STR
//表示一个SQL中的SQL CHAR,VARCHAR类型
PDO::PARAM_LOB
/*表示一个SQL中的large object类型*/
PDO::PARAM_STMT
//表示一个SQL中的recordset类型,还没有被支持
PDO::PARAM_INPUT_OUTPUT
/*Specifies that the parameter is an INOUT parameter
for a stored procedure.You must bitwise-OR this
value with an explicit PDO::PARAM_*data type.*/
PDO::PARAM_EVT_ALLOC
//Allocation event
PDO::PARAM_EVT_FREE
//Deallocation event
PDO::PARAM_EVT_EXEC_PRE
//Event triggered prior to execution of a prepared statement.
PDO::PARAM_EVT_EXEC_POST
//Event triggered subsequent to execution of a prepared statement.
PDO::PARAM_EVT_FETCH_PRE
//Event triggered prior to fetching a result from a resultset.
PDO::PARAM_EVT_FETCH_POST
//Event triggered subsequent to fetching a result from a resultset.
PDO::PARAM_EVT_NORMALIZE
/*Event triggered during bound parameter
registration allowing the driver to normalize
the parameter name*/
//调优的参数和设置属性的参数相似
PDO::FETCH_LAZY
//将每一行结果作为一个对象返回
PDO::FETCH_ASSOC
//仅仅返回以键值作为下标的查询的结果集,名称相同的数据只返回一个
PDO::FETCH_NAMED
//仅仅返回以键值作为下标的查询的结果集,名称相同的数据以数组形式返回
PDO::FETCH_NUM
//仅仅返回以数字作为下标的查询的结果集
PDO::FETCH_BOTH
//同时返回以键值和数字作为下标的查询的结果集
PDO::FETCH_OBJ
//以对象的形式返回结果集
PDO::FETCH_BOUND
/*将PDOStatement::bindParam()和PDOStatement::
bindColumn()所绑定的值作为变量名赋值后返回*/
PDO::FETCH_COLUMN
//表示仅仅返回结果集中的某一列
PDO::FETCH_CLASS
//表示以类的形式返回结果集
PDO::FETCH_INTO
//表示将数据合并入一个存在的类中进行返回
PDO::FETCH_FUNC
PDO::FETCH_GROUP
PDO::FETCH_UNIQUE
PDO::FETCH_KEY_PAIR
//以首个键值下表,后面数字下表的形式返回结果集
PDO::FETCH_CLASSTYPE
PDO::FETCH_SERIALIZE
//表示将数据合并入一个存在的类中并序列化返回
PDO::FETCH_PROPS_LATE
//Available since PHP 5.2.0
PDO::FETCH_ORI_NEXT
//获取结果集中的下一行数据,仅在有指针功能时有效
PDO::FETCH_ORI_PRIOR
//获取结果集中的上一行数据,仅在有指针功能时有效
PDO::FETCH_ORI_FIRST
//获取结果集中的第一行数据,仅在有指针功能时有效
PDO::FETCH_ORI_LAST
//获取结果集中的最后一行数据,仅在有指针功能时有效
PDO::FETCH_ORI_ABS
//获取结果集中的某一行数据,仅在有指针功能时有效
PDO::FETCH_ORI_REL
//获取结果集中当前行后某行的数据,仅在有指针功能时有效
PDO::ERRMODE_SILENT
//发生错误时不汇报任何的错误信息,是默认值
PDO::ERRMODE_WARNING
//发生错误时发出一条php的E_WARNING的信息
PDO::ERRMODE_EXCEPTION
//发生错误时抛出一个PDOException
PDO::ERR_NONE (string)
//设定没有错误时候的错误信息
PDO::CASE_NATURAL
//回复列的默认显示格式
PDO::CASE_LOWER
//强制列的名字小写
PDO::CASE_UPPER
//强制列的名字大写
PDO::NULL_NATURAL
PDO::NULL_EMPTY_STRING
PDO::NULL_TO_STRING
PDO::CURSOR_FWDONLY
//建立一个只能向后的指针操作对象
PDO::CURSOR_SCROLL
//建立一个指针操作对象,传递PDO::FETCH_ORI_*中的内容来控制结果集
//=============================================================
//-------------------------------------------------------------