Функция PHP для обработки большинства запросов к базе данных имеет проблемы с результатами. Я получаю правильное количество строк, но они все одинаковы - PullRequest
0 голосов
/ 16 июня 2010

Вот моя маленькая функция. Он не обрабатывает результаты правильно. Я получаю все нужные мне строки, но все строки массива $ results содержат одинаковые значения.

Итак, я делаю 2 массива, временный массив для хранения значений после каждой выборки и другой массив для хранения всех временных массивов.

Сначала я беру временный массив и сопоставляю его ключи с именами столбцов. Затем я передаю его bind_result, вызываю fetch () и использую его так же, как любое другое значение результата.

Может ли это быть из-за того, что я повторно использую массив $ results?

numresults - это число значений, которые вы берете из каждой строки. если 0, вы не получите никаких результатов обратно.

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 Ответ

1 голос
/ 17 июня 2010

Вам необходимо скопировать значений из $tmpresult по одному элементу за раз. Заменить это:

$results[] = $tmpresult;

С этим:

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

То, что вы делаете сейчас, это просто копирование ссылок. Таким образом, вы получите $results для хранения N копий одного и того же набора ссылок.

Это одна из причин, по которой я рекомендую использовать PDO вместо mysqli! Гораздо проще использовать PDOStatement::fetchAll().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...