PHP-MySQL 函数库是 PHP 操作 MySQL 资料库最原始的扩展库,PHP-MySQLi 的 i 代表 Improvement ,相当于前者的增强版,也包含了相对进阶的功能,另外本身也增加了安全性,比如可以大幅度减少 SQL 注入等问题的发生。
开启扩展
mysqli 扩展默认并不会开启,为此我们需要找到 php.ini 文件,并且需要确认删除了 [PHP_MYSQLI] 部分中的 extension=php_mysqli.dll 行首的注释符号 ;(分号)。
检验是否开启成功的几种方式
#1 通过 PHPInfo()函数
phpinfo();
#2 通过extension_loaded() 函数检测
var_dump(extension_loaded('mysqli'));
#3 通过 (function_exists()检测函数是否存在
var_dump(function_exists('mysqli_connect'));
#4 通过get_loaded_extensions() 函数得到当前已经开启的扩展
print_r(get_loaded_extensions());
连接数据库
连接并选择 mysql 数据库的几种方式:
#1 建立到MySQL数据的连接并选择数据库
$mysqli=new mysqli('localhost','root','root');
$mysqli->select_db('test');
#2 实例化mysqli对象之后实现连接
$mysqli=new mysqli();
$mysqli->connect('127.0.0.1','root','root');
#3 建立连接的同时打开指定数据库(常用)
$mysqli=@new mysqli('localhost','root','root','test');
#4 检测是否连接成功
if ($mysqli->connect_errno) {
die("数据库连接失败,错误信息:".$mysqli->connect_error);
}
$mysqli->connect_errno:得到连接产生的错误编号 ,$mysqli->connect_error:得到连接产生的错误信息
设置编码格式及获取基本信息
#1 通过函数设置
$mysqli->set_charset('utf8');
#2 通过查询设置
$mysqli->query("set names utf8")
# 获取当前字符集
echo $mysqli->character_set_name()."<br>";
# 获取客户端信息
echo $mysqli->get_client_info()."<br>";
# 获取mysql主机信息
echo $mysqli->host_info."<br>";
# 获取服务器信息
echo $mysqli->server_info."<br>";
# 获取服务器版本
echo $mysqli->server_version."<br>";
CURD之新增
#1 编写 SQL 语句:
$sql="INSERT user(username,password) VALUES ('queen1','queen1'),('queen2','queen2')";
#2 使用query方法查询
$res = $mysqli->query($sql);
#3 查询成功可利用 insert_id 属性得到上一插入操作产生的AUTO_INCREMENT的值
echo '恭喜您注册成功,您是网站第'.$mysqli->insert_id.'位用户<br/>';
#4 查询失败可利用 errno(错误编号)及error(错误信息)进行提示:
echo 'ERROR '.$mysqli->errno.':'.$mysqli->error;
CURD之修改
#1 同样编写 SQL 语句:
$sql="UPDATE user SET age = age + 10";
#2 使用query方法查询
$res=$mysqli->query($sql);
#3 可利用 affected_rows 属性查询受影响数目
echo $mysqli->affected_rows.'条记录被更新';
#4 查询失败可利用 errno(错误编号)及error(错误信息)进行提示:
echo 'ERROR '.$mysqli->errno.':'.$mysqli->error;
CURD之删除
#1 编写 SQL 语句
$sql="DELETE FROM user WHERE id<=6";
#2 使用query方法查询
$res=$mysqli->query($sql);
注意:上面增删改查询返回结果均为 bool 类型,且均可使用 affected_rows 属性查看受影响条数,其返回值有三种情况: 受影响的记录条数 、SQL语句有问题则返回 -1,没有受影响记录的条数则返回 0
CURD之查询
#1 编写 SQL 语句
$sql="SELECT id,username,age FROM user";
#2 使用query方法查询
$mysqli_result = $mysqli->query($sql);
查询成功返回 mysqli_result 类,查询失败返回 FALSE,我们可以根据 mysqli_result 类提供几种的方法获取数据;
#3.1 使用 fetch_all() 方法获取结果集中的全部记录,默认放回的是索引格式的二维数组;
$rows = $mysqli_result->fetch_all(MYSQLI_BOTH);
通过参数改变其返回值的类型:MYSQLI_NUM(索引)、MYSQLI_ASSOC(关联)、MYSQLI_BOTH(两者)
#3.2 使用 fetch_array() 方法返回结果集中第一条数据,并且没执行一次该方法,数组指针下移一位,如果后面没有数据则返回NULL,所以利用此特性使用循环同样能实现获取全部数据
while($row = $mysqli_result->fetch_array()){
$rows[]=$row;
}
# 使用 fetch_assoc() 方法或者 fetch_row() 方法可以获得与 fetch_array()方法同样的效果,也就说是
fetch_array(MYSQLI_ASSOC) === fetch_assoc();
fetch_array(MYSQLI_NUM) === fetch_row();
#4 查询结束之后,需要释放结果集
$mysqli_result->free();
#5 关闭数据库
$mysqli->close();
多语句查询 - 针对 增、删、改
PHP 实现对 MySQL 多条语句查询—–同时执行 INSERT INTO 、DELETE 、UPDATE 语句:
#1 拼接语句
$sql = "INSERT user(username,password,age) VALUES('atong','atong',18);";
$sql .= "UPDATE user SET age=18 WHERE id=1;";
$sql .= "DELETE FROM user WHERE id=5;";
#2 使用 multi_query() 代替 query() 进行查询
$res = $mysqli->multi_query($sql);
针对 增、删、改的多条SQL语句查询来说:
- multi_query()逐条执行SQL语句,当其中有一条语句执行失败,后面的语句不会继续执行;
- 如果第一条语句执行成功,无论后面有几条语句执行失败,返回值都为true;
- 当第一条语句执行失败,后面的语句不会执行(与1说明情况相同),返回值为false;
- 注意拼写SQL语句时必须带上;符
多语句查询 - SELECT
PHP 实现对 MySQL 多条语句查询—–同时执行多条 SELECT 语句:
#1 拼接多条 SQL 语句:
$sql = "SELECT * FROM user WHERE id = 1;";
$sql .= "SELECT CURRENT_USER();";
$sql .= "SELECT NOW();";
#2 查询并返回结果
$bool = $mysqli->multi_query($sql);
#3 使用 use_result() 或 store_result() 获取第一条查询产生的结果集
$mysqli_result=$mysqli->store_result()
#4 将结果集数组存储为二维数组格式
$rows[]=$mysqli_result->fetch_all(MYSQLI_ASSOC);
#5 检测是否有更多的结果集
more_results()
#6 将结果集指针向下移动一位
next_result()
### 重复…3、4、5、6、即使用可使用循环实现,将以上归纳:
if($mysqli->multi_query($sql)){
do{
if($mysqli_result=$mysqli->store_result()){
$rows[]=$mysqli_result->fetch_all(MYSQLI_ASSOC);
}
}while($mysqli->more_results() && $mysqli->next_result());
}else{
echo $mysqli->error;
}
针对 增、删、改的多条SQL语句查询来说:
- 如果是查询操作,可以对执行多个查询语句,并将所有结果集存储在mysqli对象中,返回true或者false
- 使用 use_result() 或 story_result() 获得 multi_query() 查询后的一个结果集;
- more_result() 检测是否还有更多的结果集,有返回真;
- next_result() 将结果集指针移动指向下一条结果集,移动成功返回真;
预处理
以查询操作为例:
#1 编写SQL语句(注意使用 ‘?’ 作为占位符)
$sql="SELECT id,username,age FROM user WHERE age >= ?";
#2 准备(除了 ? 其它已经不会改变,可防止SQL注入)
$mysqli_stmt=$mysqli->prepare($sql);
#3 绑定参数( s,i,d,s 为字符串,i为整型,d为小数型)
$id = 20;
$mysqli_stmt->bind_param('i',$id);
#4 执行预处理语句(返回值是布尔值)
$bool = $mysqli_stmt->execute()
#5 绑定结果集中的值到变量
$mysqli_stmt->bind_result($id,$username,$age);
#6 遍历结果集
while($mysqli_stmt->fetch()){
echo '编号:'.$id,'<br/>';
echo '用户名:'.$username,'<br/>';
echo '年龄:'.$age.'<br/>';
echo '<hr/>';
}
- 预处理语句大大减少了分析时间,值在$mysqli_stmt=$mysqli->prepare($sql);时mysql会分析语句.
- 绑定参数减少了服务器带宽,你只需要发送查询的参数,而不是整个语句。
- 预处理语句针对SQL注入是非常有用的,因为参数值发送后使用不同的协议,保证了数据的合法性。
事务
事务的实现过程是关闭自动提交功能,然后编写多条查询语句,然后提交查询,如果某条语句查询失败,那么将回滚全部的语句,下面通过一个小栗子学习PHP中的事务:
# 创建一数据表
CREATE TABLE `test` (
`id` smallint NOT NULL AUTO_INCREMENT ,
`user_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
`money` int NOT NULL ,
PRIMARY KEY (`id`)
);
# 插入测试数据:
INSERT INTO test (`user_name`,`money`) VALUES('atong',100),('king',50);
#1 关闭自动提交功能
$mysqli->autocommit(FALSE); // 开始事务
#2 准备第一条查询语句
$sql0 = "UPDATE test SET money = money-10 WHERE user_name='atong'";
$res0 = $mysqli->query($sql);
$res_affect0 = $mysqli->affected_rows; //影响数量
#3 准备第二条查询语句
$sql1 = "UPDATE user_money SET money=money+10 WHERE user_name='king'";
$res1 = $mysqli->query($sql1);
$res1_affect = $mysqli->affected_rows;
#4 判断查询结果,如果成功则执行,否则回滚
if($res0 && $res_affect0 > 0 && $res1 && $res1_affect > 0){
//手动提交数据
$mysqli->commit();
echo '转账成功<br/>';
//恢复自动提交功能
$mysqli->autocommit(TRUE);
}else{
//事务回滚,任何一条数据都不执行。
$mysqli->rollback();
echo '转账失败<br/>';
}