zoukankan      html  css  js  c++  java
  • php数据访问:pdo用法、事物回滚功能和放sql注入功能

    PDO:
        一、含义:
            数据访问抽象层
        二、作用
            通过PDO能够访问其它的数据库
        三、 用法:
            1.造对象
                ① $pdo = new PDO($dsn,$username,$passwd)
                ② DSN:数据源名称 , mysql:host=localhost;dbname=mydb;
            2.执行SQL语句
                ① $pdo -> exec(): 用来处理非结果集的,返回影响的行数
                ② $pdo -> query() :用来处理有结果集的语句
        四、预处理
            ①$stmt = $pdo -> prepare(SQL语句) : 将SQL语句放到服务器上等待执行
            ②$stmt -> execute();  :执行准备好的SQL语句
            ③SQL语句中参数用?代替
                Ⅰ.  insert into users(name, pass, age, sex, email) values(?, ?, ?, ?, ?)
                Ⅱ.  $stmt -> bindParam(1, $name); -> 将变量绑定给参数
                Ⅲ.  $name = "admin"; -> 给变量赋值
                Ⅳ.  $stmt -> execute(); ->  执行
                Ⅴ.  $stmt -> execute(array("meizi", '123456', 18, 'nv', 'aa@bb.com'));  -> 简单方法(推荐)
            ④SQL语句中参数用字符串代替
                Ⅰ.  insert into users(name, pass, age, sex, email) values(:name, :pass, :age, :sex, :email)
                Ⅱ.  $stmt -> bindParam("name", $name, PDO::PARAM_STR); -> 将变量绑定给参数
                Ⅲ.  $name = "admin"; -> 给变量赋值
                Ⅳ.  $stmt -> execute(); ->  执行
                Ⅴ.  $stmt -> execute(array("name"=>"feng", "pass"=>"abc123#", "age"=>28, "sex"=>"nan", "email"=>"aaa@bbb.com"));  -> 简单方法(推荐)

    <body>
    <?php


    //1.造对象、执行sql语句
    $dsn = "mysql:dbname=text_zuoye;host=localhost";
    $pdo = new PDO($dsn,"root","2786802");
    $sql = " update nation set name ='兽族' where code ='n004'";
    $attr = $pdo->exec($sql);//可以执行增删改


    //2.事物功能
    $dsn = "mysql:dbname=text_zuoye;host=localhost";
    $pdo = new PDO($dsn,"root","2786802");

    //设置异常模式:作用是如果出现错误,不出现错误信息,抛个异常出来
    $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

    //写sql语句
    $sqla = "insert into nation values('n005','人族')";
    $sqlb = "insert into nation values('n006','精灵族')";

    //执行sql语句:试着执行两条语句,如发现异常,抓住,不交给php,人为处理
    try
    {
        $pdo->exec($sqla);
        $pdo->exec($sqlb);
    }
    catch(PDOException $e)//抓住异常之后,自己出一个信息,如果返回一个异常,catch抓住之后,异常保存在变量$e里面,通过$e调用一个方法:$e->getMessage()来获取错误信息,如果错误,可以echo"友好信息"
    {
        $e->getMessage();
    }
    /*final//无论try里面的信息是否出错,都要执行final里面的内容
    {
    }*/


    //如何启动事物
    try
    {
        $pdo->beginTransaction();//启动事物(开始)
        
        $pdo->exec($sqla);//中间所有代码都是事物
        $pdo->exec($sqlb);
        
        $pdo->commit();//提交事务,如果发现有错,抛异常(结束)
    }
    catch(PDOException $e)
    {
        $pdo->rollBack();//如果有错误,执行回滚,两条语句同时执行,如果$sqla执行成功,且加入数据库,但是$sqlb不成功的话,catch抓住,执行回滚操作,加上的$sqla删除,可以让程序更加安全
        //$e->getMessage();//如果没有错误,执行此语句
    }
    ?>


    <?php
    //3.防止注入功能,分两次给数据例如:第一次给$sql='select *from nation where code = ''',第二次给'n001'
    $dsn = "masql:dbname=text_zuoye;host=localhost";
    $pdo = new PDO($dsn,"root","2786802");

    //?占住位置,学名是预处理语句
    $sql = " insert into nation values(?,?)";

    //准备sql语句,返回一个statement对象
    $st = $pdo->prepare($sql);


    //绑定参数方法一:
    $st->bindParam(1,$code);//1是索引,$code是一个变量名
    $st->bindParam(2,$name);

    //给变量赋值,在绑定参数上边或者下边赋值都行
    $code="n007";
    $name = "矮人族";

    //提交执行,不用给sql语句,已经传过去了,布尔型,成功true,失败false
    $st->execute();


    //绑定参数方法二:
    $attr = array("n007","矮人族");
    $st->execute($attr);

    //预处理语句里面用?占位的,给数组的时候要给索引数组,给的数据顺序要对应起来


    //name占住位置,学名是预处理语句
    $sql = " insert into nation values(:code,:name)";

    //准备执行
    $st = $pdo->exec($sql);

    //绑定参数 方法一:
    $st->bindParam(":code",$code,PDO::PARAM_STR);//指定¥code必须为字符串
    $st->bindParam(":name",$name,PDO::PARAM_STR);

    $code = "n009";
    $name = "狼族";

    //执行
    $st->execute();

    //绑定参数 方法二:
    $attr = array("code"=>"noo9","name"=>"虫族");

    //PDO查询:

    $sql = "select * from nation ";
    $st = $pdo->prepare($sql);
    $st->execute();
    var_dump($st->fetchAll());

    $st->fetch();//返回一个关联加索引的数组
    $st->fetchAll()//返回一个关联加索引的数组
    ?>
    </body>

  • 相关阅读:
    学习过程
    一个链表中包含环,请找出该链表的环的入口结点
    归并排序-递归实现
    31、求整数范围中1的个数
    冒泡排序
    常用的端口对应的协议
    数值的整数次方
    二分查找(折半查找)
    用两个队列模拟栈的弹出和输入
    Java源码-HashMap(jdk1.8)
  • 原文地址:https://www.cnblogs.com/cuizhenyu/p/6041570.html
Copyright © 2011-2022 走看看