文字

mysqli_stmt::get_result

mysqli_stmt_get_result

(PHP 5 >= 5.3.0)

mysqli_stmt::get_result -- mysqli_stmt_get_resultGets a result set from a prepared statement

说明

面向对象风格

mysqli_result mysqli_stmt::get_result ( void )

过程化风格

mysqli_result mysqli_stmt_get_result ( mysqli_stmt $stmt )

Call to return a result set from a prepared statement query.

参数

stmt

仅以过程化样式:由 mysqli_stmt_init() 返回的 statement 标识。

返回值

Returns a resultset 或者在失败时返回 FALSE .

仅 MySQL 原生驱动

仅可用于 mysqlnd。

范例

Example #1 面向对象风格

<?php 

$mysqli 
= new  mysqli ( "127.0.0.1" "user" "password" "world" ); 

if(
$mysqli -> connect_error )
{
    die(
" $mysqli -> connect_errno $mysqli -> connect_error " );
}

$query  "SELECT Name, Population, Continent FROM Country WHERE Continent=? ORDER BY Name LIMIT 1" ;

$stmt  $mysqli -> stmt_init ();
if(!
$stmt -> prepare ( $query ))
{
    print 
"Failed to prepare statement\n" ;
}
else
{
    
$stmt -> bind_param ( "s" $continent );

    
$continent_array  = array( 'Europe' , 'Africa' , 'Asia' , 'North America' );

    foreach(
$continent_array  as  $continent )
    {
        
$stmt -> execute ();
        
$result  $stmt -> get_result ();
        while (
$row  $result -> fetch_array ( MYSQLI_NUM ))
        {
            foreach (
$row  as  $r )
            {
                print 
" $r  " ;
            }
            print 
"\n" ;
        }
    }
}

$stmt -> close ();
$mysqli -> close ();
?>

Example #2 过程化风格

<?php 

$link 
mysqli_connect ( "127.0.0.1" "user" "password" "world" ); 

if (!
$link )
{
    
$error  mysqli_connect_error ();
    
$errno  mysqli_connect_errno ();
    print 
" $errno $error \n" ;
    exit();
}

$query  "SELECT Name, Population, Continent FROM Country WHERE Continent=? ORDER BY Name LIMIT 1" ;

$stmt  mysqli_stmt_init ( $link );
if(!
mysqli_stmt_prepare ( $stmt $query ))
{
    print 
"Failed to prepare statement\n" ;
}
else
{
    
mysqli_stmt_bind_param ( $stmt "s" $continent );

    
$continent_array  = array( 'Europe' , 'Africa' , 'Asia' , 'North America' );

    foreach(
$continent_array  as  $continent )
    {
        
mysqli_stmt_execute ( $stmt );
        
$result  mysqli_stmt_get_result ( $stmt );
        while (
$row  mysqli_fetch_array ( $result MYSQLI_NUM ))
        {
            foreach (
$row  as  $r )
            {
                print 
" $r  " ;
            }
            print 
"\n" ;
        }
    }
}
mysqli_stmt_close ( $stmt );
mysqli_close ( $link );
?>

以上例程会输出:

Albania 3401200 Europe 
Algeria 31471000 Africa 
Afghanistan 22720000 Asia 
Anguilla 8000 North America 

参见

  • mysqli_prepare() - Prepare an SQL statement for execution
  • mysqli_stmt_result_metadata() - Returns result set metadata from a prepared statement
  • mysqli_stmt_fetch() - Fetch results from a prepared statement into the bound variables
  • mysqli_fetch_array() - Fetch a result row as an associative, a numeric array, or both
  • mysqli_stmt_store_result() - Transfers a result set from a prepared statement

用户评论:

[#1] tonywoodecode at gmail dot com [2015-11-11 12:09:36]

well I for one found anonymous' above eval-trick code very useful, seeing as no one has posted a working alternative! However, because I wanted to cater for a generic database object, I found it a problem that the code assumed numeric array was fine for all callsites, and I needed to cater for all callers using assoc arrays exlusively. I came up with this:
<?php
class IImysqli_result {
        public 
$stmt$ncols;
}   

class 
DBObject {

    function 
iimysqli_get_result($stmt) {
      
$metadata $stmt->result_metadata();
      
$ret = new IImysqli_result;
      if (!
$ret || !$metadata) return NULL//the latter because this gets called whether we are adding/updating as well as returning
      
$ret->ncols $metadata->field_count;
      
$ret->stmt $stmt;
      
$metadata->free_result();
      return 
$ret;
   }

   
//this mimics mysqli_fetch_array by returning a new row each time until exhausted
    
function iimysqli_result_fetch_array(&$result) {
      
$stmt $result->stmt;
      
$stmt->store_result();
      
$resultkeys = array();
      
$thisName "";
      for ( 
$i 0$i $stmt->num_rows$i++ ) {
            
$metadata $stmt->result_metadata();
            while ( 
$field $metadata->fetch_field() ) {
                
$thisName $field->name;
                
$resultkeys[] = $thisName;
            }
      }

      
$ret = array();
      
$code "return mysqli_stmt_bind_result(\$result->stmt ";
      for (
$i=0$i<$result->ncols$i++) {
          
$ret[$i] = NULL;
          
$theValue $resultkeys[$i];
          
$code .= ", \$ret['$theValue']";
      }

      
$code .= ");";
      if (!eval(
$code)) { 
        return 
NULL
      }

      
// This should advance the "$stmt" cursor.
      
if (!mysqli_stmt_fetch($result->stmt)) { 
        return 
NULL
      }

      
// Return the array we built.
      
return $ret;
    }
}

?>

[#2] chris at hexus dot io [2015-07-28 09:43:46]

This method drove me mad for an hour or two because it returns <b>false</b> after performing a successful query that isn't a SELECT, even though the documentation says "return <b>FALSE</b> on failure". Nothing failed!

If you're preparing a SELECT statement, expect a result object. Anything else, just use the properties of the statement object.

I find this library painfully inconsistent.

[#3] Anonymous [2013-10-06 08:39:54]

I went through a lot of trouble on a server where mysqlnd wasn't available, and had a lot of headaches.

If you don't have mysqlnd installed/loaded whatever, you will get an undefined reference when trying to call "mysqli_stmt_get_result()".

I wrote my own mysqli_stmt_get_result() and a mysqli_result_fetch_array() to go with it.

<?php
class iimysqli_result
{
    public 
$stmt$nCols;
}    

function 
iimysqli_stmt_get_result($stmt)
{
    

    
$metadata mysqli_stmt_result_metadata($stmt);
    
$ret = new iimysqli_result;
    if (!
$ret) return NULL;

    
$ret->nCols mysqli_num_fields($metadata);
    
$ret->stmt $stmt;

    
mysqli_free_result($metadata);
    return 
$ret;
}

function 
iimysqli_result_fetch_array(&$result)
{
    
$ret = array();
    
$code "return mysqli_stmt_bind_result(\$result->stmt ";

    for (
$i=0$i<$result->nCols$i++)
    {
        
$ret[$i] = NULL;
        
$code .= ", \$ret['" .$i ."']";
    };

    
$code .= ");";
    if (!eval(
$code)) { return NULL; };

    
// This should advance the "$stmt" cursor.
    
if (!mysqli_stmt_fetch($result->stmt)) { return NULL; };

    
// Return the array we built.
    
return $ret;
}
?>


Hope this helps someone.

[#4] jari dot wiklund at gmail dot com [2011-09-16 01:03:46]

Please note that this method requires the mysqlnd driver. Othervise you will get this error: Call to undefined method mysqli_stmt::get_result()

上一篇: 下一篇: