使用multi_query可以实现执行多条SQL语句,每一条SQL语句通过分号分隔。

需要注意的是:

  多条用分号分隔的SQL语句中,只要有一条SQL语句执行失败,那么这一条SQL语句以及之后的SQL语句就不会执行。

  只有当第一条SQL语句执行失败,那么multi_query()的返回值才为false。如果第一条SQL语句执行成功了,那么都会返回true。

<?php
$mysqli = new Mysqli();
$mysqli->connect("localhost","root","root","test");
if ( $mysqli->connect_errno ){
die( $mysqli->connect_error );
}
$mysqli->set_charset("utf8");
$sql = "";
$sql .= "truncate table mysqli;"; //第一条SQL语句
$sql .= "insert into mysqli (id, name) values (null, 'aaaa'),(null, 'bbbb');";//第二条SQL语句
$sql .= "update table mysqli where uid = 1;";//第三条SQL语句,因为没有uid字段,所以出错
$sql .= "insert into mysqli (id, name) values (null, 'cccc');";
$res = $mysqli->multi_query($sql);
var_dump($res);
?>

  查看数据库:

mysql> select * from mysqli;
+----+------+
| id | name |
+----+------+
| 1 | aaaa |
| 2 | bbbb |
+----+------+
2 rows in set (0.00 sec)

  可以看到第三条SQL语句执行失败之后,第四条插入数据的SQL语句也没有执行

multi_query执行多条select查询语句

  对于执行多条select语句,那么返回的结果集也会有多个,所以就需要“切换结果集”,

  使用Mysqli_result Mysqli::use_result 和 Mysqli_result Mysqli::store_result()都可以将获取multi_query的结果中 指针所指向的结果集,通过移动内部指针来遍历多个结果集。

  可以使用bool Mysqli::more_result()来检测是否还有结果集,如果有,则可以通过bool Mysqli::next_result()将内部指针指向下一个结果集。

方法一:使用Mysqli_result Mysqli::use_result()

<?php
$mysqli = new Mysqli();
$mysqli->connect("localhost","root","root","test");
if ( $mysqli->connect_errno ){
die( $mysqli->connect_error );
}
$mysqli->set_charset("utf8");
$sql = "";
$sql .= "select * from mysqli;";
$sql .= "select * from user;";
$res = $mysqli->multi_query($sql);
if( $res ) {
do{
if( $mysqli_result = $mysqli->use_result() ){
print_r( $mysqli_result->fetch_all( MYSQLI_ASSOC ) );
}
} while( $mysqli->more_results() && $mysqli->next_result() );
} else {
echo "error ".$mysqli->errno." : ".$mysqli->error;
}
?>

  

方法二:Mysqli_result Mysqli::store_result()

<?php
$mysqli = new Mysqli();
$mysqli->connect("localhost","root","root","test");
if ( $mysqli->connect_errno ){
die( $mysqli->connect_error );
}
$mysqli->set_charset("utf8");
$sql = "";
$sql .= "select * from mysqli;";
$sql .= "select * from user;";
$res = $mysqli->multi_query($sql);
if( $res ) {
do{
if( $mysqli_result = $mysqli->store_result() ){
print_r( $mysqli_result->fetch_all( MYSQLI_ASSOC ) );
}
} while( $mysqli->more_results() && $mysqli->next_result() );
} else {
echo "error ".$mysqli->errno." : ".$mysqli->error;
}
?>

  

MySQLi面向对象实践--multi_query的更多相关文章

  1. MySQLi面向对象实践--select

    对于update.insert.delete请参考http://www.cnblogs.com/-beyond/p/8457580.html 执行select,如果SQL语句执行成功,那么返回的是一个 ...

  2. MySQLi面向对象实践--insert、update、delete

    执行insert <?php $mysqli = new Mysqli(); $mysqli->connect("localhost","root" ...

  3. PHP中用mysqli面向对象打开连接关闭mysql数据库

    代码如下: <meta http-equiv="content-type" content="text/html" charset="utf-8 ...

  4. Mysqli面向对象操作数据库

    Mysqli面向对象操作数据库 首先配置一下数据库: 接着用PHP中的Mysqli扩展库面向对象查询这个数据表. 操作分为以下几个步骤: 连接数据库 操作数据库 处理结果 关闭资源 <?php ...

  5. MySQL原生API、MySQLi面向过程、MySQLi面向对象、PDO操作MySQL

    [转载]http://www.cnblogs.com/52fhy/p/5352304.html 本文将举详细例子向大家展示PHP是如何使用MySQL原生API.MySQLi面向过程.MySQLi面向对 ...

  6. C++面向对象实践

    实践如下: class Person{ private: int age; ]; int hight; public: Person(int age, int hight, char* name); ...

  7. Golang的面向对象实践method

    最近在系统的学习go的语法,一切都弄好了之后准备弄个im项目出来玩.在这个过程中会把看到有趣的写法和语法啥的拿出来分析一下. 我一直以为go语言对面向对象没有支持,但是后面看到了类似类的概念,meth ...

  8. Javascript 面向对象实践

    踩到了坑,才能学到东西. 记录我在慢慢的转向模块化遇到的问题以及解决的思路. 1.采用立即执行函数,闭包的方式创建模块 html: <!DOCTYPE html> <html lan ...

  9. php的mysql\mysqli\PDO(二)mysqli

    原文链接:http://www.orlion.ga/1147/ mysqli有面向对象风格和面向过程风格,个人感觉还是用面向对象风格比较好(毕竟是面向对象) 1.mysqli::_construct( ...

随机推荐

  1. NDK/JNI学习--环境搭建

    基于Windows来开发Android的NDK.JNI须要的环境搭建,所须要的软件例如以下: Android 开发环境的基本配置(SDk,ADT.Eclipse IDE.JDK)       这些都是 ...

  2. console.time和console.timeEnd用法

    console.time和console.timeEnd这两个方法可以用来让WEB开发人员测量一个javascript脚本程序执行消耗的时间.随着WEB应用越来越重要,JavaScript的执行性能也 ...

  3. python opencv show图片,debug技巧

    debug的时候可以直接把图片画出来debug. imshow函数就是python opencv的展示图片的函数,第一个是你要起的图片名,第二个是图片本身.waitKey函数是用来展示图片多久的,默认 ...

  4. C语言的基本数据类型

     代码如下: // text.cpp: 定义控制台应用程序的入口点. // #include "stdafx.h" int main() { int a; //告诉编译器,分配 4 ...

  5. [03-01] JSP自定义标签

    1.自定义标签的概念 目前我们在JSP中使用的标签都是HTML的标签,浏览器会自动解析运行,例如<form action=""></form>,这里的for ...

  6. 【LeetCode105】Construct Binary Tree from Preorder and Inorder Traversal★★

    1.题目 2.思路 3.java代码 //测试 public class BuildTreeUsingInorderAndPreorder { public static void main(Stri ...

  7. 基于tensorflow的躲避障碍物的ai训练

    import pygameimport randomfrom pygame.locals import *import numpy as npfrom collections import deque ...

  8. echarts 响应式布局

    <body> <!-- 为ECharts准备一个具备大小(宽高)的Dom --> <div id="main" style="width: ...

  9. JSON WEB TOKEN,简单谈谈TOKEN的使用及在C#中的实现

    十年河东,十年河西,莫欺少年穷. 学无止境,精益求精. 突然发现整个十月份自己还没有写一篇博客......哎,说出来都是泪啊,最近加班实在实在实在是太多了,真的没有多余的时间写博客.这不,今天也在加班 ...

  10. EF 利用PagedList进行分页并结合查询 方法2

    微软提供了PagedList分页,相信大家在网上也能搜索一大堆关于pagedList用法的博客,论坛.但是,在使用的过程中一不小心,就会掉入pagedList某种常规用法的陷阱. 我所说的某种常规用法 ...