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()); }