Как сделать автоматическую загрузку картинки из списка?

Dima83

Новичок
С помощью ajax, при нажатии кнопки происходит загрузка фото. В каждой статье много картинок, фото выбирается из статьи случайным образом.

Картинка будет использоваться как “превью” к статье.

Для выбора картинки сначала статью следует распарсить для этого я использую библиотеку simple_html_dom.php.

Случайная картинка загружается с помощь.

PHP:
file_put_contents($path, file_get_contents($url));
Сейчас для загрузки картинки я использую в списке кнопку. При нажатии на кнопке картинка загружается и список вывода сокращается.

Как сделать так, чтобы загрузка картинки происходила автоматически по порядку (по списку) с помощью setInterval (без нажатии на кнопке)?

Например загрузки картинки завершилось и вывелось сообщение в ajax “Выполнено”, потом начался процесс следующей картинки. Вот пример возвращаемого результата
1603
Мой код, сохранение картинки при нажатии кнопки.

Главный файл index.php
PHP:
<script src="https://mysite5.su/js/jquery-1.9.1.js"></script>
<link rel="StyleSheet" type="text/css" href="style.css">
<div id="message"></div>
<div id="loader"></div>

<script language='JavaScript1.1' type='text/javascript'>
<!--
//Сохранение картинки
$(document).on('click','button.btn', function(event){
    
    event.preventDefault();
    str = $(this).attr("id");
    
    arr = str.split("_");
    
    id = arr[1];
    
    
    
    
    let btn = document.querySelector("#"+str);
    btn.setAttribute('disabled', true);
    
    $.ajax({
                    type: "POST",
                    url: "/action.php",
                    data: "action=save_file&id="+id,
                    dataType: 'json',
                    success: function(response)
                    {
                      if(response.result=="success")
                      {
                       //Результат выполнен
                       console.log(response.html_content);
                       document.getElementById("message").innerHTML = response.err1;
                       showMessage();
                      }
                    }
        })

});
//Вывод списка с помощью ajax
  function showMessage()
  {
 
    $.ajax({
                    type: "POST",
                    url: "/action.php",
                    data: "action=view_all",
                    dataType: 'json',
                    success: function(response)
                    {
                    
                     if(response.result=="success")
                     {
                document.getElementById("loader").innerHTML = response.html_content
                     }
                    
                    
                    
              }
     });
  }
 
showMessage();

</script>
Ссылка на файл ajax - action.php
PHP:
<?php
include "config.php";
include('simple_html_dom.php'); // подключаем библиотеку

 
 
  if($_POST["action"]=="save_file")
  {
    $id = $_POST["id"];
    
  
    
    $err1 = "";
  
    $date1 = date("d-m-Y");
    
    $fullpath = "./images/".$date1;

    if( !is_dir( $fullpath ) ) {

          mkdir( $fullpath, 0777 );
          chmod( $fullpath, 0777 );
    }
  
    
    
     try
     {
         $query = "SELECT * FROM smallposts WHERE id=".$id;
         $stmt = $dbh->prepare($query);
         $stmt->execute();
                  
     }
       catch (\PDOException $e) {
                      echo "Обнаружена ошибка. Напишите администратору. $email<br>"; 
                            file_put_contents('PDOErrors.txt', $e->getMessage(), FILE_APPEND);
    }
     $item = $stmt->fetch(PDO::FETCH_ASSOC);
     $id = $item["id"];
    
if($item["icon"]!='')
{   
      $html = str_get_html($item["icon"]);
      
      $tmp = [];
      foreach($html->find('a') as $key=>$element){
          $tmp[$key]["big"] = $element->href;
      }

      $path = $item["preview"];
      if(!file_exists($path))
      {   
            $rand_keys = array_rand($tmp, 1);

            $url = $tmp[$rand_keys]["big"];


            $path = $fullpath.'/'.time().".jpg";


            file_put_contents($path, file_get_contents($url));


             try {
                    $query = "UPDATE smallposts SET preview=:review WHERE id=:id_position";
                    $stmt = $dbh->prepare($query);
                    $stmt->bindValue(':review', $path);
                    $stmt->bindValue(':id_position', $id);
                    $stmt->execute();
             }
            catch(PDOException $e) {
                                    echo "Обнаружена ошибка. Напишите администратору. $email<br>"; 
                                    file_put_contents('PDOErrors.txt', $e->getMessage(), FILE_APPEND);
            }
            
           $mess = "Выполнено";
       }
       else
       {
        $mess = "Файл существует";
       }
}
else
{
  $err1 = "Файлы отсутсвуют";

}
 
  echo json_encode(array(
            'result'     => 'success',
            'html_content' => $mess,
            'err1' => $err1
      ));
 
}
 
  if($_POST["action"]=="view_all")
  {
      try {
         $query = "SELECT * FROM smallposts WHERE preview=''";
         $STH = $dbh->prepare($query);
         $STH->execute();
        
        }
        catch(PDOException $e) {
          echo "6 Обнаружена ошибка. Напишите администратору. $email<br>"; 
          file_put_contents('PDOErrors.txt', $e->getMessage(), FILE_APPEND);
        }
       $news = $STH->fetchAll();
      
         $messData = array();
        
         foreach($news as $n)
         {
            $messData[] = $n;
            
            
          
        
         }
        
         $html = "<table width=\"100%\" class=\"table\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\">
              <tbody><tr class=\"header\" align=\"center\">
                <td width=\"150\">Описание</td>
                <td width=\"100\">Действия</td>
              </tr>";
         foreach($messData as $message)
         {
          $html .= "<tr><td>".$message["text"]."</td>
                <td>
                  <button id=\"id_".$message["id"]."\" class=\"btn\">Добавить фото</button><br>
                </td>
             </tr>";
         }
         $html .="</tbody></table>";
         echo json_encode(array(
            'result'     => 'success',
            'html_content' => $html
         ));
  }

?>
 

WMix

герр M:)ller
Партнер клуба
Как сделать так, чтобы загрузка картинки происходила автоматически по порядку (по списку) с помощью setInterval (без нажатии на кнопке)?
не понимаю зачем тебе setInterval, ajax, js и html.
по списку ходят с помощью foreach

PHP:
// достали список
$news = $STH->fetchAll();
foreach($news as $item){
  if($item["icon"]!=''){
    $html = str_get_html($item["icon"]);
    // все остальное
  }
 }
 

Dima83

Новичок
не понимаю зачем тебе setInterval, ajax, js и html.
по списку ходят с помощью foreach
У меня не слишком быстрый интернет и приходится ждать когда картинка загрузиться через сеть. setInterval, это гарантия того что картинка загрузиться, поэтому мне нужно сделать через setInterval, ajax и php.
 

WMix

герр M:)ller
Партнер клуба
это не причем, я спрашиваю зачем тебе веб скрипт, если можно написать консольный?
зачем php/js/html если можно только php.
задача по сути просто обновить БД
 

Dima83

Новичок
Там не просто обновление БД, там загрузка картинок, я все написал в первом сообщении. Вот строка которая сохраняет картинки. Поэтому и нужен ajax.
Код:
file_put_contents($path, file_get_contents($url));
 

ksnk

прохожий
Вот обрати внимание. Кто-то, вероятно ты, расставляет в статье, напротив картинок, специальные кнопки с ID картинок. Тоесть работа по разметке статьи, насчет потенциальных логотипчиков, уже сделана. Кто это делает и почему бы этому кому-то не поставить логотип сразу ?

В любом случае - открыть статью по адресу, смотри в описании simple_html_dom. Найти элементы 'button.btn' - функция find, дальше выбираешь случайный (нужен же случайный ?) элемент их этого списка и смотришь его ID, вытаскивашь (find) по ID картинку и получаешь то, что нужно. А дальше уже все написано.
Код этот должен срабатывать в том и только в том случае, если логотипа у статьи еще нет. Если логотип статьи уже есть - должен работать старый механизм с ручным выбором логотипа, чтобы по надобности откорректировать случайную глупость случайного выбора.

Все нужные функции и работу с ними видно на примерах в любом описаниии simple_dom_html.
 

WMix

герр M:)ller
Партнер клуба
Там не просто обновление БД, там загрузка картинок, я все написал в первом сообщении. Вот строка которая сохраняет картинки. Поэтому и нужен ajax.
Код:
file_put_contents($path, file_get_contents($url));
я отлично понял что ты делаешь, ты вероятно просто не понимаешь, что значит консольный скрипт, что для таких манипуляций (пройти по списку, и что-то сделать) веб обычно не пишут.


представь команду
Код:
$ php download_images.php
и для этого не нужен browser

картинка не совсем удачная, но консоль и php
 

Dima83

Новичок
Не вижу смысл использовать докер для php, потому что у меня уже написан скрипт. Ладно разберусь сам. Добавлю setInterval и в базу данных поле флаг который после выгрузки одной картинки будет принимать "1" и получать последнюю запись с помощью ORDER by LIMIT 1 где флаг "0", использую также (DESC|ASC) для сортировки чтобы взять последнюю запись.
 

WMix

герр M:)ller
Партнер клуба
то что показал? это на коленке написано, очень просто и понятно, меняется также на коленке за пол часа

я не про докер, но хотя если размышлять, не вижу смысла себе на систему ставить php или node или python или, или, или...
имея докер я напишу docker run -it -.rm php бла бла и система чистая и любой язык или база...

про консоль
 

Dima83

Новичок
Наверное буду использовать докер, для выгрузки картинок. Опыт уже имеется. Я выгружал картинки используя python с одного сайта. Только здесь потребуется подключиться к базе данных. Не подскажите случайно как подключиться к базе данных mysql через python?
 
Сверху