事务操作步骤:创建pdo对象——建立连接——开启pdo事务——进行pdo事务提交/回滚
创建mysql表的sql语句:
```mysql
create table bank(
cardid char(4) primary key comment '卡号',
balance decimal(10,2) not null comment '余额'
)engine=innodb default charset=utf8 comment '银行卡号表' //指明数据库表引擎类型innodb
insert into bank values ('1001',1000),('1002',1)
<?php
$dbms = 'mysql';
$host = "localhost";
$user = "root";
$pass = "123456";
$dbName = "test11";
$dsn = "$dbms:=$host;dbname=$dbName;charset=utf8";
$conn = new PDO($dsn, $user, $pass);
?>
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<?php
if (!empty($_POST)) {
$out = $_POST['card_out'];
$in = $_POST['card_in'];
$money = $_POST['money'];
$conn->beginTransaction();
$flage1 = $conn->exec("update bank set balance = balance - $money where cardid = '$out'");
$flage2 = $conn->exec("update bank set balance = balance + $money where cardid = '$in'");
$stmt = $conn->query("select balance from bank where cardid = '$out'");
$flage3 = $stmt->fetchColumn()>=0?1:0;
if($flage1 && $flage2 && $flage3){
$conn->commit();
echo "转账成功";
}else{
$conn->rollBack();
echo "转账失败";
}
}
?>
<form action="" method="post">
转出卡号: <input type="text" name="card_out" id=""> <br>
转入卡号: <input type="text" name="card_in" id=""> <br>
金额:<input type="text" name="money" id=""> <br>
<input type="submit" value="提交">
</form>
</body>
</html>
PDO预处理,一样用上面创建好的bank表。
<?php
$dsn = 'mysql:dbname=test11;charset=utf8';
$pdo = new PDO($dsn, 'root', '123456');
$result = $pdo->query("select balance from bank where cardid='1001'")->fetchColumn();
var_dump($result);
$stmt = $pdo->prepare("insert into bank values (?,?)");
$stmt->bindParam(1, $cardid);
$stmt->bindParam(2, $balance);
$cardid = '1003';
$balance = 500;
$stmt->execute();
$cardid = '1004';
$balance = 666;
$stmt->execute();
|