14.3 批量执行 sql

 

核心函数:mysqli_multi_query()

1 执行多条用分号分隔的SQL语句
2 如果执行DML语句 返回布尔值 如果执行DQL语句 成功返回true,表示有多个结果集 失败返回false
3 需要配合下面三个函数取出结果集
mysqi_store_result($link); 取出第一条结果集 返回mysqli_result对象
mysqli_more_results($link); 检查多语句查询内是否还有更多查询结果。 返回布尔值
mysqli_next_result($link); 从 multi_query 中准备下一个结果集。 返回布尔值

 

使用陷阱

mysqli_multi_query($sqls);

1 该方法只返回第一条SQL语执行的布尔值,后面SQL执行的结果拿不到,必须用别的方式再做判断。

2 如果某一条错了,它后面的SQL语句就不再执行了,错误之前的会执行成功

2 批量执行时,不要DML和DQL混用

4 被执行的最后一条SQL语句加分号或不加分号都可以

 

1) 执行DML语句

//1 sql数组
$arr = [
    "insert into bbs_category(name,e_name) values ('张三','zhangsan')",
    'insert into bbs_category(name,e_name) values ("李四","lisi")',
    'insert into bbs_category(name,e_name) values ("王五","wangwu")'
];
//2 用分号分割数组为字符串
$sqls = implode(';',$arr).';';
//3 执行SQL
if (mysqli_multi_query($link,$sqls)) {
    echo '首条执行成功';
} else {
    echo '首条sql语句错误,错误原因:'.mysqli_error($link);
}

 

2)执行DQL语句

$sqls  = "select * from bbs_content;";
$sqls .= "select * from bbs_content;";
//1 如果返回值为true 表示有结果集
if ($result = mysqli_multi_query($link,$sqls)) {
    //2 取出结果集
do { //3 do循环先执行一次再判断条件 $result = mysqli_store_result($link);//返回result对象 while ($row = mysqli_fetch_assoc($result)) { echo '<pre>'; var_dump($row); } echo '----------------'; //4 mysqli_more_results函数:检查上一次调用 mysqli_multi_query() 函数之后,是否还有更多的查询结果集 if (!mysqli_more_results($link)) break;//如果没有了就跳出循环 } while (mysqli_next_result($link));//5 为读取下一个结果集做准备 } else { echo '首条语句有错'.mysqli_error($link); }
//基本的使用:存在不足,比如后面的SQL语句错误 不知道哪个SQL出错了。

 

3)封装成函数

//定义函数
function multi($link,$arr_sqls,&$error){
    //把数组分割成字符串
    $sqls = implode(';',$arr_sqls);

    //如果第一条SQL执行结果为true 执行里面代码
    if (mysqli_multi_query($link,$sqls)) {
        $data = [];//定义数组 接收循环到的数据
        $num =0;//计数
        $i = 0;//数组下标
        do {
            if ($result = mysqli_store_result($link)) {
                $data[$i] = mysqli_fetch_all($result);
            } else {
                $data[$i] = null;
            }
            $i++;
            $num++;
            //判断一下是否还有结果集
            if (!mysqli_more_results($link)) break;//如果没有了 跳出循环
        } while (mysqli_next_result($link));
        //判断循环的次数和sql数组的下标的数量是否相等
        //如果相等就等于都执行完成了,就返回数据
        //否则就是出错了,返回false 并保存错误消息
        if ($num == count($arr_sqls)){
            return $data;
        } else {
            $error = ''.($num+1).'条SQL执行失败,可能的原因'.mysqli_error($link);
            return false;
        }
    } else {
        $error = '首行SQL执行错误,可能的错误原因:'.mysqli_error($link);
        return false;
    }
}

调用函数

$sqls = [
    "select * from bbs_content",
    "select * from bbs_member",
    "select * from bbs_category"
];

//调用函数
$res = multi($link,$sqls,$error);
echo "<pre>";
var_dump($res[2][1]);
echo $error;

 

posted @ 2020-12-24 20:40  棉花糖88  阅读(254)  评论(0)    收藏  举报