PHP PDO 基础(常用)

摘要:
89096;# Php7写入方法$num=$_ GET['num']??

连接数据库:

#建立链接
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());
}

免责声明:文章转载自《PHP PDO 基础(常用)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Vue-cli入门(一)——项目搭建Protocol buffers--python 实践 简介以及安装与使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

自学PHP 环境搭建

自学PHP之环境搭建 一、.首先 安装 phpStudy2013.exe 程序集成包 安装完可能端口被占用 需要手动设置 然后打开http://localhost:8080/phpMyAdmin/ 默认用户名root 密码root 二、 搭建thinkphp框架 先去http://www.thinkphp.cn下载核心包或者完整包 1. 在根...

MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架

MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。 二、mybatis快速...

Asp.net mvc与PHP的Session共享的实现

最近在做的一个ASP.NET MVC的项目,要用到第三方的php系统,为了实现两个系统的互联互通。决定将两者的session打通共享。让asp.net mvc 和php 都能正常访问和修改Session内容。 在决定实现之前,先搜索了一下院子里有没有相类似的文章,对于跨语言的程序互通,有两种方案: (1) SSO单点登录,其实就是把用户名和密码传给另一个系...

sql语句创建文件夹、判断文件夹、创建数据库、表、

代码 USEmaster;GOifexists(select*fromsys.databaseswherename='TestDB')dropdatabaseTestDB--创建文件夹EXECsp_configure'showadvancedoptions',1GORECONFIGUREGOEXECsp_configure'xp_cmdshell',1R...

现代 PHP 新特性系列(四) —— 生成器的创建和使用

1、概述      生成器是 PHP 5.5 引入的新特性,但是目测很少人用到它,其实这是个非常有用的功能。      生成器和迭代器有点类似,但是与标准的PHP迭代器不同,PHP生成器不要求类实现Iterator接口,从而减轻了类的开销和负担。生成器会根据需求每次计算并产出需要迭代的值,这对应用的性能有很大的影响:试想假如标准的PHP迭代器经常在内存中执...

(PHP)redis String(字符串)操作

/** * * String操作 * 字符串操作 * */ //设置键值:成功返回true,否则返回false,键值不存在则新建,否则覆盖 $redis->set('string', 'hello world!'); //从左往右第五个字符开始替换为另一指定字符串,成功返回替换后新字符串的长度。 $redis->setRan...