Sortare articole după cele mai vechi

Vreau ca articolele să fie sortate întotdeauna după cea mai veche data:

$articole = $pdo->query("select * from articole where date < date_sub(now(), interval 5 minute) order by date limit 20");
foreach ($articole as $row) {
  $rss = @simplexml_load_file('https://localhost.com?id='.$row['vid']);
  $canal = $row['id'];
  $pdo->prepare('update articole set date = now() where vid=?')->execute([$canal]);

  $i = 1;
  if (isset($rss->content)): 
    foreach ($rss->content as $item) {
      $id = explode(':',$item->id);
      $id = $id[2];
      echo $id . PHP_EOL;
      adaugare($id);
      usleep(100000);
      if ($i++ == 3) break;
    } 
  else: 
    echo 'nu exista...'. PHP_EOL;
  endif;
}

Am făcut acest cod doar că imediat după ce toate articolele sunt actualizate, nu-mi mai apare nimic…

select * from articole where date < date_sub(now(), interval 5 minute)
order by date asc limit 20 

Poate merge.

Am încercat si așa. Ideea este că eu vreau să ofer posibilitatea tuturor articolelor să fie verificate pe rând în ordine după dată sau ceva, accesând un fișier prin cronjob la fiecare 5 minute. Am făcut și un cod cu order by rand() dar în acest fel le preia cum vrea el sau chiar dublicat…

Ai rand(). De aia le ia cum vrea el.
https://dev.mysql.com/doc/refman/8.0/en/mathematical-functions.html#function_rand

Vezi daca iti merge si cu un group by dupa o coloana(date sau alt ceva) si vezi ce iti rezulta.

Asta daca inteleg bine.

Spor!

Nu prea am după ce să mă iau, doar date este o soluție.

Creaza un o coloana in db cu is_checked tinyint(1) default 0 si adauga in query where is_checked=0 order by id desc. La update, update is_checked=1

1 Like

Da, ar fi și asta o idee dar după ce sunt toate articolele verificate și actualizate cu is_checked=1 cum aș mai putea să le mai reverific? Pentru că eu vreau să fac asta odată la 5 minute cu toate, apoi s-o ia de la capăt și tot așa

Cand ajunge la final, update articole set is_checked=0 si ciclul se reia

1 Like

Da, am reușit să fac așa cum ai spus tu.

$articole = $pdo->query("select * from articole where isk = 0 order by date limit 100");

if (!$articole->fetch()):
  $pdo->prepare('update articole set isk = 0')->execute();
  echo 'resetare...';
  exit;
endif;

foreach ($articole as $row) {
  $rss = @simplexml_load_file('https://url.com?vid='.$row['vid']);
  $pdo->prepare('update articole set isk = 1 where vid=?')->execute([$row['vid']]);
  if (isset($rss->content)): 
    // cod
  else: 
    echo 'nu exista...'. PHP_EOL;
  endif;
}

Am doua intrebari.

De ce preiei datele in PHP si nu faci update direct in baza de date? Din codul adaugat aici nu prea vad un motiv pentru care trebuie sa le preiei.
Ce precizie are acea coloana de date? Nu stiu ce faci cu datele respective insa este foarte posibil sa ramai cu inregistrari care vor avea acelasi moment iar ordonarea sa se faca ulterior si dupa alte criterii.

M-as folosi de o procedura direct din baza de date, as folosi o pricizie mai mare la data si as tine cont si de ultima rulare a procesului de update.

le: evident fara acea coloana suplimentara.

Eu nu am inteles nimic din povestea asta… Articolele introduse in baza de date sunt oricum in ordine de la cel mai vechi la cel mai nou. Daca vrei sa le vezi in ordinea modificarii lor (daca acest lucru se intampla) cred ca niste campuri created si modified sunt absolut suficiente. In plus faptul ca executi ceva la 5 minute pe baza de date poate crea inconsistente. Nu mi se pare corecta nici bucla aia in care faci o oarecare adugare cu delay dupa…

1 Like