MySQLi面向对象实践--multi_query

Posted 寻觅beyond

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQLi面向对象实践--multi_query相关的知识,希望对你有一定的参考价值。

使用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的主要内容,如果未能解决你的问题,请参考以下文章

MySQLi面向对象实践---事务处理

MySQLi面向对象实践--select

MySQLi面向对象实践---预处理

MySQLi multi_query不会返回超过1个结果

mysqli的 mulit_query执行多条语句。

MySQLi面向过程实践---预处理