Duang~MySQLi 扩展库来袭

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语句查询来说:

  1. multi_query()逐条执行SQL语句,当其中有一条语句执行失败,后面的语句不会继续执行;
  2. 如果第一条语句执行成功,无论后面有几条语句执行失败,返回值都为true;
  3. 当第一条语句执行失败,后面的语句不会执行(与1说明情况相同),返回值为false;
  4. 注意拼写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语句查询来说:

  1. 如果是查询操作,可以对执行多个查询语句,并将所有结果集存储在mysqli对象中,返回true或者false
  2. 使用 use_result() 或 story_result() 获得 multi_query() 查询后的一个结果集;
  3. more_result() 检测是否还有更多的结果集,有返回真;
  4. 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/>';
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章