PDO(PHP Data Object)数据访问抽象层

1.可以访问其它数据库
2.具有事务功能
3.带有预处理语句功能(防止SQL注入攻击)

 

 

访问数据库

PDO::__construct ( string $dsn [, string $username [, string $password [, array $driver_options ]]] )

$dsn = 'mysql:dbname=testdb;host=127.0.0.1' ;

例:

<?php
//1.造PDO对象
$dsn ="mysql:dbname=mydb;host=localhost";
$pdo = new PDO($dsn,"root","root");
//2.写SQL语句
$sql = "select * from nation";
//3.执行SQL语句
$stm = $pdo->query($sql);
//4.从PDOStatement对象里面读数据
$arr = $stm->fetch(PDO::FETCH_ASSOC);
var_dump($arr);

?>
<?php

$dsn ="mysql:dbname=mydb;host=localhost";
$pdo = new PDO($dsn,"root","root");
$sql = "insert into nation values('002','毛毛')";
$arr = $pdo->exec($sql);
var_dump($arr);

?>

 

 

 

PDOStatement::fetch从结果集中获取下一行

  • PDO::FETCH_ASSOC:返回一个索引为结果集列名的数组

  • PDO::FETCH_BOTH(默认):返回一个索引为结果集列名和以0开始的列号的数组

  • PDO::FETCH_NUM:返回一个索引为以0开始的结果集列号的数组

  • PDO::FETCH_OBJ:返回一个属性名对应结果集列名的匿名对象

 

 

事务功能(在事务里面的内容,要么全部执行,要么都不执行。例如转账,这边扣钱,对方就得收到钱;而不能这边扣钱了,对方没收到钱。)

<?php

    //beginTransaction 启动事务
    //commit 提交事务
    //rollback 回滚
    
    $dsn = "mysql:dbname=mydb;host=localhost";
    $pdo = new PDO($dsn,"root","root");
    
    //将PDO的错误类型设置为异常模式
    $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
    
    try
    {
    //开启事务
    $pdo->beginTransaction();
    
    $sql1 = "insert into nation values('082','数据')";
    $sql2 = "insert into nation values('084','的库')";
    $sql3 = "insert into nation values('083','帅哥')";
    
    $pdo->exec($sql1);
    $pdo->exec($sql2);
    $pdo->exec($sql3);
    
    //提交事务
    $pdo->commit();
    }
    catch(Exception $e)//抓取操作
    {
        //回滚操作
        $pdo->rollBack();
    }
    /*final
    {
        //最终执行,无论有没有异常出现,该代码都会执行
    }*/
      
    
    ?>        

 

 

带有预处理功能

第一种方式(其中的?多了,看的眼花)

<?php

$dsn = "mysql:dbname=mydb;host=localhost";
$pdo = new PDO($dsn,"root","root");

//写一个预处理语句
$sql = "insert into nation values(?,?)";
//将预处理语句扔到服务器等待执行,返回PDOStatement对象
$stm = $pdo->prepare($sql);

//第二次将变量(参数)扔到服务器的SQL语句相应位置,给预处理语句绑定参数
/*$stm->bindParam(1,$code);
$stm->bindParam(2,$name);
$code = "n085";
$name = "天族";
*/

//定义索引数组
$arr = array("n082","数据");

//执行
$stm->execute($arr);
?>

第二种方式(一般采用这种方式)

<?php

$dsn = "mysql:dbname=mydb;host=localhost";
$pdo = new PDO($dsn,"root","root");

//预处理语句
$sql = "insert into nation values(:code,:name)";
$stm = $pdo->prepare($sql);

//绑定参数
/*$stm->bindParam(":code",$code);
$stm->bindParam(":name",$name);
$code = "n070";
$name = "神族";*/

//造一个数组
$arr = array("code"=>"n071","name"=>"胜率");

//执行
$stm->execute($arr);

?>

例:

第一个页面

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
</head>

<body>
<h1>添加数据</h1>
<form action="chuli.php" method="post">
    <div>代号:<input type="text" name="code" /></div>
    <div>名称:<input type="text" name="name" /></div>
    <input type="submit" value="添加" />
</form>
</body>
</html>

第二个页面

<?php

$dsn = "mysql:dbname=mydb;host=localhost";
$pdo = new PDO($dsn,"root","root");

//预处理语句
$sql = "insert into nation values(:code,:name)";
$stm = $pdo->prepare($sql);

//执行
$stm->execute($_POST);

第二个页面中的:值最好与第一个页面的提交过来的name名字一样,这样后面执行的时候就能直接取_POST了

 

posted @ 2017-03-02 11:16  v斌v  阅读(544)  评论(0)    收藏  举报