数据库抽象层PDO

来源:互联网 发布:app程序员招聘要求 编辑:程序博客网 时间:2024/05/04 22:39

前言:

PDO扩展类库为PHP访问数据库定义了一个轻量级,一致性的接口,它提供了一个数据库访问抽象层,无论你是用什么数据库,都可以通过一致的函数执行查询和获取数据,大大简化了数据库的操作,并能屏蔽不同数据库之间的差异。使用PDO可以很方便地进行跨数据库程序的开发,以及不同数据库间的移植,是将来PHP在数据库处理方面主要的发展房方向。

<?php
/*-------------PDO开启(Linux下安装自行百度)------*/
/*在windows下PHP5.1版本中,PDO主要同数据库驱动同PHP一起作为扩展发布,要激活他们只需要简单的编辑
php.ini文件*/
extension = php_pdo.dll                       //所有pdo驱动程序共享的扩展

extension = php_pdo_mysql,dll   //使用mysql数据库

//设置持久连接数组作为一个参数,可以一起设置多个元素

$opt = array(PDO:::ATTR_PERSISTENT=>true);
$dsn = "mysql:dbname=localhost;host=127.0.0.1;charset=utf-8;";
$user = "root";
$pwd = "";
try{
$dbn = new PDO($dsn,$user,$pwd,$opt);
}catch(PDOException $e){
echo '数据库连接失败:'.$e->getMessage();
}

//--------------------------------使用PDO对象-------------------------------------------------

$dbn ->getAttribute(PDO::ATTR_PERSISTENT);
echo "是否关闭自动提交功能".$dbn ->getAttribute(PDO::ATTR_AUTOCOMMIT);


$dbn ->setAttribute(PDO::ARRT_ERRMODE,PDO::ERRMODE_EXCEPTION); //设置抛出异常处理错误


/*PDO处理PHP程序和数据库之间的数据类型转换*/
$dbn ->setAttribute(PDO::ATTR_ORACLE_NULLS,true); //在获取空字符串时候会自动转换为NULL默认情况属性false


/*--------------------------------使用pdo执行SQL语句--------------------------*/

//------------------------- PDO::exec() 返回受影响的行数 注意!此方法不能用在SELECT语句!!!!--------------
$query = "UPDATE tables SET phone='11111' WHERE name='高晓晴'";
$affected = $dbn ->exec($query);
if($affected)
{
echo '数据表受影响的行数为'.$affected;
}else{
print_r($dbn->errorInfo());
}


//------------------------PDO::query()方法  如果方法成功执行,返回一个PDOStatement对象-------------------

$query = "SELECT * FROM ....."
try {
$pdostatement = $bn->query($query);
echo '一共从表中获取到'.$pdostatement->rowCount().''条记录;
foreach ($pdostatement  => $row) 
{
echo $row['name'];
echo $row['phone'];
}
} catch (PDOException $e) {
echo $e->getMessage();
}


//------------------PDO::quote()   过滤一些特殊字符,防止能引起SQL注入的方法----------------------------

$query ="SELECT * FROM users WHERE login=".$dbn->quote($_POST['login'])."";


//-----------------PDO::prepare()方法和PDOStatement()::execute()方法--------

/*-----------------说明-----------------------------------
当一个查询需要多次执行时(有时需要迭代传入不同的值)使用预处理语句效率会更高,
使用预处理语句就需要使用PDO::prepare()方法准备一个要执行的查询,再使用PDOStatement
对象中的execute()方法执行,它可以将整个SQL命令向数据库服务器发送一次,以后只有参数,
发生变化,数据库服务器只对命令做一次分析就够了,即编译一次,可以多次执行。会在服务器
上缓存查询语句和执行过程,而只在服务器端和客户端之间传输有变化的列值,以此来消除额外
销,不仅大大减少了需要传输的数据量,还提高了命令的处理效率。可以有效的防止SQL注入,在
执行单个查询的时候快于query()/exex()方法.
*/

//了解PDOStatement对象

/*该类的对象不是通过NEW关键字实例化出来的,而是通过PDO对象的prepare方法,在数据库服务器
准备好一个预处理语句后直接返回的,之前通过PDO对象的query()方法返回的PDOStatement类对象
只是一个结果集,而后者则是一个查询对象,能定义执行参数化的SQL命令。下面介绍一些常用的方法:
*/

//准备语句

/*占位符。对于一个准备好的SQL语句,如果在每次执行时都需要改变一些列值,必须使用占位符。或者
只要有需要变量作为值的地方就是用占位符代替,准备好一个没有传值的SQL语句,在数据库服务器区缓
存等待处理,然后在单独赋给展位富豪具体的值,在通知这个准备好的预处理语句执行。在PDO中支持两种
占位符的语法:'命名参数'和'问号参数'看个人喜好*/
//使用命名参数
$dbn ->prepare("INSERT INTO caontactinfo(name,address,phone)VALUES(:name,:address,:phone)");
//使用问号参数
$dbn ->prepare("INSERT INTO caontactinfo(name,address,phone)VALUES(?,?,?  )");

//绑定参数

/*通过PDOStatement对象中的bindParame()方法*/
$name = '张三';
$address = 'xxxxx';
$phone = '123456';


//使用命名参数
$stmt = $dbn->prepare($query);
$stmt ->bindParam(':name',$name);
$stmt ->bindParam(':address',$address);
$stmt ->bindParam(':phone',$phone);


//使用问号参数
$stmt ->bindParam(1,$name,PDO::PARAM_STR);
$stmt ->bindParam(2,$address,PDO::PARAM_STR);
//将变量的值绑定到第三个问号,第三个参数显示当前被绑定的参数设置数据类型,第四个参数指定数据类型的
长度 第三第四第五都是可选项
$stmt ->bindParam(3,$phone,PDO::PARAM_STR,20); 


//执行准备好的查询,

/*反复执行在数据库缓存区准备好的语句*/
$stmt ->execute();


//便捷传参执行查询操作

//命名参数
$stmt ->execute(array(":name"=>"李四",":address"=>"南山区",":phone"=>"1111")); //第一次使用关联数
$stmt ->execute(array(":name"=>"王五",":address"=>"东城区",":phone"=>"2222")); //第二次
//问号参数
$stmt ->execute(array("王五","还山区","3333"));     //使用索引数组,每个值对应一个问号
stmt ->execute(array("刘能","嘎嘎区","444"));


$stmt ->lastInsertId();


/*-----------------------------获取数据-----------------------------------*/

//fetch():将结果集当前行的记录以某种方式返回,并将结果集指针移至下一行,到达结尾false
/*
*第一个参数(可选)
*PDO::FETCH_ASSOC   从结果集中获取一个以列名为索引的关联数组
*PDO::FETCH_NUM     获取一个以列在行中的数值偏移为索引的值数组
*PDO::FETCH_BOTH    默认包含上面两种数组
*PDO::FETCH_OBJ     获得对象
*PDO::FETCH_BOUND   返回TRUE,并将获取到的列值付给在bindParam()中指定的的变量
*PDO::FETCH_LAZY    创建关联数组和索引数组,以及包含列属性的一个对象,可任选一种
*第二个参数(可选)
用来确定当对象是一个可滚动的游标时应当获取哪一行
*第三个参数(可选)
需要提供一个整值,表示要获取的行相对于当前游标位置的偏移
*/


while (list($name,$address,$phone)=$stmt->fetch(PDO::FETCH_NUM)) {
echo $name;
}
//fetchAll()  和上面了类似,但是只要调用一次就可以获取结果集中所有的行,并付给一个二维数组
$allRows = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($allRows as  $row) {
echo $row['name']
;}
//以下是在fetchAll()方法总使用两个特别参数的实例
$stmt ->execute();
$row = $stmt->fetchAll(PDO::FETCH_COLUMN,1);   //从结果中获取第二列所有值
echo '所有联系人的名字';
print_r($row);
//注意 !fetchAll()方法很方便,但是处理特别大的结果集时,会给数据库服务器资源和网络带宽带来压力


//setFetchMode() 
/*上面的两个方法默认都用了PDO::FETCH_BOTH多次使用这两个方法时每次调用都需要设置新的模式来改变默认的模式,使用setFetchMode()方法在脚本页面的顶部设置一次,以后所有的fetchAll(),fetch方法的调用都将生成响应的引用的结果集,减少了调用fetch()方法的参数录入*/


?>
0 0
原创粉丝点击