Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Подскажите с mysqli_result 
V
    Опции темы
maxipub
Дата 18.8.2017, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 517
Регистрация: 22.10.2009

Репутация: нет
Всего: 1



Добрый день!

Появилась необходимость перенести работающий проект на другой сервер. В связи с этим решил перестать быть динозавром, и обновиться 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, а не рыться сейчас во всем коде.

Какие будут предложения? Заранее огромное человеческое спасибо!
PM MAIL   Вверх
ksnk
Дата 21.8.2017, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 14
Всего: 386



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

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



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
maxipub
Дата 22.8.2017, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 517
Регистрация: 22.10.2009

Репутация: нет
Всего: 1



ksnk, это можно, но...

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

Там 3,6 Мб PHP кода, которые планировал перенести еще 1-го августа.
PM MAIL   Вверх
maxipub
Дата 23.8.2017, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 517
Регистрация: 22.10.2009

Репутация: нет
Всего: 1



ksnk, за два часа вроде справился. Через день еще раз перепроверю чтоб не было косяков. Спасибо!
PM MAIL   Вверх
svenson
Дата 13.6.2019, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 13.6.2019

Репутация: нет
Всего: нет



Ох базы данных, тонкое это место, как правило всегда с ними проблеммы какие-то возникают.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.1289 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.