" SELECT * ..." mysqli参数化查询 - 如何在不绑定的情况下存储结果?

时间:2015-05-17 03:17:09

标签: php mysqli

我想将mysqli查询结果存储到数组中。

到目前为止我的代码看起来像这样:

function get_nearby_users($Id, $MaxDistance, $RowLimit, $RowLimitOffset)
{
    try
    {
    $query = "SELECT 
                    others.*,
                    Distance(me.Latitude, me.Longitude, others.Latitude, others.Longitude) as Distance

                from 
                    Users me
                join
                    Users others

                where 
                    me.Id = ? 
                and 
                    others.Id != ?

                having Distance < ?

                limit ?,?

        ";

        $stmt = $this->link->prepare($query);
        $stmt->bind_param('iiiii', $Id, $Id, $MaxDistance, $RowLimitOffset, $RowLimit);
        $stmt->execute();

        // how to fill $rows_array?

    }

    catch(Exception $exc)
    {
        // ...
    }

    return $rows_array;

}

当我的SQL包含类似&#34; SELECT *&#34;?

之类的内容时,如何将结果存入数组?

所有带参数化查询的教程都使用bind_result函数,但我不想为所有字段创建变量并绑定它们。没有别的办法吗?

1 个答案:

答案 0 :(得分:0)

您不需要使用bind_result来存储记录集。

只需使用fetchAll()将结果集行存储为数组。

$rows_array = $stmt->fetchAll();

我修改了你的代码。使用此:

function get_nearby_users($Id, $MaxDistance, $RowLimit, $RowLimitOffset)
{
    try
    {
    $query = "SELECT 
                    others.*,
                    Distance(me.Latitude, me.Longitude, others.Latitude, others.Longitude) as Distance

                from 
                    Users me
                join
                    Users others

                where 
                    me.Id = ? 
                and 
                    others.Id != ?

                having Distance < ?

                limit ?,?

        ";

        $stmt = $this->link->prepare($query);
        $stmt->bind_param('iiiii', $Id, $Id, $MaxDistance, $RowLimitOffset, $RowLimit);
        $stmt->execute();

        $rows_array = $stmt->fetchAll(); // store result set rows as an array

    }

    catch(Exception $exc)
    {
        // ...
    }

    return $rows_array;

}