1 <html> 2 <body> 3 <?php 4 #数据库连接 5 $dbtype = 'mysql'; 6 $host = 'localhost'; 7 $db = 'test'; 8 $user = 'root'; 9 $psw = 'china0913'; 10 11 $dsn = $dbtype . ':host=' . $host . ';' . 'dbname=' . $db; 12 13 try { 14 $dbh = new PDO($dsn, $user, $psw, array(PDO::ATTR_PERSISTENT=>true)); 15 echo '连接成功<br>'; 16 } catch(Exception $e) { 17 die('Connect Failed Message: ' . $e->getMessage()); 18 } 19 20 #使用query函数查询 21 $sql = 'SELECT * FROM user'; 22 $query = $dbh->query($sql); 23 $query->setFetchMode(PDO::FETCH_ASSOC); //设置结果集返回格式,此处为关联数组,即不包含index下标 24 $rs = $query->fetchAll(); 25 var_dump($rs); 26 27 #使用exec函数进行INSERT,UPDATE,DELETE,结果返回受影响的行数 28 $sql = 'INSERT INTO user (`userName`, `userPassword`, `userAge`) SELECT (MAX(userId) + 1), \'123456\', 18 FROM user'; //插入一行用户数据,其中userName使用userId最大值+1 29 // $rs = $dbh->exec($sql); 30 // var_dump($rs) . '<br>'; 31 32 #使用prepareStatement进行CURD 33 $sql = 'SELECT * FROM user WHERE userId = ?'; 34 $stmt = $dbh->prepare($sql); 35 $stmt->bindParam(1, $userId); //绑定第一个参数值 36 $userId = 1; 37 38 $stmt->execute(); 39 $stmt->setFetchMode(PDO::FETCH_ASSOC); 40 $rs = $stmt->fetchAll(); 41 var_dump($rs); 42 43 #使用事务 44 try { 45 $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //设置错误模式,发生错误时抛出异常 46 $dbh->beginTransaction(); 47 $sql1 = 'SELECT bookNum FROM book WHERE bookId = ? FOR UPDATE'; //此处加上行锁,可以对bookNum做一些判断,bookNum>1,才做下一步更新操作 48 $sql2 = 'UPDATE book SET bookNum=bookNum-1 WHERE bookId = ?'; //加上行锁后,如果user1在买书,并且user1的买书过程没有结束,user2就不能执行SELECT查询书籍数量的操作,这样就保证了不会出现只有1本书,却两个人同时买的状况 49 $stmt1 = $dbh->prepare($sql1); 50 $stmt2 = $dbh->prepare($sql2); 51 $stmt1->bindParam(1, $userId); 52 $stmt2->bindParam(1, $userId); 53 $userId = 1; 54 $stmt1->execute(); 55 $stmt2->execute(); 56 $dbh->commit(); 57 } catch(Exception $e) { 58 $dbh->rollBack(); 59 die('Transaction Error Message: ' . $e->getMessage()); 60 } 61 ?> 62 </body> 63 </html>