Не нравятся результаты поиска? Попробуйте другой поиск!
DLE FAQ » Все вопросы » Общие вопросы по PHP » При сохранении новости, зачем в коде была использована такая странная конструкция?

При сохранении новости, зачем в коде была использована такая странная конструкция?


     08.08.2023    Все вопросы » Общие вопросы по PHP    904

вопрос
За редактирование новости в админке, отвечает файл editnews.php, в нем есть следующий код:

$db->query( "SELECT id, autor, date, xfields, title, category, approve, tags, news_id, disable_index, disable_search, need_pass, allow_rss, allow_rss_turbo, allow_rss_dzen  FROM " . PREFIX . "_post LEFT JOIN " . PREFIX . "_post_extras ON (" . PREFIX . "_post.id=" . PREFIX . "_post_extras.news_id) WHERE id = '$id'" );

while ( $row = $db->get_row() ) {
	$item_db[0] = $row['id'];
	$item_db[1] = $row['autor'];
	$item_db[2] = $row['tags'];
	$item_db[3] = $row['approve'];
	$item_db[4] = $db->safesql( $row['title'] );
	$item_db[5] = explode( ',', $row['category'] );
	$item_db[6] = $row['news_id'];
	$item_db[7] = strtotime( $row['date'] );
	$item_db[8] = $row['category'];
	$xf_existing = xfieldsdataload($row['xfields']);
}


Мне абсолютно не понятно зачем тут вообще используется цикл, если при любом раскладке, данный sql запрос всегда вернет 1 строку. И второй момент, зачем нада было использовать в массиве $item_db в качестве ключей числа, когда гораздо удобнее и нагляднее было бы использовать названия полей.
К чему такие извращения? Или здесь есть какие то нюансы о которых я не знаю?

По логике данный код должен выглядеть хотя бы так:
$row = $db->super_query( "SELECT id, autor, date, xfields, title, category, approve, tags, news_id, disable_index, disable_search, need_pass, allow_rss, allow_rss_turbo, allow_rss_dzen  FROM " . PREFIX . "_post LEFT JOIN " . PREFIX . "_post_extras ON (" . PREFIX . "_post.id=" . PREFIX . "_post_extras.news_id) WHERE id = '$id'" );

$item_db[0] = $row['id'];
$item_db[1] = $row['autor'];
$item_db[2] = $row['tags'];
$item_db[3] = $row['approve'];
$item_db[4] = $db->safesql( $row['title'] );
$item_db[5] = explode( ',', $row['category'] );
$item_db[6] = $row['news_id'];
$item_db[7] = strtotime( $row['date'] );
$item_db[8] = $row['category'];
$xf_existing = xfieldsdataload($row['xfields']);

Ответа пока нет


3 комментария

TeraMoune
Эксперт

TeraMoune - 8 августа 2023 20:41 -

данный sql запрос всегда вернет 1 строку.

Ну видимо не всегда, и нюанс заключается в том, что запрос таки может вернут 0 строк и цикл не выполнится ни единого раза, а значит массив не будет создан. А дальше уже по коду проверяет наличие массива и выполняет последующие действия по обновлению новости либо игнорирует основную массу кода отвечающего за обновление новости.

Вероятность отсутствия записи в таблице редактируемой новости или ошибки мала но всё же вот так автор решил написать код.

И тут уже кому как удобно или нравится писать код. Можно просто условиями проверить наличие $row при использовании super_query. как в вашем варианте, а вот автору это показалось слишком скучно и банально и он может уже привык так писать.

Тестовый репозиторий установки плагинов: teramoune

lutskboy
Эксперт

lutskboy - 9 августа 2023 17:00 -

такой бред еще в профиле есть. цикл. как будто по адресу /user/ivan/ мы собираемся 5 пользователей выводить вместо одного

dj-avtosh
PHP-developer

dj-avtosh - 9 августа 2023 18:43 -

В Вашем решении повалятся нотисы в лог, при отсутствии результата.

Внутри super_query тот же код, что и в файле. Ничего такого странного в коде не вижу.

По заказам пишем сюда: @Rud00y

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.):
В телегу писать сразу задачу и бюджет.

Чтобы комментировать - войдите или зарегистрируйтесь на сайте

Похожие вопросы

наверх