tags:

views:

26

answers:

1

Here is my little function. It does not handle the results correctly. I do get all the rows that I want, but all the rows of the $results array contain the exact same values.

So i make 2 arrays, a temporary array to hold the values after each fetch, and another array to hold all the temporary arrays.

First i take the temp array and map its keys to the column names. Then i give it to bind_result, and call fetch() and use it like I would any other result value.

Could this be because I re-use the $results array?

numresults is the number of values you are taking from each row. if 0, you are not getting any results back.

function db_query($db, $query, $params = NULL, $numresults = 0)
{
    if($stmt = $db -> prepare($query))
    {
        if($params != NULL)
        {
            call_user_func_array(array($stmt, 'bind_param'), $params);
        }
        if(!$stmt -> execute())
        {
            //echo 'exec error:',$db->error;
            return false;
        }
        if($numresults > 0)
        {
            $results = array();
            $tmpresult = array();
            $meta = $stmt->result_metadata();
            while ($columnName = $meta->fetch_field())
                $tmpresult[] = &$results[$columnName->name];

            call_user_func_array(array($stmt, 'bind_result'), $tmpresult);       
            $meta->close(); 
            $results = array();
            while($stmt -> fetch())
                $results[] = $tmpresult;
        }
        $stmt -> close();
    }
    else
    {
        //echo 'prepare error: ',$db->error;
        return false;
    }
    if($numresults == 0)
        return true;
    return $results;
}
+1  A: 

You need to copy the values out of $tmpresult one element at a time. Replace this:

$results[] = $tmpresult;

With this:

$tmpresultcopy = array();
foreach ($tmpresult as $key => $value) {
    $tmpresultcopy[$key] = $value;
}
$results[] = $tmpresultcopy

What you're doing now is just copying the references. So you end up with $results storing N copies of the same set of references.

This is one of the reasons I recommend using PDO instead of mysqli! It's so much easier to use PDOStatement::fetchAll().

Bill Karwin
+1, faster typer then I am, References are only to be used if thoroughly understood, if even then :)
Wrikken
@Wrikken: And once you understand references, you don't want to use them. :)
Bill Karwin