php pdo 预处理删除,PHP PDO扩展整理,包括环境配置\基本增删改查\事务\预处理

介绍

PDO是一种PHP程序连接数据库的接口,通过PDO可以将PHP程序与数据库联系起来.

优点:

1.可移植性,可以支持各种主流数据库服务,而且实现代码几乎都是相同的,使用PDO在代码层面上不需要太多操作就可以把一个程序的后台数据库从mysql移植到oracle上

2,支持事务和预处理等高级操作,能够有效的防止sql注入

环境配置

必须在PHP5.0及以上配置文件中开启PDO相关的数据库扩展

比如想要使用PDO连接mysql数据库,就必须打开PDO_mysql扩展

就在php.ini中找到extension-php_pdo_mysql.dll,把这一行前面的分号去掉

然后使用phpinfo函数查看,如过显示如下图的内容,表示成功开启:

6e558bafd742d1ee532b9c577145f2fa.png

基本流程

首先要创建一个PDO对象,数据库连接的方法就封装在PDO类的构造函数中.实例化PDO类,传入相应的参数,就可以实现数据库的连接:

$pdoObj =new PDO("mysql:host=localhost;dbname=test",'root','root');

PDO类有三个必要的参数,分别是:数据库驱动 登录名 密码

不同类型数据库驱动会有差别,mysql的驱动格式为:  mysql:host=主机名;dbname=数据库名

$pdoObj ->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

建议开启数据库的异常模式

只有开启了异常模式,才能使用try catch语句才会正常捕获PDOException定义的异常:

$pdoObj ->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

dml操作实例,给雷小军涨薪100块:

<?phptry {$pdoObj =new PDO("mysql:host=localhost;dbname=test;charset=utf-8",'root','root');$pdoObj ->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

}catch(PDOException $p){echo '数据库连接失败'.$p->getMessage();

}try{

$affect_rows=$pdoObj->exec("update `class` set salary=salary+100 where sname='雷小军'");echo "影响{$affect_rows}行";}catch(PDOException $e){echo "错误:".$e->getMessage();

}

查询操作实例,查询class表中的所有数据 :

<?phptry {$pdoObj =new PDO("mysql:host=localhost;dbname=test;charset=utf8",'root','root');$pdoObj ->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

}catch(PDOException $p){echo '数据库连接失败'.$p->getMessage();

}try{$query=$pdoObj->query("select* from class");while($val=$query->fetch(PDO::FETCH_ASSOC)){echo "

";var_dump($val);

}

}catch(PDOException $e){echo "错误:".$e->getMessage();

}

执行查询语句之后,需要使用fetch()函数获取查询的结果集,fetch函数的参数代表获取结果集的类型:

PDO::FETCH_ASSOC:代表获取以关联数组的形式获取结果集

PDO::FETCH_NUM:代表索引数组结果集

如果不填代表索引数组和关联数组都获取到

事务

某程序要实现借款功能,Sheldon借给Penny100块钱,必须将Sheldon的存款减100,把Penny的存款加100,这两个操作要么都成功,要么都失败,这时就要用到事务:

首先需要关闭sql语句自动提交功能,并且开启事务:

$pdoObj->setAttribute(PDO::ATTR_AUTOCOMMIT,0);

$pdoObj->beginTransaction();

然后执行两个update语句,如果成功,提交修改,如果失败,就回滚:

$affect_rows['borrow']=$pdoObj->exec("update `class` set salary=salary-{$many} where sname='谢尔顿李库伯'");$affect_rows['get']=$pdoObj->exec("update `class` set salary=salary+{$many} where sname='佩妮'");if ($affect_rows['borrow']&&$affect_rows['get']){$pdoObj->commit();

}

else {$pdoObj->commit();

}

脚本执行结束后需要开启自动提交功能:

$pdoObj->setAttributeZ(PDO::ATTR_AUTOCOMMED,1);

<?phptry {$pdoObj =new PDO("mysql:host=localhost;dbname=test",'root','root');$pdoObj ->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);//关闭自动提交

$pdoObj->setAttribute(PDO::ATTR_AUTOCOMMIT,0);

}catch(PDOException $p){echo '数据库连接失败'.$p->getMessage();

}try{//开启事务

$pdoObj->beginTransaction();

$many =100;$affect_rows=array('borrow'=>0,'get'=>0);$affect_rows['borrow']=$pdoObj->exec("update `class` set salary=salary-{$many} where sname='谢尔顿李库伯'");$affect_rows['get']=$pdoObj->exec("update `class` set salary=salary+{$many} where sname='佩妮'");if ($affect_rows['borrow']&&$affect_rows['get']){$pdoObj->commit();

}

}catch(PDOException $e){echo "错误:".$e->getMessage().'
';$pdoObj->rollBack();echo '转账失败';

}//事务操作完成之后开启自动提交

$pdoObj->setAttribute(PDO::ATTR_AUTOCOMMIT,1);

预处理

预处理操作采用预编译的方式,大大提高了程序的执行效率,还能防止sql注入:

步骤:

1.将要执行的sql语句写在prepare函数里,缺少的参数使用?填充

$stmt = $pdoObj->prepare("insert into `class` values(?,?,?,?,?)");

2.bindParam函数绑定变量

$stmt->bindParam(1,$id);$stmt->bindParam(2,$sname);$stmt->bindParam(3,$gender);$stmt->bindParam(4,$company);$stmt->bindParam(5,$salary);

3.传入变量并执行

$id=31;$sname='吕布';$gender='男';$company='群雄';$salary=10000;$fanbu=1000;$stmt->execute();

当需要执行多组sql语句时,只需要将步骤3复制多组,并且修改参数值即可

完整实例如下:

<?phptry {$pdoObj =new PDO("mysql:host=localhost;dbname=test",'root','root');$pdoObj ->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

}catch(PDOException $p){echo '数据库连接失败'.$p->getMessage();

}try{//关联数组的形式

$stmt = $pdoObj->prepare("insert into `class` values(:id,:sname,:gender,:company,:salary)");$stmt->bindParam("id",$id);$stmt->bindParam("sname",$sname);$stmt->bindParam("gender",$gender);$stmt->bindParam("company",$company);$stmt->bindParam("salary",$salary);$stmt->bindParam("fanbu",$fanbu);$id=31;$sname='吕布';$gender='男';$company='群雄';$salary=10000;$stmt->execute();$id=32;$sname='马超';$gender='男';$company='蜀汉';$salary=10000;$stmt->execute();$id=33;$sname='典韦';$gender='男';$company='群雄';$salary=10000;$stmt->execute();

}catch(PDOException $e){echo "错误:".$e->getMessage().'
';$pdoObj->rollBack();echo '转账失败';

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值