• PHP PDO 基础(常用)


    连接数据库:

    #建立链接
    define('DSN','mysql:dbname=C2C;host=localhost;port=3306');
    define('MYSQL_USERNAME','root');
    define('MYSQL_PWD','root');
    try {
            $DB=new PDO(DSN,MYSQL_USERNAME,MYSQL_PWD,array(PDO::ATTR_PERSISTENT => true));
    } catch (Throwable $th) {
            var_dump($th->getLine());
    }
    
    如果需要数据库长连接,需要最后加一个参数:array(PDO::ATTR_PERSISTENT => true);
     
    执行SQL语句:
    $DB::query(); #用于有记录结果的返回操作 如SELECT;
    $DB::exec(); #用于没有结果集的返回操作 如INSERT UPDATE等操作;  
    exec()返回值是受影响的行数;
     
    获取结果:
    PDOStatement::fetch(); 获取一条记录;
    PDOStatement::fetchAll();获取全部的记录集;
    #返回关联数组
    fetch(PDO::FETCH_ASSOC);
    fetchAll(PDO::FETCH_ASSOC);
    

     PDO设置属性 (设置PDO在处理数据的过程中采用什么方式去处理)

    PDO::setAttribute:设置属性 
    PDO::getAttribute:获取属性
    
     
    PDO事务控制
    $DB->beginTransaction();#开启事务;
    $DB->rollback();#事务回滚;
    $DB->commit()#事务提交
    $DB->setAttribute(PDO::ATTR_AUTOCOMMIT,1);#自动提交
    
    PDO预处理
    $sql='???';#暂时不赋值,用问号或者:name代替
    $DB->prepare($sql);#创建预编译对象;
    $DB->prepare($sql)->bind_param();#参数赋值
    $DB->execute();#执行代码;
    

    案例:

    通过PDO去数据库获取指定的数据:

    try{
            $sql="SELECT id,username FROM cf_member where id>89096 AND id<90000";  
            $data=$DB->query($sql);
            #$data=$data->fetch(PDO::FETCH_ASSOC);
            $data=$data->fetchAll(PDO::FETCH_ASSOC);
            var_dump($data);
    
    } catch (Throwable $th){
            var_dump($th->getMessage());
    }

    通过PDO对数据库的内容进行修改:

    try {
            $sql='UPDATE cf_member SET money_1=100 WHERE id=89096';
            $res=$DB->exec($sql);
            var_dump($res); #exec返回值是被影响的数据行数;如果没有修改到任何数据应该返回0
    } catch (Throwable $th) {
            var_dump($th->getMessage());
    }

    PDO事务控制:

    在开启mysql事务后系统会关闭自动提交 在SQL语句执行完后需要打开自动提交
    try{
            #模拟转账操作
            $sql='UPDATE cf_member SET money_1=money_1-100 WHERE id=89096';
          #id99999并不存在所以会执行在if判断中会抛出错误 触发事务必回滚
    #$sql2='UPDATE cf_member SET money_1=money_1+100 WHERE id=999999';
            $sql2='UPDATE cf_member SET money_1=money_1+100 WHERE id=89108';
            #开启mysql事务
            $DB->beginTransaction(); #开启事务
            if( $DB->exec($sql)>0 &&$DB->exec($sql2)>0){
                    $DB->commit(); #提交事务
                    $DB->setAttribute(PDO::ATTR_AUTOCOMMIT,1); #自动提交
                    echo '转账成功';
            }else{
                    throw new Exception('出现错误');
            }
            
    } catch(Throwable $th){
            #捕获到一次回滚事务
            echo '触发回滚事物<br>';
            var_dump($th->getMessage());
            $DB->rollback(); #回滚事务
    }
    PDO数据预处理 PDO预处理可以有效的防止SQL注入:
    try {
           $id=$_GET['id']??89096; #php7写法
           $num=$_GET['num']??1000;
           if(is_numeric($id)&&is_numeric($num)){
                   $sql='UPDATE cf_member set money_1=money_1+:num WHERE id=:id';
                    $stmt=$DB->prepare($sql);
                    // $stmt->bindParam(':num',$num);
                    // $stmt->bindParam(':id',$id);
                    // $res=$stmt->execute();   #使用bindParam挨个绑定参数的方法
                    $res=$stmt->execute([':id'=>$id,':num'=>$num]); #可以在execute中传入一个和值绑定的数组进行sql查询
                    var_dump($res);
           }else{
                   throw new Exception("GET数据非数值类型", 1);
           }
    } catch (Throwable $th) {
            var_dump($th->getMessage());
    }
    使用数组执行一条含有 IN 子句的预处理语法
     
    #PDO预处理不支持绑定数组 使用in语句进行查询需要把使用implode函数把数组转换成字符串
    try {
            #方法1:
            $array=['89096','89108','89220'];
            #同时对三个ID进行数据操作
            $in=implode(',', array_fill(0, count($array), '?'));
            $sql="UPDATE cf_member SET money_1=100 WHERE id IN ($in)";
            #预处理语句
            $res=$DB->prepare($sql);
            $res=$res->execute($array);
            var_dump($res);
    
            #方法2 不用绑定
            $ids = array(2344, 5523, 9332);
            // 过滤ids略
            $in = implode(',',$ids); 
            $st = $pdo->prepare('SELECT * FROM table_name WHERE id IN ('.$in.')');
            $st->execute();
    
    } catch (Throwable $th) {
            var_dump($th->getMessage());
    }
  • 相关阅读:
    自动化测试
    django
    Linux软件推荐
    deepin升级20.1(2021.3)
    struts_自定义日期类型转换器
    struts_01
    JAVA面向对象思想
    springmvc 文件上传
    ajax+struts2 实现省份-城市-地区三级联动
    mybatis——分页插件
  • 原文地址:https://www.cnblogs.com/LiChen-789/p/10162612.html
Copyright © 2020-2023  润新知