• DONATE to NULLED!
    Форуму и его команде можно помочь, мотивировать модераторов разделов.
    Помогите модератору этого раздела killoff лично.

Помощь Как перемешать новости в DLE ?

@Gameer, как-то уж слишком радикальный коддинг... Нагрузку замерял от такого решения? :)

P.s. для такого есть кэш, не надо захламлять папку конфигов.
я забыл еще сделать рандом id.
PHP:
if (file_exists(ENGINE_DIR . "/data/news_id.txt"))
{
    $news_id = file_get_contents(ENGINE_DIR . "/data/news_id.txt");
    $sql_id = "ORDER BY FIND_IN_SET(p.id,'".str_replace("','",$db->safesql($news_id))."')";
}
else
{
    $rand_sql = $db->query("SELECT id FROM " . PREFIX . "_post WHERE approve=1");
    $arr_id = array();
    while( $row_rand = $db->get_row($rand_sql) )
        $arr_id[] = intval($row_rand["arr_id"]);
    shuffle($arr_id);
    $arr_id_str = implode(",",$arr_id);
    unset($arr_id);
   
    $handler = fopen(ENGINE_DIR . '/data/news_id.txt', "w");
    fwrite($handler, $arr_id_str);
    fclose($handler);
    $sql_id = "ORDER BY FIND_IN_SET(p.id,'".str_replace("','",$db->safesql($arr_id_str))."')";
}
Нет, не замерял. При первой загрузке не много потрясет, дальше все как обычно +- чуть больше времени из-за FIND_IN_SET.
Идентично что кэш что это. Сохранил в папку data можно ведь в любую.
 
@Gameer, кэш отличается от этого хотя бы тем, что он будет очищен при добавлении новой статьи (нужно запихивать в категорию news - не помню точно как очистка сейчас работает) )) А твоё решение будет пожизненно показывать одни и те же статьи, а новые видеть не будет ;)

Выбрать все id - это как раз простой запрос, который будет выполнен быстро. Вот перемешивание - немного потребует времени, ну да не важно - это уже PHP работать будет.

А вот использование FIND_IN_SET - весьма прожорливая функция и медленная.

P.s. ни в коем разе не критикую, я б про FIND_IN_SET и не вспомнил бы, так что респект за знания
 
@Gameer, кэш отличается от этого хотя бы тем, что он будет очищен при добавлении новой статьи (нужно запихивать в категорию news - не помню точно как очистка сейчас работает) )) А твоё решение будет пожизненно показывать одни и те же статьи, а новые видеть не будет ;)

Выбрать все id - это как раз простой запрос, который будет выполнен быстро. Вот перемешивание - немного потребует времени, ну да не важно - это уже PHP работать будет.

А вот использование FIND_IN_SET - весьма прожорливая функция и медленная.

P.s. ни в коем разе не критикую, я б про FIND_IN_SET и не вспомнил бы, так что респект за знания
Нужно что бы префикс у файла был news тогда будет автоочистка. Запрос то простой, а что если новостей 20к и хостинг за 35 рублей... а еще и с другими вот запросами в этом коде. Много нюансов есть, так что. Вот этот код будет уже более менее :
PHP:
if (file_exists(ENGINE_DIR . "/cache/news_id.tmp"))
{
    $news_id = file_get_contents(ENGINE_DIR . "/cache/news_id.tmp");
    $sql_id = "ORDER BY FIND_IN_SET(p.id,'".str_replace("','",$db->safesql($news_id))."')";
}
else
{
    $rand_sql = $db->query("SELECT id FROM " . PREFIX . "_post WHERE approve=1");
    $arr_id = array();
    while( $row_rand = $db->get_row($rand_sql) )
        $arr_id[] = intval($row_rand["arr_id"]);
    shuffle($arr_id);
    $arr_id_str = implode(",",$arr_id);
    unset($arr_id);
   
    $handler = fopen(ENGINE_DIR . '/cache/news_id.tmp', "w");
    fwrite($handler, $arr_id_str);
    fclose($handler);
    $sql_id = "ORDER BY FIND_IN_SET(p.id,'".str_replace("','",$db->safesql($arr_id_str))."')";
}
 
deftones2, ты как предлагаешь сделать рандом, который каждый раз одинаковый?

Ты мне чисто словами опиши как сервер после обновления страницы должен повторить предыдущий рандом - я тебе реализую... Мне просто поржать над методом хочется...

Ну как, перемешать один раз, а потом чтобы было стабильно.

Нужно что бы префикс у файла был news тогда будет автоочистка. Запрос то простой, а что если новостей 20к и хостинг за 35 рублей... а еще и с другими вот запросами в этом коде. Много нюансов есть, так что. Вот этот код будет уже более менее :
PHP:
if (file_exists(ENGINE_DIR . "/cache/news_id.tmp"))
{
    $news_id = file_get_contents(ENGINE_DIR . "/cache/news_id.tmp");
    $sql_id = "ORDER BY FIND_IN_SET(p.id,'".str_replace("','",$db->safesql($news_id))."')";
}
else
{
    $rand_sql = $db->query("SELECT id FROM " . PREFIX . "_post WHERE approve=1");
    $arr_id = array();
    while( $row_rand = $db->get_row($rand_sql) )
        $arr_id[] = intval($row_rand["arr_id"]);
    shuffle($arr_id);
    $arr_id_str = implode(",",$arr_id);
    unset($arr_id);
  
    $handler = fopen(ENGINE_DIR . '/cache/news_id.tmp', "w");
    fwrite($handler, $arr_id_str);
    fclose($handler);
    $sql_id = "ORDER BY FIND_IN_SET(p.id,'".str_replace("','",$db->safesql($arr_id_str))."')";
}

Куда запихать данный файл, и с каким расширением ?

На сайте как раз 20к новостей, и первый тариф VPS от рег.ру ))

Файл не открываеться, точнее открываеться только для чтения. Я положил в корень сайта с расширением php.

Что в код нужно добавить ?
 
Последнее редактирование модератором:
ТС я правильно тебя понял? Ты сграбил откуда-то 20к новостей. Теперь тебе нужно перемещать их и выложить на сайт. И больше перемешивать не нужно?

P.S. Не понятно только для чего это.
 
ТС я правильно тебя понял? Ты сграбил откуда-то 20к новостей. Теперь тебе нужно перемещать их и выложить на сайт. И больше перемешивать не нужно?

P.S. Не понятно только для чего это.

Возможно я неправильно выразился, но изначально мне это и надо было.

Если кому интересно вот код для перемешивания новостей в DLE:

PHP:
<?php
set_time_limit(0);

class db {}
require_once('engine/data/dbconfig.php');

if  (!mysql_connect(DBHOST,DBUSER, DBPASS) || !mysql_select_db(DBNAME))  trigger_error('Can not connect to database',E_USER_ERROR);

$query="SELECT * FROM `".PREFIX."_post`";
$result = mysql_query($query) or trigger_error('SQL: Query error at line '.__LINE__,E_USER_ERROR);

if (mysql_num_rows($result)>0) while ($row = mysql_fetch_assoc($result)) {
   if (file_exists('stop.txt')) die('Cancel by the user!');
   $query="UPDATE `".PREFIX."_post` SET `date`= DATE_ADD(FROM_DAYS( FLOOR( TO_DAYS( NOW( )) +  ( RAND( ) * 1 ) -  ( RAND( ) *730 ) ) ), INTERVAL  (FLOOR(RAND()*86400)) SECOND)  WHERE `id`=".intval($row['id']);
   mysql_query($query) or trigger_error('SQL: Query error at line '.__LINE__,E_USER_ERROR);
}

echo 'Complete';

?>

Кидаем в корень, ставим расширение PHP и запускаем.

Также можно разделить новости если сервер не позволяет:
PHP:
$query="SELECT * FROM `".PREFIX."_post`";

изменить на
PHP:
$query="SELECT * FROM `".PREFIX."_post` WHERE `id`>=1 AND `id`<=1000";
// .. И т.д
 
Последнее редактирование:
Код:
 $query="UPDATE `".PREFIX."_post` SET `date`= DATE_ADD(FROM_DAYS( FLOOR( TO_DAYS( NOW( )) +  ( RAND( ) * 1 ) -  ( RAND( ) *730 ) ) ), INTERVAL  (FLOOR(RAND()*86400)) SECOND)  WHERE `id`=".intval($row['id']);
Я б за такой SQL руки бы выдрал, даже в жопу б не засовывал... Оптимизаторы...
Вы БД зачем насилуете? Генерация произвольного числа хорошо работает в PHP, она же генерирует не плохо даты... Вы за что MySQL так ненавидите, что смерти желаете?
 
Код:
 $query="UPDATE `".PREFIX."_post` SET `date`= DATE_ADD(FROM_DAYS( FLOOR( TO_DAYS( NOW( )) +  ( RAND( ) * 1 ) -  ( RAND( ) *730 ) ) ), INTERVAL  (FLOOR(RAND()*86400)) SECOND)  WHERE `id`=".intval($row['id']);
Я б за такой SQL руки бы выдрал, даже в жопу б не засовывал... Оптимизаторы...
Вы БД зачем насилуете? Генерация произвольного числа хорошо работает в PHP, она же генерирует не плохо даты... Вы за что MySQL так ненавидите, что смерти желаете?
ТРИ РАНДОМА!!! КАРЛ ТРИ РАНДОМА!!!!! ДОБАВЛЕНИЕ ДАТЫ!!!
 
ТРИ РАНДОМА!!! КАРЛ ТРИ РАНДОМА!!!!! ДОБАВЛЕНИЕ ДАТЫ!!!
Ты забыл на 20 тысяч строк умножить :) 60 тысяч рандомов... В 1 запросе на изменение Который разделён на 20 сессий UPDATE...
 
Назад
Сверху