K
K
Kornely2021-11-20 14:09:24
PHP
Kornely, 2021-11-20 14:09:24

How to make sure that those who do not fit the condition do not score the limit?

There is this code:

$database->setQuery("
    SELECT блаблабла
    LEFT блаблабла
    WHERE блаблабла
    ORDER блаблабла
limit 0,2");

блаблабла

while($row = mysql_fetch_assoc($request)) {	
  if (file_exists('/www/ПУТЬ/'.$row['id'].'_100.jpg')) echo 'BODY';
}


That is, if there is a picture '.$row['id'].'_100.jpg there should be two iterations (limit 0,2) with BODY.

This is what happens if the first two iterations have pictures.

But the problem is that if the first iteration does not find the corresponding picture, but, for example, the second one does, then only one BODY is shown. If it's the other way around, it's the same. And if the first two iterations have no pictures at all, then nothing is shown at all.

How can I make sure that iterations that do not have pictures are simply skipped? And always the output was with two BODY (which have pictures).

Thanks in advance for the answers of the pros!

Answer the question

In order to leave comments, you need to log in

2 answer(s)
A
alexalexes, 2021-11-20
@alexalexes

Option A:
You cannot guarantee that any image file that you store in the database will be physically available at any time.
You will have to knock on the database an indefinite number of times and test each entry about the file, whether it physically exists. During the test, we form a list of dead and live files. After testing the required number of live files, you can make a final request based on the list of dead files.

$need_count = 10;  // сколько требуется файлов для выборки
$alive_count  = 0;  // сколько живых файлов
$is_need_repeat = true; // требуется повторить попытку получить живые файлы
$death_list = []; // сюда накапливаем список id мертвых файлов
$alive_list = []; // сюда накапливаем список id живых файлов
while($is_need_repeat) // Если можно делать итерационную попытку и пока не набрали нужное количество живых файлов
{
// Этот запрос, чтобы прощупать целостность файлов, достаточно получить только те атрибуты, которые позволяют проверить его путь и запомнить id.
$database->setQuery("
    SELECT id
    from блаблабла
    WHERE блаблабла 
               ".(count($depth_list) > 0 ? : ' and id not in ('.join(',',$death_list).') ' : '')." -- отсеиваем мертвые файлы из запроса, они нам не нужны
               ".(count($alive_list) > 0 ? : ' and id not in ('.join(',',$alive_list).') ' : '')." -- отсеиваем живые файлы из запроса, мы их уже проверяли
    ORDER блаблабла
limit 0,".($need_count - $alive_count)); // делаем лимит по оптимистичному сценарию, как будто можем получить список файлов, и все они будут живые, но только то кол-во, которое недостает
while($row = mysql_fetch_assoc($request))
{
  if(file_exists('/www/ПУТЬ/'.$row['id'].'_100.jpg'))
  {
    $alive_list[] = $row['id']; // файл живой, заносим его id в список
  }
  else
  {
    $death_list[] = $row['id']; // файл мертвый, заносим его id в список
  }
  $curr_alive_count = count($alive_list);
  $is_need_repeat = $curr_alive_count > 0 && $curr_alive_count > $alive_count && $curr_alive_count < $need_count; // необходимо продолжить попытки, если на текущей итерации получили хоть один живой файл, живых файлов на этой итерации оказалось больше, чем на предыдущей, и их кол-во не достаточно до необходимого
  $alive_count = $curr_alive_count; // вписываем кол-во живых файлов на текущей итерации для проверки в будущем цикле (чтобы сравнить результаты двух циклов)
}
}
// теперь можно сделать нормальный запрос, исключив мертвые файлы:
$database->setQuery("
    SELECT *
    from блаблабла
    WHERE блаблабла 
               ".(count($depth_list) > 0 ? : ' and id not in ('.join(',',$death_list).') ' : '')." -- отсеиваем мертвые файлы из запроса
    ORDER блаблабла
limit 0,".$need_count);

Option B.
You can ensure that you control the integrity of the files.
Then make an is_del column in the image table. When you delete a file, you must mark the file entry in the database as deleted by this attribute.
If you still partially control the integrity, then in a certain period of time (for example, run the cron script once an hour, day) you need to go through the entire list of files in the database and check the integrity of each file, and enter the current is_del label.
Then getting live files will be a little easier:
$database->setQuery("
    SELECT *
    from блаблабла
    WHERE блаблабла 
           and is_del is null -- или нулю, в зависимости, что будет по умолчанию
    ORDER блаблабла
limit 0,".$need_count);

T
ThunderCat, 2021-11-20
@ThunderCat

$string = '';
while($row = mysql_fetch_assoc($request)) {
  if (file_exists('/www/ПУТЬ/'.$row['id'].'_100.jpg')) 
  {
     $string .= 'BODY';
  }
  else 
  {
     $string = '';
     break;
  }
}
echo $string;

In general, if you do not control the presence of images, then somewhere something went wrong ...

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question