mysql pdo 事务处理_PHP PDO 事务处理 预处理

PDO错误处理三种模式

/*

* 数据库抽象层PDO

* 一个 DSN 由 PDO 驱动名、紧随其后的冒号、以及具体 PDO 驱动的连接语法组成。

* PDO::ERRMODE_SILENT

* PDO::ERRMODE_WARNING

* PDO::ERRMODE_EXCEPTION

*

* PDO中的执行SQL语句的方法

* 1.exec() 用来处理非结果集的 insert update delete create 返回影响行

* 2.query() 用来处理有结果集的 select desc show

*

* 两种都可以

* $pdo->exec('set names utf8');

* $pdo->query('set names utf8');

*

*/

//mysql_connect('localhost','root','root');

// mysql_select_db('test');

$dsn           =     'mysql:dbname=test;host=localhost';

$username =    'root';

$passwd     =    'root';

$options     =    array(

PDO::ATTR_AUTOCOMMIT=>true,

PDO::ATTR_PERSISTENT=>true

);

try{

$pdo =  new PDO($dsn, $username, $passwd, $options);

}catch(PDOException $e){

echo "数据库连接失败:".$e->getMessage();

exit;

}

echo '创建PDO对象成功!';

echo $pdo->getAttribute(PDO::ATTR_CLIENT_VERSION).'
';

echo $pdo->getAttribute(PDO::ATTR_SERVER_VERSION).'
';

echo $pdo->getAttribute(PDO::ATTR_AUTOCOMMIT).'
';

echo $pdo->getAttribute(PDO::ATTR_CASE).'
';

echo $pdo->getAttribute(PDO::ATTR_CONNECTION_STATUS ).'
';

echo $pdo->getAttribute(PDO::ATTR_DRIVER_NAME).'
';

echo $pdo->getAttribute(PDO::ATTR_PERSISTENT).'
';

/*

$query = "delete from helloworld";

$affected_rows =    $pdo->exec($query);

//PDO的错误处理模式(默认不提示,我们可能看不到问题)PDO::ERRMODE_SILENT

if(!$affected_rows){

echo $pdo->errorCode();

echo '
';

echo '

';

print_r($pdo->errorInfo());

echo '

';

}

//警告模式

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);

echo  $pdo->getAttribute(PDO::ATTR_ERRMODE);

*/

//异常模式

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

try{

//使用PDO中的方法执行语句

//插入

$query = "insert into users(username,password,email) values('xiaowang','123','xiaoming@163.com')";

$affected_rows =    $pdo->exec($query);

echo $pdo->lastInsertId();

//查询

$query  =   "select * from users";

$result = $pdo->query($query);

var_dump($result);

}catch (PDOException $e){

echo '错误的原因:'.$e->getMessage();

}

PDO事务处理

/*

* PDO事务处理

*/

$dsn           =     'mysql:dbname=test;host=localhost';

$username =    'root';

$passwd     =    'root';

$options     =    array(

PDO::ATTR_AUTOCOMMIT=>true,

PDO::ATTR_PERSISTENT=>true

);

try{

//创建对象

$pdo =  new PDO($dsn, $username, $passwd, $options);

//设置错误使用异常模式

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

//关闭自动提交(使用事务第一步)

$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, false);

}catch(PDOException $e){

echo "数据库连接失败:".$e->getMessage();

exit;

}

try{

//开启一个事务

$pdo->beginTransaction();

$price = 50;

$statement = "update demo set salary=salary-{$price} where id=1";

$a=$pdo->exec($statement);

if($a>0){

echo '转出成功!';

}else{

throw new PDOException('转出失败!');

}

$statement = "update demo set salary=salary+{$price} where id=3";

$b=$pdo->exec($statement);

if($b>0){

echo '转入成功!';

}else{

throw new PDOException('转入失败!');

}

echo '交易成功!
';

//提交以上的操作

$pdo->commit();

}catch (PDOException $e){

echo '错误的原因:'.$e->getMessage();

echo '交易失败!
';

//撤销所有的操作

$pdo->rollBack();

}

//运行完成后开启自动提交

$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, true);

PDO对预处理语句

/*

* PDO对预处理语句

* 1.效率问题 编译次数

* 2.安全性问题  防止SQL注入     1 or 1='1'

* $query = "delete from demo where id='{$_GET['id']}' ";

*

*

*/

$dsn           =     'mysql:dbname=test;host=localhost';

$username =    'root';

$passwd     =    'root';

$options     =    array(

PDO::ATTR_AUTOCOMMIT=>true,

PDO::ATTR_PERSISTENT=>true

);

try{

//创建对象

$pdo =  new PDO($dsn, $username, $passwd, $options);

//设置错误使用异常模式

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

}catch(PDOException $e){

echo "数据库连接失败:".$e->getMessage();

exit;

}

try{

$statement = "insert into users(username,password,email) values(?,?,?)";// ?表示占位

//直接给数据库管理系统并执行

//$pdo->query($statement);

//给数据库管理系统,编译后等待 没有执行

$pdostatement=$pdo->prepare($statement);

//绑定参数(?) 将问号和一个变量关联起来  对于使用问号占位符的预处理语句,应是以1开始索引的参数位置。

$pdostatement->bindParam(1, $username);

$pdostatement->bindParam(2, $password);

$pdostatement->bindParam(3, $email);

//给变量赋值

$username = 'lisiming1';

$password = '1234';

$email = 'lisiming@163.com';

//PDOStatement::execute — 执行一条预处理语句

$pdostatement->execute();

$username = 'lisiming2';

$password = '1234';

$email = 'lisiming@163.com';

$pdostatement->execute();

}catch (PDOException $e){

echo '错误的原因:'.$e->getMessage();

}

=======================================================================================

/*

* PDO对预处理语句

* 1.效率问题 编译次数

* 2.安全性问题  防止SQL注入     1 or 1='1'

* $query = "delete from demo where id='{$_GET['id']}' ";

*

*

*/

$dsn           =     'mysql:dbname=test;host=localhost';

$username =    'root';

$passwd     =    'root';

$options     =    array(

PDO::ATTR_AUTOCOMMIT=>true,

PDO::ATTR_PERSISTENT=>true

);

try{

//创建对象

$pdo =  new PDO($dsn, $username, $passwd, $options);

//设置错误使用异常模式

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

}catch(PDOException $e){

echo "数据库连接失败:".$e->getMessage();

exit;

}

try{

$statement = "insert into users(username,password,email) values(:username,:password,:email)";// :name 形式的参数名

//直接给数据库管理系统并执行

//$pdo->query($statement);

//给数据库管理系统,编译后等待 没有执行

$pdostatement=$pdo->prepare($statement);

//绑定参数(?) 将问号和一个变量关联起来  对于使用问号占位符的预处理语句,应是以1开始索引的参数位置。

$pdostatement->bindParam(':username', $username,PDO::PARAM_STR);

$pdostatement->bindParam(':password', $password,PDO::PARAM_STR);

$pdostatement->bindParam(':email', $email,PDO::PARAM_STR);

//给变量赋值

$username = 'lisiming3';

$password = '1234';

$email = 'lisiming@163.com';

//PDOStatement::execute — 执行一条预处理语句

$pdostatement->execute();

$username = 'lisiming4';

$password = '1234';

$email = 'lisiming@163.com';

$pdostatement->execute();

}catch (PDOException $e){

echo '错误的原因:'.$e->getMessage();

}

=======================================================================================

$statement = "insert into users(username,password,email) values(?,?,?)";

//给数据库管理系统,编译后等待 没有执行

$pdostatement=$pdo->prepare($statement);

$pdostatement->execute(array('xiaoli','123','xiaoli@163.com'));

=======================================================================================

$statement = "insert into users(username,password,email) values(:username,:password,:email)";

//给数据库管理系统,编译后等待 没有执行

$pdostatement=$pdo->prepare($statement);

$pdostatement->execute(array('username'=>'xiaoli1','password'=>'1123aa','email'=>'xiaoli1@163.com'));

=======================================================================================

/*

* PDO对预处理语句

* 1.效率问题 编译次数

* 2.安全性问题  防止SQL注入     1 or 1='1'

* $query = "delete from demo where id='{$_GET['id']}' ";

* fetch()

* fetchAll()

* setFetchMode()

*

*/

$dsn           =     'mysql:dbname=test;host=localhost';

$username =    'root';

$passwd     =    'root';

$options     =    array(

PDO::ATTR_AUTOCOMMIT=>true,

PDO::ATTR_PERSISTENT=>true

);

try{

//创建对象

$pdo =  new PDO($dsn, $username, $passwd, $options);

//设置错误使用异常模式

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

}catch(PDOException $e){

echo "数据库连接失败:".$e->getMessage();

exit;

}

try{

$statement = "select * from users where id > ? and id < ?";

//给数据库管理系统,编译后等待 没有执行

$pdostatement=$pdo->prepare($statement);

$pdostatement->execute(array(3,6));

//设置结果的模式

$pdostatement->setFetchMode(PDO::FETCH_NUM);

echo '

while(list($id,$username,$password,$email) = $pdostatement->fetch()){

echo '

';

echo '

'.$id.'';

echo '

'.$username.'';

echo '

'.$password.'';

echo '

'.$email.'';

echo '

';

}

echo '

';

}catch (PDOException $e){

echo '错误的原因:'.$e->getMessage();

}

=======================================================================================

//绑定栏目

$pdostatement->bindColumn(1, $id);

$pdostatement->bindColumn(2, $username);

$pdostatement->bindColumn(3, $password);

$pdostatement->bindColumn(4, $email);

=======================================================================================

//绑定栏目

$pdostatement->bindColumn('id', $id);

$pdostatement->bindColumn('username', $username);

$pdostatement->bindColumn('password', $password);

$pdostatement->bindColumn('email', $email);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值