Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > Подскажите с mysqli_result


Автор: maxipub 18.8.2017, 16:07
Добрый день!

Появилась необходимость перенести работающий проект на другой сервер. В связи с этим решил перестать быть динозавром, и обновиться PHP 5.3 -> 7.1 вроде все что надо проделал, и тут заметил один косяк.

До этого использовал mysql_*, как известно, в PHP7 его нет, остановился на mysqli_*. В движке все запросы к БД идут через простую обертку, так что думал работы будет минимум. Все выглядит примерно так:

Код

$result = $db->query('SQL...');
if ($db->num_rows($result)){
    while ($row = $db->fetch_row($result))
    {
        ...
    }
}


Соответственно, обертка mysql.php (упрощенно):

Код

function query($sql)
{
    return ($sql)? mysql_query($sql, $this->link_id) : false;
}

function result($query_id = 0, $row = 0)
{
    return ($query_id) ? mysql_result($query_id, $row) : false;
}

function fetch_row($query_id = 0)
{
    return ($query_id) ? mysql_fetch_row($query_id) : false;
}

function num_rows($query_id = 0)
{
    return ($query_id) ? mysql_num_rows($query_id) : false;
}


В варианте mysqli.php выглядит примерно так:

Код

function query($sql)
{
    return ($sql)? mysqli_query($this->link_id, $sql) : false;
}

function result($query_id = 0, $row = 0, $col = 0)
{
    if ($query_id){
        if ($row)
            mysqli_data_seek($query_id, $row);

        $cur_row = mysqli_fetch_row($query_id);
        return $cur_row[$col];
    }
    else
        return false;
}

function fetch_row($query_id = 0)
{
    return ($query_id) ? mysqli_fetch_row($query_id) : false;
}

function num_rows($query_id = 0)
{
    return ($query_id) ? mysqli_num_rows($query_id) : false;
}


Я не сразу обратил внимание что функции mysqli_result почему-то не существует, и хоть новый result возвращает то что надо, логика у него совсем другая.

Проблема возникает в таких участках кода:

Код

$result = $db->query('SELECT one_field FROM table WHERE id=123');
if ($db->result($result)){
    $data = $db->result($result);
}


Т.е. где, например, в условии сначала проверяется result, а потом уже в случае выполнения условия непосредственно используется это значение. При использовании mysql_result такой проблемы не было - его можно дергать сколько угодно раз. Но очевидно что в данном случае mysqli_fetch_row, начиная со второго вызова, будет возвращать NULL...

Пытался решить это своими силами, пока ничего не выходит. Понимаю, что по-хорошему, может быть, лучше переделать код проекта, а не эту функцию. Но на данном этапе мне элементарно хотелось бы скорее закончить с переездом, а марафет наводить уже после. Поэтому хотелось бы поменять именно function result, а не рыться сейчас во всем коде.

Какие будут предложения? Заранее огромное человеческое спасибо!

Автор: ksnk 21.8.2017, 15:37
почему бы не написать вот так? И резалт только один раз дергается и последствий, вроде, никаких...
Код

if ($data =$db->result($result)){
    ...
}

Автор: maxipub 22.8.2017, 11:22
ksnk, это можно, но...

Цитата(maxipub @  18.8.2017,  16:07 Найти цитируемый пост)
Понимаю, что по-хорошему, может быть, лучше переделать код проекта, а не эту функцию. Но на данном этапе мне элементарно хотелось бы скорее закончить с переездом, а марафет наводить уже после.

Там 3,6 Мб PHP кода, которые планировал перенести еще 1-го августа.

Автор: maxipub 23.8.2017, 12:57
ksnk, за два часа вроде справился. Через день еще раз перепроверю чтоб не было косяков. Спасибо!

Автор: svenson 13.6.2019, 23:02
Ох базы данных, тонкое это место, как правило всегда с ними проблеммы какие-то возникают.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)