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;

浙公网安备 33010602011771号