• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • mysqli::next_result()

    (PHP 5, PHP 7)

    为读取 multi_query 执行之后的下一个结果集做准备

    说明

    面向对象风格
    mysqli::next_result(void): bool
    过程化风格
    mysqli_next_result(mysqli$link): bool

    mysqli_multi_query()函数执行之后,为读取下一个结果集做准备,然后可以使用mysqli_store_result()或mysqli_use_result()函数读取下一个结果集。

    参数

    $link

    仅以过程化样式:由mysqli_connect()或mysqli_init()返回的链接标识。

    返回值

    成功时返回TRUE,或者在失败时返回FALSE

    范例

    See mysqli_multi_query().

    参见

    • mysqli_multi_query() 执行查询
    • mysqli_more_results() 检查批量查询中是否还有查询结果
    • mysqli_store_result() 转移上一次查询返回的结果集
    • mysqli_use_result() Initiate a result set retrieval
    Stored procedures few rowset example:
    some_file.php
    <?php
    function proc() {
     global $global;
     $db_connect_list = array('site');
     SQLinit($db_connect_list);
     if(isset($global['error'])){return;}
     SQL('CALL `procedure`();');
     while($row=mysqli_fetch_assoc($global['result'])){
      // do some
     }
     SQLnext();
     while($row=mysqli_fetch_assoc($global['result'])){
      // do some
     }
     SQLnext();
     while($row=mysqli_fetch_assoc($global['result'])){
      // do some
     }
     SQLclose($db_connect_list);
    }
    ?>
    config.php
    <?php
     $global['sys']['db']['site'] = array('host'=>'localhost', 'user'=>'site', 'pass'=>'');
    ?>
    engine.php
    <?php
    function SQLinit($array_list){
     global $global;
     foreach($array_list as $set){
      if(!$global['sys']['db'][$set]['connect'] = mysqli_connect(
        $global['sys']['db'][$set]['host'],
        $global['sys']['db'][$set]['user'],
        $global['sys']['db'][$set]['pass'])){
       $global['error']['code'] = 500;
       $global['error']['text'] = 'Database not avaliable';
       $w=fopen('error.log','a+');
       fwrite($w,'time: '.date('Y M d H:i:s')."\r\n");
       fwrite($w,'errno: '.mysqli_connect_errno()."\r\n");
       fwrite($w,'error: '.mysqli_connect_error()."\r\n");
       fclose($w);
       return;
      }
      if(!isset($global['sys']['default_connect']))
       $global['sys']['default_connect'] = $global['sys']['db'][$set]['connect'];
      SQL('SET NAMES \'utf8\' COLLATE \'utf8_unicode_ci\';', $global['sys']['db'][$set]['connect']);
      SQL('SET CHARACTER SET \'utf8\';', $global['sys']['db'][$set]['connect']);
      SQL('SET character_set_connection = \'utf8\';', $global['sys']['db'][$set]['connect']);
     }
    }
    function mTime(){
     list($usec, $sec) = explode(" ", microtime());
     return ((float)$usec+(float)$sec);
    }
    function SQL($sql, $connect = -1){
     global $global;
     if($connect === -1)$connect = $global['sys']['default_connect'];
     if(isset($global['error']['sql']))return;
     while ($connect->next_result()) $connect->store_result();
     $begin=mTime();
     $global['result']=mysqli_query($connect, $sql);
     $end=mTime();
     $global['sys']['time_sql']+=$end-$begin;
     $error=mysqli_error($connect);
     if($error!=''){
      $global['error']['code'] = 502;
      $global['error']['text'] = 'SQL error';
      $global['error']['sql'] = true;
      $w=fopen('error.log','a+');
      fwrite($w,'time: '.date('Y M d H:i:s')."\r\n");
      fwrite($w,'errno: '.mysqli_errno($connect)."\r\n");
      fwrite($w,'error: '.$error."\r\n");
      fwrite($w,'sql: '.$sql."\r\n");
      fclose($w);
     }else{
      $w=fopen('sql.log','a+');
      fwrite($w,'time: '.date('Y M d H:i:s')."\r\n");
      fwrite($w,'sql: '.$sql."\r\n");
      fclose($w);
     }
    }
    function SQLnext($connect = -1){
     global $global;
     if($connect === -1)$connect = $global['sys']['default_connect'];
     if(isset($global['error']['sql']))return;
     $connect->next_result();
     $global['result'] = $connect->store_result();
    }
    function SQLclose($array_list){
     global $global;
     foreach($array_list as $set){
      mysqli_close($global['sys']['db'][$set]['connect']);
     }
    }
    ?>
    
    this function returns FALSE when you have an error in your syntax in one of your queries, so be carefull with this type of construction when tracking errors:
    <?php
    //error in the second sub query 
    $result = $db->multi_query("select * from news; seleeeeeeect id from news; update news set title='new title' where id= 12 ");
    //code inside object class
    $this->_db = new Mysqli($host, $user, $password, $database, $port, $socket);
        
    do {
      $result = $this->_db->store_result();
      $this->_resultMulti[] = $result;
      $this->_errnoMulti[] = $this->_db->errno;
      if(is_object($result)) {
        $result->free_result();
      }
            
    } while($this->_db->next_result());
    ?>
    in this construction all you have in the $this->_errnoMulti is :
    array(1) {
     [0]=>
     int(0)
    }
     
    which means that there are no errors if you are not checking how many queries are executed!