Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Неверный результат после проверки файлов на существование
 
 автор: TetRiska   (12.05.2011 в 12:46)   письмо автору
 
 

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

Метод у меня такой:
- делаем выборку рандомно
$sql = "
            SELECT a.`em_".$part."_name`,
                   a.`em_".$part."_url`,
                   a.`em_".$part."_image_sm`,
                   a.`em_".$part."_price_ua`,
                   a.`em_".$part."_price_us`,
                   a.`em_".$part."_price_eu`
                   ".($type != 'thiscompany' ? ', b.`em_company_profile_url`' : '')."
            FROM `em_".$part."` a
            ".($type != 'thiscompany' ? "JOIN `em_company` b ON (b.`em_company_id` = a.`em_company_id` AND b.`em_company_access` = 'y' AND b.`em_company_deleted` = 'n')" : '')."
            WHERE ".($type == 'thiscompany' ? 'a.`em_company_id` = '.$company_id : 'a.`em_company_id` != '.$company_id)."
            AND a.`em_".$part."_".($part == 'action' ? 'subcategory' : 'group')."` = ".$pp_group."
            ".($type == 'thiscompany' ? 'AND a.`em_'.$part.'_id` != '.$pp_id : '')."
            AND a.`em_".$part."_image_sm` != ''
            AND a.`em_".$part."_access` = 'y'
            AND a.`em_".$part."_deleted` = 'n'
            ORDER BY RAND()
            LIMIT ".$limit."
            ";
    $outres = select_query($sql);

Всего записей 400 с лишним, те что с картинками на сервере 118...лимит у меня на 100, т.е. мне выбрать должно 100 записей, что и происходит - на этом этапе все окей
- делаю проверку на существование файлов в каталоге сайта
if($outres['count'] != 0){    
        $m=0;
        for($l=0;$l<$outres['count'];$l++){
            if(file_exists($_SERVER['DOCUMENT_ROOT'].'/'.$outres['result']['em_'.$part.'_image_sm'][$l])){
                $m++;
                foreach ($outres['result'] as $key => $val){
                    $res['result'][$key][] = $val[$l];
                }
            }
        }
        $res['count'] = $m;
    }

Тут же получается, имеем разное количество записей на выходе...Хз почему. Если убрать ф-цию проверки на существование файлов, результат верен или же если убрать в запросе выборку случайных записей и оставить проверку на существование, то все окей. Единственное на что я бы грешил это кол. файлов в папке, где файлы лежат, их примерно 10 тищ. ((( Получается, что скрипт не успевает все проверить из-за большого кол. файлов в папке...

Прошу помощи.

  Ответить  
 
 автор: cheops   (12.05.2011 в 12:53)   письмо автору
 
   для: TetRiska   (12.05.2011 в 12:46)
 

>Получается, что скрипт не успевает все проверить из-за большого кол. файлов в папке...
1. А он сообщает о то, что закончилось время, отведенное скрипту на проверку?

2. Какова структура массива $outres?

  Ответить  
 
 автор: TetRiska   (12.05.2011 в 13:01)   письмо автору
 
   для: cheops   (12.05.2011 в 12:53)
 

1. нет ничего не сообщает, просто возвращает результат каждый раз по разному
2. привожу с ограничением в 1, а то сотня многовато данных будет :)
Array (
  [count] => 1
  [result] => Array ( 
    [em_produce_name] => Array ( 
      [0] => Шлем с козырьком )
      [em_produce_url] => Array (
      [0] => )
    [em_produce_image_sm] => Array ( 
      [0] => files/companies/produces/s_8ff66a2e0efc467ca2d33a3274d23cc6.jpg ) 
    [em_produce_price_ua] => Array (
      [0] => 456546.00 ) 
    [em_produce_price_us] => Array (
      [0] => 0.00 )
    [em_produce_price_eu] => Array (
      [0] => 0.00 ) ) ) 

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

  Ответить  
 
 автор: cheops   (12.05.2011 в 13:06)   письмо автору
 
   для: TetRiska   (12.05.2011 в 13:01)
 

А зачем вам в запросе ORDER BY RAND()? Если его убрать, что происходит?

  Ответить  
 
 автор: TetRiska   (12.05.2011 в 13:10)   письмо автору
 
   для: cheops   (12.05.2011 в 13:06)
 

мне нужно в произвольном порядке выбрать данные, если его убрать, то выводит 100 записей как и надо с верной проверкой на существование файлов

  Ответить  
 
 автор: TetRiska   (12.05.2011 в 15:42)   письмо автору
 
   для: TetRiska   (12.05.2011 в 13:10)
 

есть ли решение проблемы?

  Ответить  
 
 автор: Lotanaen   (12.05.2011 в 16:51)   письмо автору
 
   для: TetRiska   (12.05.2011 в 15:42)
 

а функция select_query() как работает? возможно ключи массива там не по порядку формируются поэтому и в цикле не все обрабатывается...

  Ответить  
 
 автор: TetRiska   (12.05.2011 в 17:38)   письмо автору
 
   для: Lotanaen   (12.05.2011 в 16:51)
 

function select_query($sql){
    $out = array('count' => 0, 'result' => '');
    $res = mysql_query($sql);
    $out['count'] = mysql_num_rows($res);
    if ($out['count'] != 0){
        while ($row = mysql_fetch_array($res, MYSQL_ASSOC)){    
            foreach ($row as $key => $val){
                if(!isset($out['result'][$key])){
                    $out['result'][$key] = array();
                }
                $out['result'][$key][] = iconv("windows-1251","utf-8",$val);
            }    
        }
    }
    return $out;
}

  Ответить  
 
 автор: Lotanaen   (12.05.2011 в 17:59)   письмо автору
 
   для: TetRiska   (12.05.2011 в 17:38)
 

а если так попробовать:

function select_query($sql){
    $out = array('count' => 0, 'result' => '');
    $res = mysql_query($sql);
    $out['count'] = mysql_num_rows($res);
    if ($out['count'] != 0){
       $i=0;
         while ($row = mysql_fetch_array($res, MYSQL_ASSOC)){    
            foreach ($row as $key => $val){
                if(!isset($out['result'][$key])){
                    $out['result'][$key] = array();
                }
                $out['result'][$key][$i] = iconv("windows-1251","utf-8",$val);
            } 
            $i++; 
        }
    }
    return $out;
}

  Ответить  
 
 автор: TetRiska   (12.05.2011 в 18:27)   письмо автору
 
   для: Lotanaen   (12.05.2011 в 17:59)
 

без изменений...

  Ответить  
 
 автор: Lotanaen   (13.05.2011 в 10:31)   письмо автору
 
   для: TetRiska   (12.05.2011 в 12:46)
 

попробуйте так:

if($outres['count'] != 0){    
        $m=0;
        $mm=0;
        for($l=0;$l<$outres['count'];$l++){
            if(file_exists($_SERVER['DOCUMENT_ROOT'].'/'.$outres['result']['em_'.$part.'_image_sm'][$l])){
                $m++;
                foreach ($outres['result'] as $key => $val){
                    $res['result'][$key][] = $val[$l];
                }
            }
            else{
               $mm++; 
               foreach ($outres['result'] as $key => $val){
                    $res2['result'][$key][] = $val[$l];
                }
            }
        }
        $res['count'] = $m;
       $res2['count'] = $mm;
    }


и посмотрите что будет в массиве $res2

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования