get_result()函数的替代品?

时间:2014-02-04 18:11:38

标签: php mysql mysqli

所以我的主机没有为mysqli安装mysqlnd驱动程序,所以我无法使用get_result()函数(并且它不是安装mysqlnd驱动程序的选项)。以下查询有哪些替代方法,以便我不使用get_result()

我知道我可以使用以下内容从数据库中获取单个结果:

if ($stmt = $cxn->prepare("SELECT `count` FROM `numbers` WHERE `count_id` = ?")) {
    $stmt->bind_param('i', $count_id);
    $stmt->execute();
    $stmt->bind_result($count);
    $stmt->fetch();
    $stmt->close();
}

但是如果我必须从数据库中选择几个结果,循环遍历每个结果并得到另一个结果呢?

if ($stmt = $cxn->prepare("SELECT `count` FROM `numbers` WHERE `number` = ?")) {
    $stmt->bind_param('i', $number);
    $stmt->execute();
    $result = $stmt->get_result(); // uses get_result()
}

if ($result->num_rows) { // uses get_result()
    while ($row = $result->fetch_assoc()) { // uses get_result()
        if($stmt = $cxn->prepare("SELECT `value` FROM `values` WHERE `number` = ?")) {
            $stmt->bind_param('i', $row['count']);
            $stmt->execute();
            $stmt->bind_result($value);
            $stmt->fetch();
            $stmt->close();
        }
    }
}

我不能使用它,因为有些语句需要get_result(),我无法使用。

我的替代方案是什么?

2 个答案:

答案 0 :(得分:0)

试试这个,

if ($stmt = $cxn->prepare("SELECT `count` FROM `numbers` WHERE `count_id` = ?")) 
{

    $stmt->bind_param('i', $count_id);
    $stmt->execute();
    $result = $stmt->fetchAll();

        if ( count($result) ) 
        {

            foreach($result as $row) 
            {

                print_r($row);

            }
        } 
        else 
        {

            echo "Nothing Returned.";

        }
    }

答案 1 :(得分:0)

我不完全确定为什么在某些PHP安装中不提供此功能,但是它使我陷入了一个项目,因此我已经实现了这种几乎是直接替代的方法。 该函数将“ mysqli_stmt”对象作为参数,并在该对象存在的情况下调用该方法。如果没有,它将利用'mysqli_result'类的部分实现(缺少一些我未使用的方法)。

'convert_array'函数处理与'$ mode'参数关联的所有数组合并功能。

function convert_array($assoc, $mode)
{
    $outarray = [];

    switch ($mode)
    {
        case MYSQLI_ASSOC:
            foreach($assoc as $key => $value)
            {       
                if (is_array($value))           
                    $outarray[$key] = convert_array($value, $mode);                                         
                else            
                    $outarray[$key] = $value;           
            }   
            return $outarray;
        case MYSQLI_NUM:
            $i = 0;
            foreach($assoc as $key => $value)
            {       
                if (is_array($value))           
                    $outarray[$i] = convert_array($value, $mode);                                           
                else            
                    $outarray[$i] = $value;         
                $i++;
            }   
            return $outarray;           
        case MYSQLI_BOTH:
            $i = 0;         
            foreach($assoc as $key => $value)
            {       
                if (is_array($value))                           
                    $outarray[$key] = $outarray[$i] = convert_array($value, $mode);                                         

                else            
                    $outarray[$key] = $outarray[$i] = $value;           
                $i++;
            }   
            return $outarray;
    }

    return $outarray;


}

//drop in replacement for the sometimes missing (depending on version) 'stmt->get_result'
class proxy_result
{
    public $current_field = 0;
    public $field_count = 0;
    public $lengths = 0;
    public $num_rows = 0;
    public $current_row = 0;
    public $type = 0;

    public $results = [];  

    function fetch_all ($resulttype = MYSQLI_NUM)
    {
        return convert_array($this->results, $resulttype);
    }


    //fetch row as associative array
    function fetch_assoc()
    {
        if ($this->current_row < $this->num_rows)
            return $this->results[$this->current_row++];
        else
            return null;        
    }

    function fetch_array($resulttype = MYSQLI_BOTH)
    {       
        return convert_array($this->fetch_assoc(), $resulttype);
    }  
};


function get_result( $stmt ) 
{
    if (method_exists ($stmt ,'get_result'))
    {
        return $stmt->get_result();
    }
    else
    {
        $RESULT = array();
        $stmt->store_result();
        for ( $i = 0; $i < $stmt->num_rows; $i++ ) 
        {
            $Metadata = $stmt->result_metadata();
            $PARAMS = array();
            while ( $Field = $Metadata->fetch_field() ) 
            {
                $PARAMS[] = &$RESULT[ $i ][ $Field->name ];
            }
            call_user_func_array( array( $stmt, 'bind_result' ), $PARAMS );
            $stmt->fetch();

            $result = new proxy_result();
            $result->num_rows = count($RESULT);
            $result->field_count = count($RESULT[0]);
            $result->results = $RESULT;

            //$RESULT->num_rows = count($RESULT);  
        }

        return $result;
    }   
}