zoukankan      html  css  js  c++  java
  • 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了

  • 相关阅读:
    软件工程之旅开始啦
    c# async,await, 委托函数
    mysql 访问不是本地数据库,给用户刷新了权限没有作用
    c# WndProc事件 消息类型
    sql not in 优化问题
    c# dataGridView 表头格式设置不管用
    sql 更新多条记录
    mysql 插多行数据
    win7 64bit+vs2010 操作注册表
    bat脚本命令
  • 原文地址:https://www.cnblogs.com/gaobint/p/6489577.html
Copyright © 2011-2022 走看看