PHP操作MySQL有三种方式:
- MySQL:非永久连接,性能比较低,PHP5.5之后被废弃
- MySQLi:永久连接,减轻服务器压力,只支持MySQL
- PDO:能够实现MySQLi的常用功能,支持大部分数据库
MySQLi面向过程方式操作数据库
1.面向过程方式连接数据库
1 |
$connect = mysqli_connect('host','username','password','database'); |
2.执行SQL语句
1 |
$result = mysqli_query($connect, $sql); |
3.获取结果集
1 |
mysqli_fetch_all($result); |
MySQLi面向对象的方式操作数据库
1.面向对象的方式连接数据库
1 |
$mysqli = new mysqli('host','username','password','database'); |
2.执行SQL语句
1 |
$sql -> query($sql); |
3.获取结果集
1 |
$result -> fetch_all() |
EXAMPLE 1:mysqli面向对象的增、删、改操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php $mysqli = new mysqli('localhost','root','root','test'); $mysqli->query('set names utf8'); // var_dump($mysqli); //添加数据 $result = $mysqli->query("INSERT INTO users(name,money) VALUE ('张三',10)"); $result = $mysqli->query("INSERT INTO users(name,money) VALUE ('李四',200)"); //修改数据 $result = $mysqli->query("UPDATE users SET money=money+10 WHERE id = 2"); //删除数据 $result = $mysqli->query("DELETE FROM users WHERE id=4"); var_dump($result); |
note:
- 执行的返回值result只是说语句执行了没有,而不是执行成功没有,只要语法没有错误就可以执行并返回true,比如说要删除id=4的情况,数据表中并没有id=4的这一项,但是这个sql语句语法并没有错,因此就会执行成功,所以说需要判断执行语句以后影响的行数才能够判断是否真的执行成功了。
EXAMPLE 2:mysqli面向对象的查操作
1 2 3 4 5 6 7 8 |
<?php header("content-type:text/html;charset=utf-8"); $mysqli = new mysqli('localhost','root','root','test'); $mysqli->query('set names utf8'); $result = $mysqli->query("SELECT * FROM users"); $data = $result->fetch_all(MYSQLI_ASSOC); var_dump($data); |
执行结果:
note:
- 一般情况下我们希望取到的是关联数组,使用MYSQLI_ASSOC参数传入
- 在页面中加入header(“content-type:text/html;charset=utf-8”);可以防止乱码的情况
- 使用$mysqli->query(‘set names utf8’); 可以设置字符集,如果创建的时候忘记了的话可以在这里设置。
MySQLi事务控制:
事务就是将多个逻辑工作组合成一个执行单元的数据库操作失败(一起成功一起失败),适用的场景比如说要转一笔账,只有收款方收到了钱给钱的人的账户才会扣钱,这两个操作应该是一步完成的而不能部分操作,否则可能会一钱转过去了但是没有扣除。
1.开启事务(实际上是关闭了自动提交)
1 |
$mysqli -> autocommit(false); |
2.事务回滚
1 |
$mysql -> rollback(); |
3.事务提交
1 |
$mysqli -> commit(); |
EXAMPLE 3 事务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php header('content-type:text/html;charset=utf-8'); $mysqli = new mysqli('localhost','root','','test'); $mysqli->query('set names utf8'); $mysqli->autocommit(false); //开启事务 $sql1 = "UPDATE users SET money=money-10 where id=1"; $sql2 = "UPDATE users SET money=money+10 where id=20"; $mysqli->query($sql1); $r1 = $mysqli->affected_rows; $mysqli->query($sql2); $r2 = $mysqli->affected_rows; if($r1>0 && $r2>0){ $mysqli->commit(); //事务提交 echo '操作成功'; }else{ $mysqli->rollback(); //事务回滚 echo '操作失败'; } |
事务控制的基本思路:
- 把自动提交关掉
- 在执行了sql语句后(因为自动提交关闭了所以执行不会影响数据库),得到影响的行数$mysqli->affected_rows;
- 如果每个sql执行后的行数都大于0的话就代表代表都可以执行成功,然后就提交全部一口气全部执行了。
- 如果有sql执行后的函数为0代表不能执行成功,因此就不能执行该事务,因此要回滚取消刚才的sql
MySQLi预处理(增、删、改)
预处理是先提交SQL语句到服务端,执行预编译,客户端执行SQL语句时,只需上传输入参数即可,如果涉及多次读取和存储,效率高于普通SQL操作。
1.暂时不赋值,用?代替
1 |
$sql = "???" |
2.创建预编译对象
1 |
$mysqli -> prepare($sql); |
3.参数赋值(绑定参数)
1 |
$stmt -> bind_param() |
需要写参数的类型:
- string – s
- int – i
- double – d
- bool – b
4.执行代码
1 |
$stmt -> execute() |
EXAMPLE 4 MySQLi预处理(增删改)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php header('content-type:text/html;charset=utf-8'); $mysqli = new mysqli('localhost','root','','test'); $mysqli->query('set names utf8'); $sql = "INSERT INTO users(name,money) VALUE(?,?)";//暂时不赋值使用?代替 $stmt = $mysqli->prepare($sql);//创建预编译对象 $name = "王小小"; $money = 500; $stmt->bind_param('si',$name,$money);//绑定参数 $result = $stmt->execute();//执行代码 var_dump($result); $name = "王大大"; $money = 600; $stmt->bind_param('si',$name,$money); $result = $stmt->execute(); var_dump($result); |
note:
- 预处理分为四步:写出sql语句但不赋值 -> 创建预编译对象 -> 绑定参数 -> 执行代码
- result返回的是是否执行成功true或flase
MySQLi预处理(查)
1.暂时不赋值,用?代替
1 |
$sql = "???" |
2.创建预编译对象
1 |
$mysqli -> prepare($sql); |
3.参数赋值(绑定参数)
1 |
$stmt -> bind_param() |
4.绑定结果集
1 |
$stmt -> bind_result() |
5.执行代码
1 |
$stmt -> execute() |
6.取出结果集
1 |
$stmt -> fetch() |
EXAMPLE 5 MySQLi预处理(查)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php header('content-type:text/html;charset=utf-8'); $mysqli = new mysqli('localhost','root','','test'); $mysqli->query('set names utf8'); $sql = "SELECT * FROM users WHERE id>?"; $stmt = $mysqli->prepare($sql); $id=1; $stmt->bind_param('i',$id); $stmt->bind_result($id,$name,$money); $stmt->execute(); while($stmt->fetch()){ $data[] = [ 'id'=>$id, 'name'=>$name, 'money'=>$money ]; } var_dump($data); |
note:
- 查的不同之处在于需要绑定结果集并把结果集取出来,为了方便需要把结果一个个的取出来放在一个数组里面,这样取出来的就和MYSQLI_ASSOC一样了。