PHP Conference Nagoya 2025

mysqli::next_result

mysqli_next_result

(PHP 5, PHP 7, PHP 8)

mysqli::next_result -- mysqli_next_resultmulti_query の、次の結果を準備する

説明

オブジェクト指向型

public mysqli::next_result(): bool

手続き型

mysqli_next_result(mysqli $mysql): bool

直近の mysqli_multi_query() コールから次の結果セットを用意します。 これは mysqli_store_result() あるいは mysqli_use_result() で取得することが可能です。

パラメータ

link

手続き型のみ: mysqli_connect() あるいは mysqli_init() が返す mysqliオブジェクト。

戻り値

成功した場合に true を、失敗した場合に false を返します。 mysqli_more_results() とは異なり、次のクエリがエラーになった場合は、同様に false を返します。

エラー / 例外

mysqli のエラー報告 (MYSQLI_REPORT_ERROR) が有効になっており、かつ要求された操作が失敗した場合は、警告が発生します。さらに、エラー報告のモードが MYSQLI_REPORT_STRICT に設定されていた場合は、mysqli_sql_exception が代わりにスローされます。

mysqli_multi_query() を参照ください。

参考

add a note

User Contributed Notes 2 notes

up
2
admin at travian-utils dot com
15 years ago
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']);
}
}
?>
up
0
pawel dot barcik at gmail dot com
16 years ago
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!
To Top